# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1277306066 -10800 # Node ID dcbddbbaf8fd45f7bc6c662ed7ac89fa1da9012f # Parent d9b6a8729acde65f674fcd9be033475b1c41a8b3 Revision: 201023 Kit: 2010125 diff -r d9b6a8729acd -r dcbddbbaf8fd layers.sysdef.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/layers.sysdef.xml Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,21 @@ + + +]> + + + + + + + + + + + + + + + + + \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd lcvtplugin.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lcvtplugin.pkg Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,16 @@ +; Languages +; +&EN + +; Header +#{"lcvtplugin patch"}, (0xF0112235), 1, 0, 0, TYPE=PU + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + +;Files +"\epoc32\release\armv5\udeb\lcvtengineplugin.dll" - "!:\sys\bin\lcvtengineplugin.dll" +"\epoc32\data\Z\Resource\Plugins\lcvtengineplugin.RSC"-"!:\resource\plugins\lcvtengineplugin.RSC" diff -r d9b6a8729acd -r dcbddbbaf8fd sysdef_1_5_1.dtd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysdef_1_5_1.dtd Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d9b6a8729acd -r dcbddbbaf8fd videosource.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videosource.pkg Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,29 @@ +; +; Copyright (c) 2009 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: +; +; Languages +&EN + +; Header +#{"videosource"}, (0x101F8692), 1, 0, 0, TYPE=PU + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + +;Files +"\epoc32\release\armv5\udeb\videosource.dll" - "!:\sys\bin\videosource.dll" diff -r d9b6a8729acd -r dcbddbbaf8fd videoteleng.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videoteleng.pkg Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,17 @@ +; Languages +; +&EN + +; Header +#{"videoteleng patch"}, (0x101F867F), 1, 0, 0, TYPE=PU + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + +;Files +"\epoc32\release\armv5\udeb\videoteleng.dll" - "!:\sys\bin\videoteleng.dll" +"\epoc32\release\armv5\urel\cscallctrl.dll" - "!:\sys\bin\cscallctrl.dll" +"\epoc32\release\armv5\urel\vtlogger.dll" - "!:\sys\bin\vtlogger.dll" diff -r d9b6a8729acd -r dcbddbbaf8fd videotelephony.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videotelephony.pro Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,30 @@ +# Copyright (c) 2009 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: +# +# + +TEMPLATE = subdirs +CONFIG += ordered + +symbian: { + + :BLD_INF_RULES.prj_mmpfiles += $$LITERAL_HASH"include \"packetvideoengine/group/bld.inf\"" + :BLD_INF_RULES.prj_mmpfiles += $$LITERAL_HASH"include \"vtprotocols/group/bld.inf\"" + :BLD_INF_RULES.prj_mmpfiles += $$LITERAL_HASH"include \"vtprotocolplugins/group/bld.inf\"" + :BLD_INF_RULES.prj_mmpfiles += $$LITERAL_HASH"include \"vtengines/group/bld.inf\"" + :BLD_INF_RULES.prj_mmpfiles += $$LITERAL_HASH"include \"vtuis/lcvtplugin/group/bld.inf\"" + :BLD_INF_RULES.prj_mmpfiles += $$LITERAL_HASH"include \"videotelephony_plat/group/bld.inf\"" +} + +SUBDIRS += vtuis/lcvtapp diff -r d9b6a8729acd -r dcbddbbaf8fd videotelephony_plat/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videotelephony_plat/group/bld.inf Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,21 @@ +/* +* 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: Includes all the Domain API specific bld.inf files, which +* export files. +* +*/ + + + +#include "../video_telephony_media_configuration_api/group/bld.inf" diff -r d9b6a8729acd -r dcbddbbaf8fd videotelephony_plat/video_telephony_media_configuration_api/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videotelephony_plat/video_telephony_media_configuration_api/group/bld.inf Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,27 @@ +/* +* 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 the License "Symbian Foundation License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: File that exports the files belonging to +: Video Telephony Media Configuration API +* +*/ + + +#include + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS + +../inc/VideoTelephonyDomainPSKeys.h APP_LAYER_PLATFORM_EXPORT_PATH(videotelephonydomainpskeys.h) diff -r d9b6a8729acd -r dcbddbbaf8fd videotelephony_plat/video_telephony_media_configuration_api/inc/VideoTelephonyDomainPSKeys.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videotelephony_plat/video_telephony_media_configuration_api/inc/VideoTelephonyDomainPSKeys.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,47 @@ +/* +* Copyright (c) 2007 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 Telephony Domain Publish and Subscribe keys. +* +*/ + + +#ifndef VIDEOTELEPHONYDOMAINPSKEYS_H +#define VIDEOTELEPHONYDOMAINPSKEYS_H + +#include + + +// CONSTANTS + +/** +* Media Configuration API for video telephony. +*/ +const TUid KPSUidVTMediaConfiguration = {0x1020736A}; + +/** +* Preferred camera that the application should use as source. +* @type RProperty::EInt +*/ +const TUint32 KPSPreferredCamera = 0x00000000; +enum EPSPreferredCamera + { + EPSPreferredCameraUnknown, + EPSPreferredCameraInwards, + EPSPreferredCameraOutwards + }; + + +#endif // VIDEOTELEPHONYDOMAINPSKEYS_H + +// End of file \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd videotelephony_plat/video_telephony_media_configuration_api/video_telephony_media_configuration_api.metaxml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videotelephony_plat/video_telephony_media_configuration_api/video_telephony_media_configuration_api.metaxml Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,17 @@ + + + Video Telephony Media Configuration API + An interface to access transient (run-time) media configuration related to video telephony, e.g. preferred camera in VT. + c++ + vtengines + + + + + + + + no + no + + diff -r d9b6a8729acd -r dcbddbbaf8fd videotelui.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videotelui.pkg Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,31 @@ +; +; Copyright (c) 2009 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: +; +; Languages +&EN + +; Header +#{"videotelui"}, (0x101F8681), 1, 0, 0, TYPE=PU + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + +;Files +"\epoc32\release\armv5\urel\videotelui.exe" - "!:\sys\bin\videotelui.exe" +"\epoc32\data\z\resource\apps\videotelui.rsc"-"!:\resource\apps\videotelui.rsc" +"\epoc32\data\z\private\10003a3f\import\apps\videotelui_reg.rsc"-"!:\private\10003a3f\import\apps\videotelui_reg.rsc" diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/group/bld.inf Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,27 @@ +/* +* Copyright (c) 2004 - 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: Build information for Vtengines subsystem. +* +*/ + + +PRJ_PLATFORMS +DEFAULT + +// Include components' bld.inf files +#include "../videoteleng/Group/bld.inf" +#include "../vtmediatorplugin/group/bld.inf" + + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Bmarm/VIDEOTELENGU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Bmarm/VIDEOTELENGU.DEF Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,8 @@ +EXPORTS + Audio__C11CVtEngModel @ 1 NONAME R3UNUSED ; CVtEngModel::Audio(void) const + CommandHandler__C11CVtEngModel @ 2 NONAME R3UNUSED ; CVtEngModel::CommandHandler(void) const + Extension__FRC4TUid @ 3 NONAME R3UNUSED ; Extension(TUid const &) + Media__C11CVtEngModel @ 4 NONAME R3UNUSED ; CVtEngModel::Media(void) const + NewL__11CVtEngModelR19MVtEngEventObserverR21MVtEngCommandObserver @ 5 NONAME R3UNUSED ; CVtEngModel::NewL(MVtEngEventObserver &, MVtEngCommandObserver &) + Session__C11CVtEngModel @ 6 NONAME R3UNUSED ; CVtEngModel::Session(void) const + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Bmarm/CSCALLCTRLU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Bmarm/CSCALLCTRLU.DEF Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,3 @@ +EXPORTS + CreateFactory__Fv @ 1 NONAME R3UNUSED ; CreateFactory(void) + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Bwins/CSCALLCTRLU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Bwins/CSCALLCTRLU.DEF Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,3 @@ +EXPORTS + ?CreateFactory@@YAPAVCVtCtlFactory@@XZ @ 1 NONAME ; class CVtCtlFactory * __cdecl CreateFactory(void) + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/EABI/CSCallCtrlU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/EABI/CSCallCtrlU.DEF Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,3 @@ +EXPORTS + _Z13CreateFactoryv @ 1 NONAME + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Group/bld.inf Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,31 @@ +/* +* Copyright (c) 2004 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: videocallctrl build information file. +* +*/ + + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS + +PRJ_MMPFILES +../Group/videocallctrl.mmp + +//PRJ_TESTMMPFILES +// CsCallCtrl CVT case. +//../tsrc/group/CsCallCtrl_CVT_Test.mmp + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Group/videocallctrl.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Group/videocallctrl.mmp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,61 @@ +/* +* Copyright (c) 2004 - 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: This is project specification file for the Video Call Control. +* +*/ + + +#include + +#include "../Inc/VtCtlConfig.hrh" + +// default vendor id +VENDORID VID_DEFAULT + +// Capability assignment. +CAPABILITY CAP_GENERAL_DLL + +TARGET cscallctrl.dll +TARGETTYPE dll +UID 0x1000008d 0x101F867F + +SOURCEPATH ../Src +SOURCE CVtCtlFactory.cpp +#if defined VTCALLCONTROLSTUB +// call state connected, previous state alerting +SOURCE CVtCtlCallControlStub.cpp +DOCUMENT CVtCtlCallControl.cpp +#else +SOURCE CVtCtlCallControl.cpp +DOCUMENT CVtCtlCallControlStub.cpp +#endif +SOURCE CVtCtlSessionContainer.cpp +SOURCE CVtCtlCallStatusMonitor.cpp +SOURCE CVtCtlLineMonitor.cpp +SOURCE CVtCtlVideoCall.cpp +SOURCE VtCtlPanic.cpp + +DOCUMENT ../Group/bld.inf + +USERINCLUDE ../Inc +SYSTEMINCLUDE ../../../../inc +APP_LAYER_SYSTEMINCLUDE + +LIBRARY euser.lib +LIBRARY etel.lib +LIBRARY etelmm.lib +DEBUGLIBRARY vtlogger.lib + + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Inc/CVtCtlCallControl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Inc/CVtCtlCallControl.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,137 @@ +/* +* Copyright (c) 2004 - 2007 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: Call control +* +*/ + + + +#ifndef CVTCTLCALLCONTROL_H +#define CVTCTLCALLCONTROL_H + +// INCLUDES +#include +#include "MVtCtlCallControl.h" +#include "MVtCtlCallStatusObserver.h" +#include + +// FORWARD DECLARATIONS +class MVtCtlEventObserver; +class CVtCtlSessionContainer; + +// CLASS DECLARATION + +/** +* Call control implementation. +* +* @lib CSCallCtrl.lib +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtCtlCallControl ) : + public CBase, + public MVtCtlCallControl, + public MVtCtlCallStatusObserver + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + * @param aEventObserver reference to event observer + * @param aCommandObserver reference to command observer + * @return call control + */ + static CVtCtlCallControl* NewL( + MVtCtlEventObserver& aEventObserver ); + + /** + * Destructor. + */ + virtual ~CVtCtlCallControl(); + + public: // From MVtCtlCallControl + + /** + * @see MVtCtlCallControl::GetDuration + */ + virtual TInt GetDuration( + TVtCtlSessionId aId, + TVtCtlDuration& aDuration ); + + + /** + * @see MVtCtlCallControl::GetSessionInfoL + */ + virtual void GetSessionInfoL( + TVtCtlSessionId aId, + TDes8& aInfo ); + + /** + * @see MVtCtlCallControl::GetSessionState + */ + virtual TVtCtlState GetSessionState( + TVtCtlSessionId aId ) const; + + /** + * @see MVtCtlCallControl::GetPreviousPreviousState + */ + virtual TVtCtlState GetPreviousPreviousState( + TVtCtlSessionId aId ) const; + + public: // from MVtCtlCallStatusObserver + + /** + * @see MVtCtlCallStatusObserver::HandleCallStatusChangeL + */ + virtual void HandleCallStatusChangeL( + TVtCtlSessionId aId, + MVtCtlCallControl::TVtCtlState aStatus, + MVtCtlCallControl::TVtCtlState aPreviousStatus ); + + private: + + /** + * C++ constructor. + */ + CVtCtlCallControl( + MVtCtlEventObserver& aEventObserver ); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + private: + + /** + * Validates that data passed as descriptor is of + * correct type. If not leaves KErrNotSupported. + * @param aData TVtCtlType derived class represented as descriptor + * @param aExtension expected type + */ + static void ValidateDataExtensionL( + TDesC8& aData, + TInt aExtension ); + + private: // Data + + // Event observer + MVtCtlEventObserver& iEventObserver; + + // Container for ETel sessions + CVtCtlSessionContainer* iContainer; + }; + +#endif // CVTCTLCALLCONTROL_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Inc/CVtCtlCallStatusMonitor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Inc/CVtCtlCallStatusMonitor.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,159 @@ +/* +* Copyright (c) 2004 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: Monitors call status. +* +*/ + + + +#ifndef CVTCTLCALLSTATUSMONITOR_H +#define CVTCTLCALLSTATUSMONITOR_H + +// INCLUDES + +#include "MVtCtlCallControl.h" +#include +#include + +/** +* Array for resolving call status (TMobileCallStatus) transition validity. +* Transition to lower value is not possible with exception to 0 priority +* (always possible to go to idle state). Initial state is EStatusUnknown. +*/ +static const TInt KVtCtlStatusTransitionPriorities[] = + { + 1, // EStatusUnknown + 0, // EStatusIdle, possible from any + 2, // EStatusDialling + 2, // EStatusRinging + 3, // EStatusAnswering + 3, // EStatusConnecting + 4, // EStatusConnected + 5, // EStatusDisconnecting + // Status values below are not valid in video calls => should not happen. + 5, // EStatusDisconnectingWithInband + 0, // EStatusReconnectPending + 0, // EStatusHold + 0, // EStatusWaitingAlternatingCallSwitch + 0, // EStatusTransferring + 0 // EStatusTransferAlerting + }; + +// FORWARD DECLARATIONS +class MVtCtlCallStatusObserver; + +// CLASS DECLARATION + +/** +* Monitor for call status +* +* @lib CSCallCtrl +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtCtlCallStatusMonitor ) : public CActive + { + public: // Constructors and destructor + + /** + * C++ constructor. + * @param aCall call subsession + * @param aObserver call status observer + */ + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + CVtCtlCallStatusMonitor( + RMobileCall& aCall, + MVtCtlCallStatusObserver& aObserver ); + + /** + * Destructor. + */ + virtual ~CVtCtlCallStatusMonitor(); + + public: // New functions + + /** + * Starts monitoring + */ + void Start(); + + private: // From CActive + + /** + * Cancel monitoring. + */ + virtual void DoCancel(); + + /** + * Handles call status change. + */ + virtual void RunL(); + + /** + * Handles leave in RunL. + * @param aError error code + * @return KErrNone + */ + virtual TInt RunError( TInt aError ); + + public: // New functions + + /** + * Maps Etel status to internal state + * @param aStatus mobile call status + * @return session state, see TVtCtlState + */ + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + static MVtCtlCallControl::TVtCtlState MapState( + const RMobileCall::TMobileCallStatus aStatus ); + + /** + * Checks if call state transition specified by arguments is legal. + * @param aNewState proposed new call state + * @param aCurrentState current call state + * @return ETrue if transition is valid + */ + static TBool IsLegalNewState( + const RMobileCall::TMobileCallStatus aNewState, + const RMobileCall::TMobileCallStatus aCurrentState ); + + private: // Data + + // Data call + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + RMobileCall& iCall; + + // Observer for call status changes + MVtCtlCallStatusObserver& iObserver; + + // Call status and previous status + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + RMobileCall::TMobileCallStatus iCallStatus; + RMobileCall::TMobileCallStatus iPreviousStatus; + }; + +#endif // CVTCTLCALLSTATUSMONITOR_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Inc/CVtCtlFactory.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Inc/CVtCtlFactory.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,69 @@ +/* +* Copyright (c) 2004 - 2007 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: Factory for creating call control +* +*/ + + + +#ifndef CVTCTLFACTORY_H +#define CVTCTLFACTORY_H + +// INCLUDES +#include +#include "VtCtlDefs.h" + +// CONSTANTS +_LIT( KVtCtlLibraryName, "CSCallCtrl" ); + +// FORWARD DECLARATIONS +class MVtCtlEventObserver; +class MVtCtlCommandObserver; +class MVtCtlCallControl; + +/** +* Factory class for instantiating call control. +* +* @lib CSCallCtrl +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtCtlFactory ) : public CBase + { + public: + + /** + * Instantiates call control + * @param aEventObserver + * @param aCommandObserver + * @return call control + */ + virtual MVtCtlCallControl* CreateCallControlL( + MVtCtlEventObserver& aEventObserver ); + + /** + * Destructs call control created with CreateCallControlL. + * @param aCallControl pointer to call control instance + */ + virtual void Delete( MVtCtlCallControl* aCallControl ); + }; + +/** +* Creates call control factory +* @return factory +*/ +IMPORT_C CVtCtlFactory* CreateVtCtlFactory(); + +#endif // CVTCTLFACTORY_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Inc/CVtCtlLineMonitor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Inc/CVtCtlLineMonitor.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,112 @@ +/* +* Copyright (c) 2004 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: Monitors new calls on data line. +* +*/ + + + +#ifndef CVTCTLLINEMONITOR_H +#define CVTCTLLINEMONITOR_H + +// INCLUDES +#include +#include + +// FORWARD DECLARATIONS + +class MVtCtlLineEventObserver; + +// CLASS DECLARATION + +/** +* Monitor for new calls +* +* @lib CSCallCtrl +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtCtlLineMonitor ) : public CActive + { + public: // Constructors and destructor + + /** + * C++ constructor. + * @param aLine line subsession + * @param aObserver line event observer + */ + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + CVtCtlLineMonitor( + RMobileLine& aLine, + MVtCtlLineEventObserver& aObserver); + + /** + * Destructor. + */ + virtual ~CVtCtlLineMonitor(); + + public: // New functions + + /** + * Starts monitoring + */ + void Start(); + + private: // Functions from CActive + + /** + * Cancel monitoring. + */ + virtual void DoCancel(); + + /** + * Handles new call on line. + */ + virtual void RunL(); + + /** + * Error handler for leave in RunL + * @param aError error code + * @return KErrNone + */ + virtual TInt RunError( TInt aError ); + + private: // Data + + // Data line + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + RMobileLine& iLine; + + // Observer for new calls on line + MVtCtlLineEventObserver& iObserver; + + // Call name + TName iName; + + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + RMobileCall::TMobileCallStatus iLastLineStatus; + RMobileCall::TMobileCallStatus iLineStatus; + }; + +#endif // CVTCTLLINEMONITOR_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Inc/CVtCtlSessionContainer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Inc/CVtCtlSessionContainer.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,216 @@ +/* +* Copyright (c) 2004 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: Container for ETel session and subsessions +* +*/ + + + +#ifndef CVTCTLSESSIONCONTAINER_H +#define CVTCTLSESSIONCONTAINER_H + +// INCLUDES +#include +#include +#include "MVtCtlLineEventObserver.h" +#include "MVtCtlCallStatusObserver.h" +#include "MVtCtlCallControl.h" + +// FORWARD DECLARATIONS +class CVtCtlLineMonitor; +class CVtCtlCallMonitor; +class CVtCtlVideoCall; + +// CLASS DECLARATION + +/** +* Container for ETel (sub)session(s). +* +* @lib CSCallCtrl +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtCtlSessionContainer ) : + public CBase, + public MVtCtlLineEventObserver, + public MVtCtlCallStatusObserver + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + * @param aObserver call status observer + */ + static CVtCtlSessionContainer* NewL( + MVtCtlCallStatusObserver& aObserver ); + + /** + * Destructor. + */ + virtual ~CVtCtlSessionContainer(); + + public: // MVtCtlLineEventObserver + + /** + * @see MVtCtlLineEventObserver::HandleLineEventL + */ + virtual void HandleLineEventL( + const TLineEvent aEvent, + TDesC& aCallName ); + + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + virtual void HandleLineEventL( + const TLineEvent aEvent, + const RMobileCall::TMobileCallStatus aStatus ); + + public: // MVtCtlCallStatusObserver + + /** + * @see MVtCtlLineEventObserver::HandleCallStatusChangeL + */ + virtual void HandleCallStatusChangeL( + TVtCtlSessionId aId, + MVtCtlCallControl::TVtCtlState aStatus, + MVtCtlCallControl::TVtCtlState aPreviousStatus ); + + public: // New functions + + /** + * Finds call by name. + * @param aCallName search key + * @return call or NULL if not found + */ + CVtCtlVideoCall* FindCall( TDesC& aCallName ) const; + + /** + * Finds call by session id. + * @param aId search key + * @return call or NULL if not found + */ + CVtCtlVideoCall* FindCall( TVtCtlSessionId aId ) const; + + /** + * Gets sessions. + * @param aArray sessions are returned in this + * @return number of sessions in aArray + */ + TInt GetSessions( RVtCtlSessionIdArray& aArray ) const; + + private: + + /** + * Removes call from array and deletes it. + * @param aId session id + */ + void DestructCall( TVtCtlSessionId aId ); + + /** + * Checks that call is of correct type (multimedia) + * @param aName call object + * @param aName call name + * @return ETrue if call is multimedia call + */ + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + TBool CheckCallTypeL( + RMobileCall& aCall, + const TName& aName ); + + /** + * Initializes video call object + * @param aCallName call name + * @return ETrue if call was initialized + */ + TBool InitCallL( const TName& aCallName ); + + private: + + /** + * C++ constructor. + * @param aObserver call status observer + */ + CVtCtlSessionContainer( MVtCtlCallStatusObserver& aObserver ); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + private: + + /** + * Class for maintaining session identities + */ + class TVtCtlSessionIdentities + { + public: + // c++ default constructor + TVtCtlSessionIdentities(); + + /** + * Create new session id + * @return session id + */ + TVtCtlSessionId Create(); + + /** + * Returns current session id + * @return session id + */ + TVtCtlSessionId Current() const; + + private: + // Last session id + TVtCtlSessionId iCurrentId; + }; + + private: // Data + + // ETel session + RTelServer iServer; + + // Phone session + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + RMobilePhone iPhone; + + // Data line + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + RMobileLine iLine; + + // Monitors new calls on line. + CVtCtlLineMonitor* iLineMonitor; + + // Array of ongoing video calls + RPointerArray iCalls; + + // Session id management + TVtCtlSessionIdentities iSessionIds; + + // Call status observer + MVtCtlCallStatusObserver& iObserver; + }; + +#endif // CVTCTLSESSIONCONTAINER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Inc/CVtCtlVideoCall.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Inc/CVtCtlVideoCall.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,195 @@ +/* +* Copyright (c) 2004 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 call abstraction +* +*/ + + + +#ifndef CVTCTLVIDEOCALL_H +#define CVTCTLVIDEOCALL_H + +// INCLUDES +#include +#include "MVtCtlCallControl.h" +#include "MVtCtlCallStatusObserver.h" + + +// FORWARD DECLARATIONS +class CVtCtlCallStatusMonitor; + +// CLASS DECLARATION + +/** +* Video call abstraction +* +* @lib CSCallCtrl +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtCtlVideoCall ) : + public CBase, + public MVtCtlCallStatusObserver + { + public: + + /** + * Call information + */ + struct TVtCtlCallInfo + { + // Session state + MVtCtlCallControl::TVtCtlState iStatus; + // Previous session state + MVtCtlCallControl::TVtCtlState iPreviousStatus; + // Session id + TVtCtlSessionId iId; + // Session direction + MVtCtlCallControl::TVtCtlDirection iDirection; + }; + + public: // Constructors and destructor + + /** + * Two-phased constructor. + * @param aDataLine line subsession + * @param aId session id + * @param aObserver call status observer + */ + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + static CVtCtlVideoCall* NewL( + RMobileLine& aDataLine, + TVtCtlSessionId aId, + MVtCtlCallStatusObserver& aObserver + ); + + /** + * Destructor. + */ + virtual ~CVtCtlVideoCall(); + + public: // New functions + + /** + * Returns call info + * @return reference to call info + */ + const CVtCtlVideoCall::TVtCtlCallInfo& CallInfo() const; + + /** + * Returns Etel call info + * @return call info + */ + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + const RMobileCall::TMobileCallInfoV1& MobileInfo() const; + + /** + * Opens call subsession and starts monitoring call status. + * @param aCallName call name + */ + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + void InitializeCallL( RMobileCall& aCall ); + + /** + * Updates call information from ETel + * @return Symbian OS error code + */ + TInt UpdateCallInfo(); + + /** + * Returns call duration from Etel + * @param aDuration duration + * @return Symbian OS error code + */ + TInt GetDuration( TVtCtlDuration& aDuration ); + + /** + * Obtains video call state from the server and returns it. + * @param aState updated call state + * @return Symbian OS error code + * @since S60 3.1 + */ + TInt GetCallState( MVtCtlCallControl::TVtCtlState& aState ); + + protected: // From MVtCtlCallStatusObserver + + /** + * @see MVtCtlCallStatusObserver::HandleCallStatusChangeL + */ + virtual void HandleCallStatusChangeL( + TVtCtlSessionId aId, + MVtCtlCallControl::TVtCtlState aStatus, + MVtCtlCallControl::TVtCtlState aPreviousStatus ); + + private: + + /** + * C++ constructor. + * @param aDataLine data line + * @param aId session id + * @param aObserver observer + */ + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + CVtCtlVideoCall( + RMobileLine& aDataLine, + TVtCtlSessionId aId, + MVtCtlCallStatusObserver& aObserver ); + + private: // Data + + // Call information + TVtCtlCallInfo iCallInfo; + + // Etel call + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + RMobileCall* iCall; + + // Data line + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + RMobileLine& iLine; + + // Etel call information + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + RMobileCall::TMobileCallInfoV1 iMobileCallInfo; + + // Call status monitor + CVtCtlCallStatusMonitor* iStatusMonitor; + + // Call status observer + MVtCtlCallStatusObserver& iObserver; + }; + +#endif // CVTCTLVIDEOCALL_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Inc/MVtCtlCallControl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Inc/MVtCtlCallControl.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,110 @@ +/* +* Copyright (c) 2004 - 2007 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: Call control interface +* +*/ + + + +#ifndef MVTCTLCALLCONTROL_H +#define MVTCTLCALLCONTROL_H + +// INCLUDES +#include "VtCtlDefs.h" +#include "TVtCtlType.h" + +// CLASS DECLARATION + +/** +* Call control class +* +* @lib CSCallCtrl +* @since 2.6 +*/ +class MVtCtlCallControl + { + public: // new functions + + /** + * Session state + * EIdle idle, no connection + * EInitializing initializing MO session + * EAlerting alerting at remote end + * ERinging incoming session ringing + * EConnected session is established + * EDisconnecting disconnecting session + */ + enum TVtCtlState { + EUnknown, // 0 + EIdle, // 1 + EInitializing, // 2 + EAlerting, // 3 + ERinging, // 4 + EConnected, // 5 + EDisconnecting // 6 + }; + + /** + * Session direction + * EDirectionUnknown unknown direction + * EDirectionMobileOriginated MO session + * DirectionMobileTerminated MT session + */ + enum TVtCtlDirection + { + EDirectionUnknown, + EDirectionMobileOriginated, + DirectionMobileTerminated + }; + + /** + * Gets session duration + * @param aId session id + * @param aDuration session duration + * @return Symbian OS error code + */ + virtual TInt GetDuration( + TVtCtlSessionId aId, + TVtCtlDuration& aDuration ) = 0; + + /** + * Gets information on a session. + * @param aId session id + * @param aInfo packetized object derived from TVtCtlType + */ + virtual void GetSessionInfoL( + TVtCtlSessionId aId, + TDes8& aInfo ) = 0; + + /** + * Returns session state + * @param aId session id + * @return session state + */ + virtual TVtCtlState GetSessionState( + TVtCtlSessionId aId ) const = 0; + + /** + * Returns previous session state + * @param aId session id + * @return session state + */ + virtual TVtCtlState GetPreviousPreviousState( + TVtCtlSessionId aId ) const = 0; + + }; + +#endif // MVTCTLCALLCONTROL_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Inc/MVtCtlCallStatusObserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Inc/MVtCtlCallStatusObserver.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2004 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: Call status observer interface +* +*/ + + + +#ifndef MVTCTLCALLSTATUSOBSERVER_H +#define MVTCTLCALLSTATUSOBSERVER_H + +// INCLUDES +#include "MVtCtlCallControl.h" + +// CLASS DECLARATION + +/** +* Call status observer interface +* +* @lib CSCallCtrl +* @since 2.6 +*/ +class MVtCtlCallStatusObserver + { + public: // new functions + + /** + * Handles call status change. + * @param aId session id + * @param aStatus new session status + * @param aPreviousStatus previous session status + */ + virtual void HandleCallStatusChangeL( + TVtCtlSessionId aId, + MVtCtlCallControl::TVtCtlState aStatus, + MVtCtlCallControl::TVtCtlState aPreviousStatus ) = 0; + }; + +#endif // MVTCTLCALLSTATUSOBSERVER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Inc/MVtCtlCommandObserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Inc/MVtCtlCommandObserver.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,50 @@ +/* +* Copyright (c) 2004 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: Session command observer interface +* +*/ + + + +#ifndef MVTCTLCOMMANDOBSERVER_H +#define MVTCTLCOMMANDOBSERVER_H + +// INCLUDES +#include "MVtCtlCallControl.h" + +// CLASS DECLARATION + +/** +* Session command observer interface +* +* @lib CSCallCtrl +* @since 2.6 +*/ +class MVtCtlCommandObserver + { + public: // new functions + + /** + * Handles command completion in session control. + * @param aCmd command + * @param aResult completion result + */ + virtual void HandleVtSessionCommandL( + MVtCtlCallControl::TVtCtlCmd aCmd, + TInt aResult ) = 0; + }; + +#endif // MVTCTLCOMMANDOBSERVER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Inc/MVtCtlEventObserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Inc/MVtCtlEventObserver.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,49 @@ +/* +* Copyright (c) 2004 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: Session event observer interface. +* +*/ + + + +#ifndef MVTCTLEVENTOBSERVER_H +#define MVTCTLEVENTOBSERVER_H + +// INCLUDES +#include "VtCtlEvents.h" + +/** +* Session event observer interface +* +* @lib CSCallCtrl +* @since 2.6 +*/ +class MVtCtlEventObserver + { + public: // new functions + + /** + * Handles event from session control. + * @param aEvent session event + * @param aParams parameters related to event. + * Actual type depends on event. + */ + virtual void HandleVtSessionEventL( + TInt aEvent, + TAny* aParams ) = 0; + }; + +#endif // MVTCTLEVENTOBSERVER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Inc/MVtCtlLineEventObserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Inc/MVtCtlLineEventObserver.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,75 @@ +/* +* Copyright (c) 2004 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: Observer interface for line events. +* +*/ + + + +#ifndef MVTCTLLINEEVENTOBSERVER_H +#define MVTCTLLINEEVENTOBSERVER_H + +// INCLUDES +#include + +// CLASS DECLARATION + +/** +* Observer interface for line events +* +* @lib CSCallCtrl +* @since 2.6 +*/ +class MVtCtlLineEventObserver + { + public: // new functions + + /** + * ELineEventCallAdded call added to line + * ELineEventIncomingCall incoming call + * ELineEventStatusChange line status changed + */ + enum TLineEvent { + ELineEventCallAdded, + ELineEventIncomingCall, + ELineEventStatusChange + }; + + /** + * Event handler for line events. + * @param aEvent line event + * @param aCallName call name + */ + virtual void HandleLineEventL( + const TLineEvent aEvent, + TDesC& aCallName ) = 0; + + /** + * Event handler for line events. + * @param aEvent line event + * @param aCallName call name + * @param aStatus call status + */ + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + virtual void HandleLineEventL( + const TLineEvent aEvent, + const RMobileCall::TMobileCallStatus aStatus ) = 0; + }; + +#endif // MVTCTLLINEEVENTOBSERVER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Inc/TVtCtlType.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Inc/TVtCtlType.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,53 @@ +/* +* Copyright (c) 2004 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: Session type base class. +* +*/ + + + +#ifndef MVTCTLSESSIONINFO_H +#define MVTCTLSESSIONINFO_H + +// INCLUDES +#include + +// CLASS DECLARATION + +/** +* Base class data types. +* +* @lib CSCallCtrl +* @since 2.6 +*/ +class TVtCtlType + { + public: + + /** + * Returns extension id + * @return extension id + */ + inline TInt Extension() const; + + protected: + // Extension id to be used in defining actual data type. + TInt iExtension; + }; + +#include "TVtCtlType.inl" + +#endif // MVTCTLSESSIONINFO_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Inc/TVtCtlType.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Inc/TVtCtlType.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,27 @@ +/* +* Copyright (c) 2004 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: Inline methods of class TVtCtlType. +* +*/ + + + +// ----------------------------------------------------------------------------- +// TVtCtlType::Extension +// Returns extension id. +// ----------------------------------------------------------------------------- +// +inline TInt TVtCtlType::Extension() const { return iExtension; } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Inc/VtCtlConfig.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Inc/VtCtlConfig.hrh Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,39 @@ +/* +* Copyright (c) 2004 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: Project configuration file. +* +*/ + + +#ifndef VTCTLCONFIG_HRH +#define VTCTLCONFIG_HRH + +// INCLUDES + +/** +* Macro that chooses stub implementation for CsCallCtrl. +* In stub following attributes are effective +* - duration = 5 +* - session info returns : +* direction = MO +* state = connected +* previous state = alerting +* tel number = 0501234567 +* duration = 5 +*/ +//#define VTCALLCONTROLSTUB + +#endif // VTCTLCONFIG_HRH + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Inc/VtCtlDefs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Inc/VtCtlDefs.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,82 @@ +/* +* Copyright (c) 2004 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: General definitions for Video telephony call control +* +*/ + + + +#ifndef VTCTLDEFS_H +#define VTCTLDEFS_H + +// INCLUDES +#include + +// CONSTANTS + +// Null session id +const TInt KNullSessionId = -1; + +// Session id for active session +const TInt KActiveSessionId = -2; + +/** +* Active object priorities +*/ +const TInt KVtCtlCallAdditionMonitorPriority = CActive::EPriorityStandard; +const TInt KVtCtlCallStatusMonitorPriority = CActive::EPriorityStandard; + +/** +* Maximum length for telephone number +*/ +const TInt KVtCtlTelNumberLength = 100; + + +// DATA TYPES + +/** +* Remote end address +*/ +typedef TBuf TVtCtlTelNumber; + +/** +* Session duration +*/ +typedef TTimeIntervalSeconds TVtCtlDuration; + +/** +* Session array +*/ +typedef RArray RVtCtlSessionIdArray; + +/** +* Session id +*/ +typedef TInt TVtCtlSessionId; + +/** +* Session command +*/ +typedef TInt TVtCtlCmd; + +/** +* Extension ids +*/ +enum { + EVtCtlCSSessionInfoExtensionId = 1 + }; + +#endif // VTCTLDEFS_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Inc/VtCtlEvents.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Inc/VtCtlEvents.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,47 @@ +/* +* Copyright (c) 2004 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: Call control events +* +*/ + + + +#ifndef VTCLTDEFS_H +#define VTCLTDEFS_H + +// INCLUDES +#include + +// DATA TYPES +typedef TInt TVtCtlEvent; + +// CONSTANTS + +/** +* Session status is changed. aParams in +* MVtCtlEventObserver::HandleVtSessionEventL is of +* type MVtCtlCallControl::TVtCtlState +*/ +const TVtCtlEvent KVtCtlEventSessionStatusChanged = 1; + +/** +* Session duration is changed. aParams +* MVtCtlEventObserver::HandleVtSessionEventL is of +* type TVtCtlDuration +*/ +const TVtCtlEvent KVtCtlEventDurationChanged = 2; + +#endif // VTCLTDEFS_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Inc/VtCtlPanic.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Inc/VtCtlPanic.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,56 @@ +/* +* Copyright (c) 2004 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: Data types for call control +* +*/ + + + +#ifndef VTCTLPANIC_H +#define VTCTLPANIC_H + +// INCLUDES + +#include + +// CONSTANTS + +/** +* Panic text +*/ +_LIT( KVtCtlPanicCategory, "VtCSCall" ); + +// DATA TYPES + +/** +* Panic values +*/ +enum TVtCtlPanic { + //** Line subsession handle is null */ + EVtCtlPanicLineHandleNull, + /** Call subsession handle is null */ + EVtCtlPanicCallHandleNull + }; + +// FUNCTION PROTOTYPES + +/** +* Call control panic. +* @param aPanic panic value +*/ +void Panic( TVtCtlPanic aPanic ); + +#endif // VTCTLPANIC_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Inc/VtCtlTypes.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Inc/VtCtlTypes.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,84 @@ +/* +* Copyright (c) 2004 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: Data types for call control +* +*/ + + +#ifndef VTCTLTYPES_H +#define VTCTLTYPES_H + +// INCLUDES +#include "VtCtlDefs.h" +#include "TVtCtlType.h" + +/** +* CS Session information. +* +* @lib CSCallCtrl +* @since 2.6 +*/ +class TVtCtlCSSessionInfoV1 : public TVtCtlType + { + public: // constructors + /** + * C++ default contructor. + */ + inline TVtCtlCSSessionInfoV1(); + + public: // data members + + // Session duration + TVtCtlDuration iDuration; + + // Address + TVtCtlTelNumber iTelNumber; + + // Session state + MVtCtlCallControl::TVtCtlState iState; + + // Previous session state + MVtCtlCallControl::TVtCtlState iPreviousState; + + // Session direction MO/MT + MVtCtlCallControl::TVtCtlDirection iDirection; + }; + +/** +* Data passed in MVtCtlEventObserver::HandleVtSessionEventL +* when event is KVtCtlEventSessionStatusChanged. +*/ +struct TVtCtlSessionStateEvent + { + /** + * Session state + */ + MVtCtlCallControl::TVtCtlState iState; + + /** + * Previous session state + */ + MVtCtlCallControl::TVtCtlState iPreviousState; + + /** + * Session id + */ + TVtCtlSessionId iSessionId; + }; + +#include "VtCtlTypes.inl" + +#endif // VTCTLTYPES_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Inc/VtCtlTypes.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Inc/VtCtlTypes.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,34 @@ +/* +* Copyright (c) 2004 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: Data types for call control +* +*/ + + + +// ----------------------------------------------------------------------------- +// TVtCtlCSSessionInfoV1::TVtCtlSessionInfoV1 +// c++ default constructor +// ----------------------------------------------------------------------------- +// +inline TVtCtlCSSessionInfoV1::TVtCtlCSSessionInfoV1() + : iDuration( 0 ), + iState( MVtCtlCallControl::EUnknown ), + iPreviousState( MVtCtlCallControl::EUnknown ), + iDirection( MVtCtlCallControl::EDirectionUnknown ) + { + iExtension = EVtCtlCSSessionInfoExtensionId; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Src/CVtCtlCallControl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Src/CVtCtlCallControl.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,252 @@ +/* +* Copyright (c) 2007 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: CVtCtlCallControl class implementation. +* +*/ + + +#pragma CTC SKIP +// INCLUDE FILES +#include +#include "CVtCtlCallControl.h" +#include "MVtCtlEventObserver.h" +#include "CVtCtlSessionContainer.h" +#include "CVtCtlVideoCall.h" +#include "VtCtlTypes.h" +#include + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtCtlCallControl::NewL +// two-phase constructor +// ----------------------------------------------------------------------------- +// +CVtCtlCallControl* CVtCtlCallControl::NewL( + MVtCtlEventObserver& aEventObserver ) + { + __VTPRINTENTER( "CVtCtlCallControl.NewL" ) + CVtCtlCallControl* self = new ( ELeave ) + CVtCtlCallControl( aEventObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + __VTPRINTEXIT( "CVtCtlCallControl.NewL" ) + return self; + } + +// ----------------------------------------------------------------------------- +// CVtCtlCallControl::~CVtCtlCallControl +// Destructor +// ----------------------------------------------------------------------------- +// +CVtCtlCallControl::~CVtCtlCallControl() + { + __VTPRINTENTER( "CVtCtlCallControl.~" ) + delete iContainer; + // uninitialize logging (if enabled) + VTLOGUNINIT + __VTPRINTEXIT( "CVtCtlCallControl.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlCallControl::CVtCtlCallControl +// c++ constructor +// ----------------------------------------------------------------------------- +// +CVtCtlCallControl::CVtCtlCallControl( + MVtCtlEventObserver& aEventObserver ) : + iEventObserver( aEventObserver ) + { + __VTPRINTENTER( "CVtCtlCallControl.CVtCtlCallControl" ) + __VTPRINTEXIT( "CVtCtlCallControl.CVtCtlCallControl" ) + } + + +// ----------------------------------------------------------------------------- +// CVtCtlCallControl::ConstructL +// +// ----------------------------------------------------------------------------- +// +void CVtCtlCallControl::ConstructL() + { + __VTPRINTENTER( "CVtCtlCallControl.ConstructL" ) + // initialize logging (if enabled) + VTLOGINIT + iContainer = CVtCtlSessionContainer::NewL( *this ); + __VTPRINTEXIT( "CVtCtlCallControl.ConstructL" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlCallControl::GetDuration +// +// ----------------------------------------------------------------------------- +// +TInt CVtCtlCallControl::GetDuration( + TVtCtlSessionId aId, + TVtCtlDuration& aDuration ) + { + __VTPRINTENTER( "CVtCtlCallControl.GetDuration" ) + CVtCtlVideoCall* call = iContainer->FindCall( aId ); + TInt err( KErrNotFound ); + if ( call ) + { + err = call->GetDuration( aDuration ); + } + __VTPRINTEXIT( "CVtCtlCallControl.GetDuration" ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtCtlCallControl::GetSessionInfoL +// +// ----------------------------------------------------------------------------- +// +/***************************************************** +* Series 60 Customer / ETel +* Series 60 ETel API +*****************************************************/ +void CVtCtlCallControl::GetSessionInfoL( + TVtCtlSessionId aId, + TDes8& aInfo ) + { + __VTPRINTENTER( "CVtCtlCallControl.GetSessionInfoL" ) + ValidateDataExtensionL( aInfo, EVtCtlCSSessionInfoExtensionId ); + CVtCtlVideoCall* call = iContainer->FindCall( aId ); + if ( call ) + { + TPckg& pckg = + reinterpret_cast&>( aInfo ); + TVtCtlCSSessionInfoV1& info = pckg(); + TInt err( call->UpdateCallInfo() ); + if ( err == KErrNone ) + { + const RMobileCall::TMobileCallInfoV1& mobileInfo = call->MobileInfo(); + info.iDuration = mobileInfo.iDuration; + info.iTelNumber = mobileInfo.iRemoteParty.iRemoteNumber.iTelNumber; + __VTPRINT2( DEBUG_SESSION, "VtCtl: mobile dir=%d", + mobileInfo.iRemoteParty.iDirection ) + switch ( mobileInfo.iRemoteParty.iDirection ) + { + case RMobileCall::EMobileOriginated: + info.iDirection = EDirectionMobileOriginated; + break; + case RMobileCall::EMobileTerminated: + info.iDirection = DirectionMobileTerminated; + break; + case RMobileCall::EDirectionUnknown: + default: + info.iDirection = EDirectionUnknown; + break; + } + } + } + else + { + __VTPRINT( DEBUG_SESSION, "CallCtrl.GetSessionInfoL not found" ) + User::Leave( KErrNotFound ); + } + __VTPRINTEXIT( "CVtCtlCallControl.GetSessionInfoL" ) + } + + +// ----------------------------------------------------------------------------- +// CVtCtlCallControl::GetState +// +// ----------------------------------------------------------------------------- +// +MVtCtlCallControl::TVtCtlState CVtCtlCallControl::GetSessionState( + TVtCtlSessionId aId ) const + { + __VTPRINTENTER( "CVtCtlCallControl.GetSessionState" ) + __VTPRINT2( DEBUG_SESSION, "CallCtrl.GetSessionState for id:%d",aId ) + MVtCtlCallControl::TVtCtlState state = EUnknown; + CVtCtlVideoCall* call = iContainer->FindCall( aId ); + if ( call ) + { + call->GetCallState( state ); + } + __VTPRINT3( DEBUG_SESSION, " callPtr=%d state=%d", (TInt) call, state ) + __VTPRINTEXIT( "CVtCtlCallControl.GetSessionState" ) + return state; + } + +// ----------------------------------------------------------------------------- +// CVtCtlCallControl::GetPreviousState +// +// ----------------------------------------------------------------------------- +// +MVtCtlCallControl::TVtCtlState CVtCtlCallControl::GetPreviousPreviousState( + TVtCtlSessionId aId ) const + { + __VTPRINTENTER( "CVtCtlCallControl.GetPreviousPreviousState" ) + MVtCtlCallControl::TVtCtlState state = EUnknown; + const CVtCtlVideoCall* call = iContainer->FindCall( aId ); + if ( call ) + { + state = call->CallInfo().iPreviousStatus; + } + __VTPRINTEXIT( "CVtCtlCallControl.GetPreviousPreviousState" ) + return state; + } + +// ----------------------------------------------------------------------------- +// CVtCtlCallControl::HandleCallStatusChangeL +// Notifies observer about call status change. +// ----------------------------------------------------------------------------- +// +void CVtCtlCallControl::HandleCallStatusChangeL( + TVtCtlSessionId aId, + MVtCtlCallControl::TVtCtlState aStatus, + MVtCtlCallControl::TVtCtlState aPreviousStatus ) + { + __VTPRINTENTER( "CVtCtlCallControl.HandleCallStatusChangeL" ) + __VTPRINT2( DEBUG_SESSION, " status=%d", (TInt) aStatus ) + + TVtCtlSessionStateEvent event; + event.iPreviousState = aPreviousStatus; + event.iState = aStatus; + event.iSessionId = aId; + + TAny* parameter = &event; + iEventObserver.HandleVtSessionEventL( + KVtCtlEventSessionStatusChanged, + parameter ); + __VTPRINTEXIT( "CVtCtlCallControl.HandleCallStatusChangeL" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlCallControl::ValidateDataExtensionL +// Validates extension id of descriptor representation of data type. +// ----------------------------------------------------------------------------- +// +void CVtCtlCallControl::ValidateDataExtensionL( + TDesC8& aData, + TInt aExtension ) + { + __VTPRINTENTER( "CVtCtlCallControl.ValidateDataExtensionL" ) + TVtCtlType type; + TPckg pckg(type); + TPtrC8 ptr( aData.Ptr(), sizeof( TVtCtlType ) ); + pckg.Copy( ptr ); + if ( type.Extension() != aExtension ) + { + __VTPRINT( DEBUG_SESSION, "CallCtrl.Validate not supported" ) + User::Leave( KErrNotSupported ); + } + __VTPRINTEXIT( "CVtCtlCallControl.ValidateDataExtensionL" ) + } +#pragma CTC ENDSKIP +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Src/CVtCtlCallControlStub.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Src/CVtCtlCallControlStub.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,194 @@ +/* +* Copyright (c) 2007 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: Stub version of call control. +* +*/ + + +#pragma CTC SKIP +// INCLUDE FILES +#include "CVtCtlCallControl.h" +#include "MVtCtlEventObserver.h" +#include "CVtCtlSessionContainer.h" +#include "CVtCtlVideoCall.h" +#include "VtCtlTypes.h" +#include + +// CONSTANTS +_LIT( KVtCtlStubTelNumber, "0501234567" ); + +// Duration +const TInt KVtCtlStubDuration = 5; + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtCtlCallControl::NewL +// Two-phase constructor. +// ----------------------------------------------------------------------------- +// +CVtCtlCallControl* CVtCtlCallControl::NewL( + MVtCtlEventObserver& aEventObserver ) + { + __VTPRINTENTER( "CVtCtlCallControlStub.NewL" ) + CVtCtlCallControl* self = new ( ELeave ) + CVtCtlCallControl( aEventObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + __VTPRINTEXIT( "CVtCtlCallControlStub.NewL" ) + return self; + } + +// ----------------------------------------------------------------------------- +// CVtCtlCallControl::~CVtCtlCallControl +// Destructor +// ----------------------------------------------------------------------------- +// +CVtCtlCallControl::~CVtCtlCallControl() + { + __VTPRINTENTER( "CVtCtlCallControlStub.~" ) + delete iContainer; + // uninitialize logging + VTLOGUNINIT + __VTPRINTEXIT( "CVtCtlCallControlStub.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlCallControl::CVtCtlCallControl +// c++ constructor +// ----------------------------------------------------------------------------- +// +CVtCtlCallControl::CVtCtlCallControl( + MVtCtlEventObserver& aEventObserver) : + iEventObserver( aEventObserver ) + { + __VTPRINTENTER( "CVtCtlCallControlStub.CVtCtlCallControl" ) + __VTPRINTEXIT( "CVtCtlCallControlStub.CVtCtlCallControl" ) + } + + +// ----------------------------------------------------------------------------- +// CVtCtlCallControl::ConstructL +// +// ----------------------------------------------------------------------------- +// +void CVtCtlCallControl::ConstructL() + { + __VTPRINTENTER( "CVtCtlCallControlStub.ConstructL" ) + // initialize logging + VTLOGINIT + iContainer = CVtCtlSessionContainer::NewL( *this ); + __VTPRINTEXIT( "CVtCtlCallControlStub.ConstructL" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlCallControl::GetDuration +// +// ----------------------------------------------------------------------------- +// +TInt CVtCtlCallControl::GetDuration( + TVtCtlSessionId , + TVtCtlDuration& aDuration ) + { + __VTPRINTENTER( "CVtCtlCallControlStub.GetDuration" ) + aDuration = 5; + __VTPRINTEXIT( "CVtCtlCallControlStub.GetDuration" ) + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtCtlCallControl::GetSessionInfoL +// +// ----------------------------------------------------------------------------- +// +void CVtCtlCallControl::GetSessionInfoL( + TVtCtlSessionId , + TDes8& aInfo ) + { + __VTPRINTENTER( "CVtCtlCallControlStub.GetSessionInfoL" ) + + TPckg& pckg = + reinterpret_cast&>( aInfo ); + __VTPRINT( DEBUG_SESSION, "VtCtl:CallCtrl. 1" ) + TVtCtlCSSessionInfoV1& info = pckg(); + __VTPRINT( DEBUG_SESSION, "VtCtl:CallCtrl. 2" ) + info.iDirection = MVtCtlCallControl::EDirectionMobileOriginated; + info.iDuration = KVtCtlStubDuration; + info.iState = MVtCtlCallControl::EConnected; + info.iPreviousState = MVtCtlCallControl::EAlerting; + info.iTelNumber = KVtCtlStubTelNumber; + __VTPRINTEXIT( "CVtCtlCallControlStub.GetSessionInfoL" ) + } + + +// ----------------------------------------------------------------------------- +// CVtCtlCallControl::GetState +// +// ----------------------------------------------------------------------------- +// +MVtCtlCallControl::TVtCtlState CVtCtlCallControl::GetSessionState( + TVtCtlSessionId ) const + { + __VTPRINTENTER( "CVtCtlCallControlStub.GetSessionState" ) + MVtCtlCallControl::TVtCtlState state = MVtCtlCallControl::EConnected; + __VTPRINTEXIT( "CVtCtlCallControlStub.GetSessionState" ) + return state; + } + +// ----------------------------------------------------------------------------- +// CVtCtlCallControl::GetPreviousState +// +// ----------------------------------------------------------------------------- +// +MVtCtlCallControl::TVtCtlState CVtCtlCallControl::GetPreviousPreviousState( + TVtCtlSessionId ) const + { + __VTPRINTENTER( "CVtCtlCallControlStub.GetPreviousPreviousState" ) + MVtCtlCallControl::TVtCtlState state = EAlerting; + __VTPRINTEXIT( "CVtCtlCallControlStub.GetPreviousPreviousState" ) + return state; + } + + +// ----------------------------------------------------------------------------- +// CVtCtlCallControl::HandleCallStatusChangeL +// Notifies +// ----------------------------------------------------------------------------- +// +void CVtCtlCallControl::HandleCallStatusChangeL( + TVtCtlSessionId , + MVtCtlCallControl::TVtCtlState , + MVtCtlCallControl::TVtCtlState ) + { + __VTPRINTENTER( "CVtCtlCallControlStub.HandleCallStatusChangeL" ) + __VTPRINTEXIT( "CVtCtlCallControlStub.HandleCallStatusChangeL" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlCallControl::ValidateDataExtensionL +// Validates extension id of descriptor representation of data type. +// ----------------------------------------------------------------------------- +// +void CVtCtlCallControl::ValidateDataExtensionL( + TDesC8& , + TInt ) + { + __VTPRINTENTER( "CVtCtlCallControlStub.ValidateDataExtensionL" ) + __VTPRINTEXIT( "CVtCtlCallControlStub.ValidateDataExtensionL" ) + } +#pragma CTC ENDSKIP +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Src/CVtCtlCallStatusMonitor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Src/CVtCtlCallStatusMonitor.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,227 @@ +/* +* Copyright (c) 2007 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: Monitors call status. +* +*/ + + +#pragma CTC SKIP +// INCLUDE FILES +#include "CVtCtlCallStatusMonitor.h" +#include "MVtCtlCallStatusObserver.h" +#include "VtCtlDefs.h" +#include + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtCtlCallStatusMonitor::CVtCtlCallStatusMonitor +// C++ constructor +// ----------------------------------------------------------------------------- +// +/***************************************************** +* Series 60 Customer / ETel +* Series 60 ETel API +*****************************************************/ +CVtCtlCallStatusMonitor::CVtCtlCallStatusMonitor( + RMobileCall& aCall, + MVtCtlCallStatusObserver& aObserver ) : + CActive( KVtCtlCallStatusMonitorPriority ), + iCall( aCall ), + iObserver( aObserver ), + iCallStatus( RMobileCall::EStatusUnknown ), + iPreviousStatus( RMobileCall::EStatusUnknown ) + { + __VTPRINTENTER( "CVtCtlCallStatusMonitor.CVtCtlCallStatusMonitor" ) + CActiveScheduler::Add( this ); + __VTPRINTEXIT( "CVtCtlCallStatusMonitor.CVtCtlCallStatusMonitor" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlCallStatusMonitor::~CVtCtlCallStatusMonitor +// destructor +// ----------------------------------------------------------------------------- +// +CVtCtlCallStatusMonitor::~CVtCtlCallStatusMonitor() + { + __VTPRINTENTER( "CVtCtlCallStatusMonitor.~" ) + Cancel(); + __VTPRINTEXIT( "CVtCtlCallStatusMonitor.~" ) + } + + +// ----------------------------------------------------------------------------- +// CVtCtlCallStatusMonitor::Start +// Starts monitoring +// ----------------------------------------------------------------------------- +// +/***************************************************** +* Series 60 Customer / ETel +* Series 60 ETel API +*****************************************************/ +void CVtCtlCallStatusMonitor::Start() + { + __VTPRINTENTER( "CVtCtlCallStatusMonitor.Start" ) + if ( iPreviousStatus == RMobileCall::EStatusUnknown ) + { + RMobileCall::TMobileCallStatus status( RMobileCall::EStatusUnknown ); + if ( iCall.GetMobileCallStatus( status ) == KErrNone ) + { + iPreviousStatus = status; + } + } + if ( !IsActive() ) + { + iCall.NotifyMobileCallStatusChange( iStatus, iCallStatus ); + SetActive(); + } + __VTPRINTEXIT( "CVtCtlCallStatusMonitor.Start" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlCallStatusMonitor::DoCancel +// Cancels monitoring +// ----------------------------------------------------------------------------- +// +void CVtCtlCallStatusMonitor::DoCancel() + { + __VTPRINTENTER( "CVtCtlCallStatusMonitor.DoCancel" ) + iCall.CancelAsyncRequest( EMobileCallNotifyMobileCallStatusChange ); + __VTPRINTEXIT( "CVtCtlCallStatusMonitor.DoCancel" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlCallStatusMonitor::RunL +// Receives call status change and notifies observer +// ----------------------------------------------------------------------------- +// +/***************************************************** +* Series 60 Customer / ETel +* Series 60 ETel API +*****************************************************/ +void CVtCtlCallStatusMonitor::RunL() + { + __VTPRINTENTER( "CVtCtlCallStatusMonitor.RunL" ) + __VTPRINT2( DEBUG_SESSION , "CallStatMon.RunL err=%d",iStatus.Int() ) + __VTPRINT2( DEBUG_SESSION , "CallStatMon.RunL sta=%d", + (TInt)iCallStatus ) + if ( iStatus == KErrNone ) + { + const RMobileCall::TMobileCallStatus cache( iCallStatus ); + Start(); + MVtCtlCallControl::TVtCtlState state = MapState( cache ); + if ( CVtCtlCallStatusMonitor::IsLegalNewState( + cache, iPreviousStatus ) ) + { + iPreviousStatus = cache; + if ( state != MVtCtlCallControl::EUnknown ) + { + iObserver.HandleCallStatusChangeL( + KNullSessionId, // unknown by this + state, + MapState( iPreviousStatus ) ); + } + } + } + __VTPRINTEXIT( "CVtCtlCallStatusMonitor.RunL" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlCallStatusMonitor::RunError +// +// ----------------------------------------------------------------------------- +// +TInt CVtCtlCallStatusMonitor::RunError( +#ifdef VTDEBUG + TInt aError ) +#else + TInt /*aError*/ ) +#endif + { + __VTPRINTENTER( "CVtCtlCallStatusMonitor.RunError" ) + __VTPRINTEXITR( "CVtCtlCallStatusMonitor.RunError err=%d", aError ) + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtCtlCallStatusMonitor::MapState +// Maps Etel call status to internal type +// ----------------------------------------------------------------------------- +// +/***************************************************** +* Series 60 Customer / ETel +* Series 60 ETel API +*****************************************************/ +MVtCtlCallControl::TVtCtlState CVtCtlCallStatusMonitor::MapState( + const RMobileCall::TMobileCallStatus aStatus ) + { + __VTPRINTENTER( "CVtCtlCallStatusMonitor.MapState" ) + MVtCtlCallControl::TVtCtlState state( MVtCtlCallControl::EUnknown ); + switch ( aStatus ) + { + case RMobileCall::EStatusIdle: + state = MVtCtlCallControl::EIdle; + break; + case RMobileCall::EStatusDialling: + state = MVtCtlCallControl::EInitializing; + break; + case RMobileCall::EStatusRinging: + state = MVtCtlCallControl::ERinging; + break; + case RMobileCall::EStatusAnswering: + state = MVtCtlCallControl::ERinging; + break; + case RMobileCall::EStatusConnecting: + state = MVtCtlCallControl::EInitializing; + break; + case RMobileCall::EStatusConnected: + state = MVtCtlCallControl::EConnected; + break; + case RMobileCall::EStatusDisconnecting: + case RMobileCall::EStatusDisconnectingWithInband: + state = MVtCtlCallControl::EDisconnecting; + break; + case RMobileCall::EStatusUnknown: + state = MVtCtlCallControl::EUnknown; + break; + default: + break; + } + __VTPRINTEXIT( "CVtCtlCallStatusMonitor.MapState state" ) + return state; + } + +// ----------------------------------------------------------------------------- +// CVtCtlCallStatusMonitor::IsLegalNewState +// Checks if call state transition specified by arguments is legal. +// ----------------------------------------------------------------------------- +// +TBool CVtCtlCallStatusMonitor::IsLegalNewState( + const RMobileCall::TMobileCallStatus aNewState, + const RMobileCall::TMobileCallStatus aCurrentState ) + { + // check state transition priority + const TInt newPrio = KVtCtlStatusTransitionPriorities[ aNewState ]; + const TInt prevPrio = KVtCtlStatusTransitionPriorities[ aCurrentState ]; + + /** + * Legal transition if new state is logically consecutive compared to old + * state. Exception: transition to idle always possible ( !newPrio ) + */ + const TBool isLegal = ( newPrio > prevPrio || !newPrio ); + return isLegal; + } +#pragma CTC ENDSKIP +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Src/CVtCtlFactory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Src/CVtCtlFactory.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,70 @@ +/* +* Copyright (c) 2007 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: CVtCtlFactory class implementation. +* +*/ + + +#pragma CTC SKIP +// INCLUDE FILES +#include "CVtCtlFactory.h" +#include "CVtCtlCallControl.h" +#include + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// MVtCtlCallControl::CreateCallControlL +// Creates call control. +// ----------------------------------------------------------------------------- +// +MVtCtlCallControl* CVtCtlFactory::CreateCallControlL( + MVtCtlEventObserver& aEventObserver ) + { + __VTPRINTENTER( "CVtCtlCallStatusMonitor.IsLegalNewState" ) + MVtCtlCallControl* control = CVtCtlCallControl::NewL( + aEventObserver ); + __VTPRINTEXIT( "CVtCtlCallStatusMonitor.IsLegalNewState" ) + return control; + } + +// ----------------------------------------------------------------------------- +// MVtCtlCallControl::Delete +// Destructs call control object. +// ----------------------------------------------------------------------------- +// +void CVtCtlFactory::Delete( MVtCtlCallControl* aCallControl ) + { + __VTPRINTENTER( "CVtCtlFactory.Delete" ) + CVtCtlCallControl* callControl = + static_cast( aCallControl ); + delete callControl; + __VTPRINTEXIT( "CVtCtlFactory.Delete" ) + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// ----------------------------------------------------------------------------- +// CreateFactory +// Returns: Factory for creating and destructing call control. +// ----------------------------------------------------------------------------- +// +EXPORT_C CVtCtlFactory* CreateFactory() + { + CVtCtlFactory* factory = new CVtCtlFactory; + return factory; + } +#pragma CTC ENDSKIP +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Src/CVtCtlLineMonitor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Src/CVtCtlLineMonitor.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,131 @@ +/* +* Copyright (c) 2007 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: Monitors new calls on data line +* +*/ + + +#pragma CTC SKIP +// INCLUDE FILES +#include "CVtCtlLineMonitor.h" +#include "MVtCtlLineEventObserver.h" +#include "VtCtlDefs.h" +#include +#include + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtCtlLineMonitor::CVtCtlLineMonitor +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +/***************************************************** +* Series 60 Customer / ETel +* Series 60 ETel API +*****************************************************/ +CVtCtlLineMonitor::CVtCtlLineMonitor( + RMobileLine& aLine, + MVtCtlLineEventObserver& aObserver) : + CActive( KVtCtlCallAdditionMonitorPriority ), + iLine ( aLine ), + iObserver( aObserver ), + iLastLineStatus( RMobileCall::EStatusIdle ), + iLineStatus( RMobileCall::EStatusIdle ) + { + __VTPRINTENTER( "CVtCtlLineMonitor.CVtCtlLineMonitor" ) + CActiveScheduler::Add( this ); + __VTPRINTEXIT( "CVtCtlLineMonitor.CVtCtlLineMonitor" ) + } + +// Destructor +CVtCtlLineMonitor::~CVtCtlLineMonitor() + { + __VTPRINTENTER( "CVtCtlLineMonitor.~" ) + Cancel(); + __VTPRINTEXIT( "CVtCtlLineMonitor.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlLineMonitor::Start +// Start monitoring +// ----------------------------------------------------------------------------- +// +void CVtCtlLineMonitor::Start() + { + __VTPRINTENTER( "CVtCtlLineMonitor.Start" ) + if ( !IsActive() ) + { + iLine.NotifyMobileLineStatusChange( iStatus, iLineStatus ); + SetActive(); + } + __VTPRINTEXIT( "CVtCtlLineMonitor.Start" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlLineMonitor::DoCancel +// Stop monitoring +// ----------------------------------------------------------------------------- +// +void CVtCtlLineMonitor::DoCancel() + { + __VTPRINTENTER( "CVtCtlLineMonitor.DoCancel" ) + iLine.CancelAsyncRequest( EMobileLineNotifyMobileLineStatusChange ); + __VTPRINTEXIT( "CVtCtlLineMonitor.DoCancel" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlLineMonitor::RunL +// Notifies observer on the event. +// ----------------------------------------------------------------------------- +// +void CVtCtlLineMonitor::RunL() + { + __VTPRINTENTER( "CVtCtlLineMonitor.RunL" ) + __VTPRINT2( DEBUG_SESSION , "VtCtl:LineMon.RunL %d", iStatus.Int() ) + if ( iStatus == KErrNone ) + { + if ( iLineStatus != iLastLineStatus ) + { + iObserver.HandleLineEventL( + MVtCtlLineEventObserver::ELineEventStatusChange, iLineStatus ); + iLastLineStatus = iLineStatus; + } + Start(); + } + __VTPRINTEXIT( "CVtCtlLineMonitor.RunL" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlLineMonitor::RunError +// Starts monitoring after error +// ----------------------------------------------------------------------------- +// +TInt CVtCtlLineMonitor::RunError( +#ifdef VTDEBUG + TInt aError ) +#else + TInt ) +#endif + { + __VTPRINTENTER( "CVtCtlLineMonitor.RunError" ) + Start(); + __VTPRINTEXITR( "CVtCtlLineMonitor.RunError err=%d", aError ) + return KErrNone; + } +#pragma CTC ENDSKIP +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Src/CVtCtlSessionContainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Src/CVtCtlSessionContainer.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,457 @@ +/* +* Copyright (c) 2004 - 2007 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: Container for ETel session and subsessions. +* +*/ + + +#pragma CTC SKIP +// INCLUDE FILES +#include "CVtCtlSessionContainer.h" +#include "CVtCtlLineMonitor.h" +#include "CVtCtlVideoCall.h" +#include +#include + +// CONSTANTS + +// Retrials for connecting to ETel server +const TInt KVtCtlETelConnectRetrials = 5; + +// Granularity +const TInt KVtCtlMaxCalls = 5; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtCtlSessionContainer::CVtCtlSessionContainer +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtCtlSessionContainer::CVtCtlSessionContainer( + MVtCtlCallStatusObserver& aObserver ) : + iCalls( KVtCtlMaxCalls ), + iObserver( aObserver ) + { + __VTPRINTENTER( "CVtCtlSessionContainer.CVtCtlSessionContainer" ) + __VTPRINTEXIT( "CVtCtlSessionContainer.CVtCtlSessionContainer" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlSessionContainer::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +/***************************************************** +* Series 60 Customer / ETel +* Series 60 ETel API +*****************************************************/ +void CVtCtlSessionContainer::ConstructL() + { + __VTPRINTENTER( "CVtCtlSessionContainer.ConstructL" ) + TInt retries( KVtCtlETelConnectRetrials ); + TInt err( KErrNone ); + while ( retries-- && + iServer.Handle() == KNullHandle ) + { + err = iServer.Connect(); + } + User::LeaveIfError( err ); + User::LeaveIfError( iServer.LoadPhoneModule( KMmTsyModuleName() ) ); + User::LeaveIfError( iPhone.Open( iServer, KMmTsyPhoneName() ) ); + User::LeaveIfError( iLine.Open( iPhone, KMmTsyDataLineName() ) ); + + iLineMonitor = new ( ELeave ) CVtCtlLineMonitor( iLine, *this ); + iLineMonitor->Start(); + + RMobileCall::TMobileCallStatus lineStatus; + User::LeaveIfError( iLine.GetMobileLineStatus( lineStatus ) ); + if ( lineStatus != RMobileCall::EStatusIdle ) + { + __VTPRINT( DEBUG_SESSION | DEBUG_CONSTRUCT, + "VtCtl:SesConL line active" ) + TInt calls( 0 ); + User::LeaveIfError( iLine.EnumerateCall( calls ) ); + while ( calls-- ) + { + RLine::TCallInfo callInfo; + iLine.GetCallInfo( calls, callInfo ); + if ( InitCallL( callInfo.iCallName ) ) + { + __VTPRINT( DEBUG_SESSION | DEBUG_CONSTRUCT, + "VtCtl:SesConL call found and created" ) + calls = 0; + } + } + } + + __VTPRINTEXIT( "CVtCtlSessionContainer.ConstructL" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlSessionContainer::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtCtlSessionContainer* CVtCtlSessionContainer::NewL( + MVtCtlCallStatusObserver& aObserver ) + { + __VTPRINTENTER( "CVtCtlSessionContainer.NewL" ) + CVtCtlSessionContainer* self = + new ( ELeave ) CVtCtlSessionContainer( aObserver ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + __VTPRINTEXIT( "CVtCtlSessionContainer.NewL" ) + return self; + } + + +// Destructor +CVtCtlSessionContainer::~CVtCtlSessionContainer() + { + __VTPRINTENTER( "CVtCtlSessionContainer.~" ) + + TInt count( iCalls.Count() ); + CVtCtlVideoCall* call = NULL; + while ( count-- ) + { + call = iCalls[count]; + delete call; + } + iCalls.Close(); + delete iLineMonitor; + iLine.Close(); + iPhone.Close(); + iServer.UnloadPhoneModule( KMmTsyModuleName() ); + iServer.Close(); + __VTPRINTEXIT( "CVtCtlSessionContainer.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlSessionContainer::HandleLineEventL +// Handle new call on data line +// ----------------------------------------------------------------------------- +// +void CVtCtlSessionContainer::HandleLineEventL( + const TLineEvent aEvent, + TDesC& aCallName ) + { + __VTPRINTENTER( "CVtCtlSessionContainer.HandleLineEventL" ) + if ( aEvent == ELineEventCallAdded ) + { + CVtCtlVideoCall* call = FindCall( aCallName ); + if ( call == NULL ) + { + InitCallL( aCallName ); + } + } + __VTPRINTEXITR( "CVtCtlSessionContainer.HandleLineEventL event=%d", + aEvent ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlSessionContainer::HandleLineEventL +// +// ----------------------------------------------------------------------------- +// +/***************************************************** +* Series 60 Customer / ETel +* Series 60 ETel API +*****************************************************/ +void CVtCtlSessionContainer::HandleLineEventL( + const TLineEvent aEvent, + const RMobileCall::TMobileCallStatus aStatus ) + { + __VTPRINTENTER( "CVtCtlSessionContainer.HandleLineEventL" ) + __VTPRINT3( DEBUG_SESSION, "SesCont.LineEvent2 event=%d,status=%d", + (TInt) aEvent, + (TInt) aStatus ) + if ( aEvent == ELineEventStatusChange && + ( aStatus == RMobileCall::EStatusRinging || + aStatus == RMobileCall::EStatusDialling ) ) + { + TInt calls( 0 ); + iLine.EnumerateCall( calls ); + while ( calls-- ) + { + RLine::TCallInfo callInfo; + TInt err( iLine.GetCallInfo( calls, callInfo ) ); + // ensure we're opening correct call + if ( err == KErrNone && + ( callInfo.iStatus == RCall::EStatusDialling || + callInfo.iStatus == RCall::EStatusRinging ) ) + { + calls = 0; // break + CVtCtlVideoCall* call = FindCall( callInfo.iCallName ); + if ( call == NULL ) + { + InitCallL( callInfo.iCallName ); + } + } + } + } + __VTPRINTEXIT( "CVtCtlSessionContainer.HandleLineEventL" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlSessionContainer::HandleCallStatusChangeL +// passes call status change event to observer +// ----------------------------------------------------------------------------- +// +void CVtCtlSessionContainer::HandleCallStatusChangeL( + TVtCtlSessionId aId, + MVtCtlCallControl::TVtCtlState aStatus, + MVtCtlCallControl::TVtCtlState aPreviousStatus ) + { + __VTPRINTENTER( "CVtCtlSessionContainer.HandleCallStatusChangeL" ) + iObserver.HandleCallStatusChangeL( aId, aStatus, aPreviousStatus ); + if ( aStatus == MVtCtlCallControl::EIdle ) + { + DestructCall( aId ); + } + __VTPRINTEXIT( "CVtCtlSessionContainer.HandleCallStatusChangeL" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlSessionContainer::FindCall +// Finds call by name +// ----------------------------------------------------------------------------- +// +/***************************************************** +* Series 60 Customer / ETel +* Series 60 ETel API +*****************************************************/ +CVtCtlVideoCall* CVtCtlSessionContainer::FindCall( TDesC& aCallName ) const + { + __VTPRINTENTER( "CVtCtlSessionContainer.FindCall" ) + TInt count( iCalls.Count() ); + CVtCtlVideoCall* call = NULL; + while ( count-- ) + { + call = iCalls[count]; + const RMobileCall::TMobileCallInfoV1& mobileInfo = call->MobileInfo(); + if ( aCallName == mobileInfo.iCallName ) + { + count = 0; // break + } + else + { + call = NULL; + } + } + __VTPRINT2( DEBUG_SESSION | DEBUG_DETAIL, + "SesCont.FindCall by name --> %d",(TInt)call ) + __VTPRINTEXIT( "CVtCtlSessionContainer.FindCall" ) + return call; + } + + +// ----------------------------------------------------------------------------- +// CVtCtlSessionContainer::FindCall +// Finds call by id. +// ----------------------------------------------------------------------------- +// +CVtCtlVideoCall* CVtCtlSessionContainer::FindCall( TVtCtlSessionId aId ) const + { + __VTPRINTENTER( "CVtCtlSessionContainer.FindCall" ) + TInt count( iCalls.Count() ); + CVtCtlVideoCall* call = NULL; + if ( aId == KActiveSessionId && count == 1 ) + { + call = iCalls[0]; + count = 0; + } + while ( count-- ) + { + call = iCalls[count]; + const CVtCtlVideoCall::TVtCtlCallInfo& info = + call->CallInfo(); + if ( aId == info.iId ) + { + count = 0; // break + } + else + { + call = NULL; + } + } + __VTPRINT2( DEBUG_SESSION | DEBUG_DETAIL, + "SesCont.FindCall by id --> %d",(TInt)call ) + __VTPRINTEXIT( "CVtCtlSessionContainer.FindCall" ) + return call; + } + +// ----------------------------------------------------------------------------- +// CVtCtlSessionContainer::Sessions +// Returns sessions. +// ----------------------------------------------------------------------------- +// +TInt CVtCtlSessionContainer::GetSessions( RVtCtlSessionIdArray& aArray ) const + { + __VTPRINTENTER( "CVtCtlSessionContainer.GetSessions" ) + const TInt count( iCalls.Count() ); + for ( TInt ii = 0; ii < count; ii++ ) + { + TInt err( aArray.Append( iCalls[ii]->CallInfo().iId ) ); + if ( err != KErrNone ) + { + __VTPRINTEXIT( "CVtCtlSessionContainer.GetSessions" ) + return err; + } + } + __VTPRINTEXIT( "CVtCtlSessionContainer.GetSessions" ) + return count; + } + +// ----------------------------------------------------------------------------- +// CVtCtlSessionContainer::DestructCall +// Destructs call +// ----------------------------------------------------------------------------- +// +void CVtCtlSessionContainer::DestructCall( TVtCtlSessionId aId ) + { + __VTPRINTENTER( "CVtCtlSessionContainer.DestructCall" ) + TInt count( iCalls.Count() ); + CVtCtlVideoCall* call = NULL; + while ( count-- ) + { + call = iCalls[count]; + const CVtCtlVideoCall::TVtCtlCallInfo& info = + call->CallInfo(); + if ( aId == info.iId ) + { + delete call; + iCalls.Remove( count ); + count = 0; // break + } + } + __VTPRINTEXIT( "CVtCtlSessionContainer.DestructCall" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlSessionContainer::CheckCallTypeL +// Checks call type +// ----------------------------------------------------------------------------- +// +/***************************************************** +* Series 60 Customer / ETel +* Series 60 ETel API +*****************************************************/ +TBool CVtCtlSessionContainer::CheckCallTypeL( + RMobileCall& aCall, + const TName& aName ) + { + __VTPRINTENTER( "CVtCtlSessionContainer.CheckCallTypeL" ) + User::LeaveIfError( aCall.OpenExistingCall( iLine, aName ) ); + TBool typeOk( EFalse ); + RMobileCall::TMobileCallDataCapsV1 caps; + RMobileCall::TMobileCallDataCapsV1Pckg pckg( caps ); + User::LeaveIfError( aCall.GetMobileDataCallCaps( pckg ) ); + __VTPRINT3( DEBUG_SESSION | DEBUG_DETAIL, + "SesCont.ChkCall speedCaps=%d,protCaps=%d", + caps.iSpeedCaps, caps.iProtocolCaps ) + if ( caps.iProtocolCaps & RMobileCall::KCapsIsdnMultimedia ) + { + typeOk = ETrue; + } + else + { + aCall.Close(); + } + __VTPRINTEXIT( "CVtCtlSessionContainer.CheckCallTypeL" ) + return typeOk; + } + +// ----------------------------------------------------------------------------- +// CVtCtlSessionContainer::InitCallL +// Initializes call if it is video call. +// ----------------------------------------------------------------------------- +// +/***************************************************** +* Series 60 Customer / ETel +* Series 60 ETel API +*****************************************************/ +TBool CVtCtlSessionContainer::InitCallL( const TName& aCallName ) + { + __VTPRINTENTER( "CVtCtlSessionContainer.InitCallL" ) + RMobileCall* mobilecall = new ( ELeave ) RMobileCall; + CleanupStack::PushL( mobilecall ); + + // check that type is multimedia call + const TBool callTypeOk = CheckCallTypeL( *mobilecall, aCallName ); + if ( callTypeOk ) + { + __VTPRINT( DEBUG_SESSION | DEBUG_DETAIL, + "SesCont.InitCall ok" ) + TVtCtlSessionId id = iSessionIds.Create(); + CVtCtlVideoCall* call = CVtCtlVideoCall::NewL( + iLine, id, *this ); + CleanupStack::PushL( call ); + User::LeaveIfError( iCalls.Append( call ) ); + call->InitializeCallL( *mobilecall ); // takes ownership + const CVtCtlVideoCall::TVtCtlCallInfo& callInfo = call->CallInfo(); + iObserver.HandleCallStatusChangeL( + id, callInfo.iStatus, callInfo.iPreviousStatus ); + CleanupStack::Pop(2); // mobilecall, call + } + else + { + CleanupStack::PopAndDestroy(); // mobilecall + } + __VTPRINTEXIT( "CVtCtlSessionContainer.InitCallL" ) + return callTypeOk; + } + +// ----------------------------------------------------------------------------- +// CVtCtlSessionContainer::TVtCtlSessionIdentities::TVtCtlSessionIdentities +// C++ constructor +// ----------------------------------------------------------------------------- +// +CVtCtlSessionContainer::TVtCtlSessionIdentities::TVtCtlSessionIdentities() + : iCurrentId( 0 ) + { + __VTPRINTENTER( "TVtCtlSessionIdentities.TVtCtlSessionIdentities" ) + __VTPRINTEXIT( "TVtCtlSessionIdentities.TVtCtlSessionIdentities" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlSessionContainer::TVtCtlSessionIdentities::Create +// Increment session id. +// ----------------------------------------------------------------------------- +// +TVtCtlSessionId CVtCtlSessionContainer::TVtCtlSessionIdentities::Create() + { + __VTPRINTENTER( "TVtCtlSessionIdentities.Create" ) + __VTPRINTEXIT( "TVtCtlSessionIdentities.Create" ) + return ++iCurrentId; + } + +// ----------------------------------------------------------------------------- +// CVtCtlSessionContainer::TVtCtlSessionIdentities::Current +// Return current session id. +// ----------------------------------------------------------------------------- +// +TVtCtlSessionId CVtCtlSessionContainer::TVtCtlSessionIdentities::Current() const + { + __VTPRINTENTER( "TVtCtlSessionIdentities.Current" ) + __VTPRINTEXIT( "TVtCtlSessionIdentities.Current" ) + return iCurrentId; + } +#pragma CTC ENDSKIP +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Src/CVtCtlVideoCall.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Src/CVtCtlVideoCall.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,242 @@ +/* +* Copyright (c) 2007 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 call abstraction implementation. +* +*/ + + +#pragma CTC SKIP +// INCLUDE FILES +#include "CVtCtlVideoCall.h" +#include "CVtCtlCallStatusMonitor.h" +#include "VtCtlPanic.h" +#include "cvtlogger.h" + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtCtlVideoCall::CVtCtlVideoCall +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +/***************************************************** +* Series 60 Customer / ETel +* Series 60 ETel API +*****************************************************/ +CVtCtlVideoCall::CVtCtlVideoCall( + RMobileLine& aDataLine, + TVtCtlSessionId aId, + MVtCtlCallStatusObserver& aObserver ) + : iLine( aDataLine ), iObserver( aObserver ) + { + __VTPRINTENTER( "CVtCtlVideoCall.CVtCtlVideoCall" ) + iCallInfo.iId = aId; + __VTPRINTEXIT( "CVtCtlVideoCall.CVtCtlVideoCall" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlVideoCall::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +/***************************************************** +* Series 60 Customer / ETel +* Series 60 ETel API +*****************************************************/ +CVtCtlVideoCall* CVtCtlVideoCall::NewL( + RMobileLine& aDataLine, + TVtCtlSessionId aId, + MVtCtlCallStatusObserver& aObserver ) + { + __VTPRINTENTER( "CVtCtlVideoCall.NewL" ) + CVtCtlVideoCall* self = new( ELeave ) + CVtCtlVideoCall( aDataLine, aId, aObserver ); + __VTPRINTEXIT( "CVtCtlVideoCall.NewL" ) + return self; + } + + +// Destructor +CVtCtlVideoCall::~CVtCtlVideoCall() + { + __VTPRINTENTER( "CVtCtlVideoCall.~" ) + __VTPRINT( DEBUG_SESSION | DEBUG_DESTRUCT, "VtCtl:Call~") + delete iStatusMonitor; + if ( iCall ) + { + iCall->Close(); + delete iCall; + } + __VTPRINTEXIT( "CVtCtlVideoCall.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlVideoCall::CallInfo +// Returns call information containing information not associated to ETel +// ----------------------------------------------------------------------------- +// +const CVtCtlVideoCall::TVtCtlCallInfo& CVtCtlVideoCall::CallInfo() const + { + return iCallInfo; + } + +// ----------------------------------------------------------------------------- +// CVtCtlVideoCall::MobileInfo +// Returns ETel call information. +// ----------------------------------------------------------------------------- +// +/***************************************************** +* Series 60 Customer / ETel +* Series 60 ETel API +*****************************************************/ +const RMobileCall::TMobileCallInfoV1& CVtCtlVideoCall::MobileInfo() const + { + return iMobileCallInfo; + } + +// ----------------------------------------------------------------------------- +// CVtCtlVideoCall::InitializeCallL +// Opens call subsession and starts status monitor. +// ----------------------------------------------------------------------------- +// +/***************************************************** +* Series 60 Customer / ETel +* Series 60 ETel API +*****************************************************/ +void CVtCtlVideoCall::InitializeCallL( + RMobileCall& aCall ) + { + __VTPRINTENTER( "CVtCtlVideoCall.InitializeCallL" ) + __ASSERT_ALWAYS( iLine.SubSessionHandle(), + Panic( EVtCtlPanicLineHandleNull ) ); + iCall = &aCall; + iStatusMonitor = new ( ELeave ) CVtCtlCallStatusMonitor( *iCall, *this ); + iStatusMonitor->Start(); + UpdateCallInfo(); + iCallInfo.iPreviousStatus = MVtCtlCallControl::EIdle; + iCallInfo.iStatus = + CVtCtlCallStatusMonitor::MapState( iMobileCallInfo.iStatus ); + + __VTPRINTEXIT( "CVtCtlVideoCall.InitializeCallL" ) + } + +// ----------------------------------------------------------------------------- +// CVtCtlVideoCall::UpdateCallInfo +// Updates call information from ETel +// ----------------------------------------------------------------------------- +// +/***************************************************** +* Series 60 Customer / ETel +* Series 60 ETel API +*****************************************************/ +TInt CVtCtlVideoCall::UpdateCallInfo() + { + __VTPRINTENTER( "CVtCtlVideoCall.UpdateCallInfo" ) + __ASSERT_ALWAYS( iCall->SubSessionHandle(), + Panic( EVtCtlPanicCallHandleNull ) ); + + RMobileCall::TMobileCallInfoV1Pckg pckg( iMobileCallInfo ); + const TInt err( iCall->GetMobileCallInfo( pckg ) ); + __VTPRINT2( DEBUG_SESSION, "VtCtl:Call. dir %d", + iMobileCallInfo.iRemoteParty.iDirection ) + __VTPRINT2( DEBUG_SESSION, "VtCtl:Call. status %d", + iMobileCallInfo.iStatus ) +#ifdef VTDEBUG + RDebug::Print(_L(" VtCtl.RemoteNumber=%S"), + &iMobileCallInfo.iRemoteParty.iRemoteNumber.iTelNumber ); +#endif + __VTPRINTEXITR( "CVtCtlVideoCall.UpdateCallInfo err=%d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtCtlVideoCall::GetDuration +// Returns call duration +// ----------------------------------------------------------------------------- +// +TInt CVtCtlVideoCall::GetDuration( TVtCtlDuration& aDuration ) + { + __VTPRINTENTER( "CVtCtlVideoCall.GetDuration" ) + const TInt res( UpdateCallInfo() ); + if ( res == KErrNone ) + { + aDuration = iMobileCallInfo.iDuration; + } + __VTPRINTEXITR( "CVtCtlVideoCall.GetDuration err=%d", res ) + return res; + } + +// ----------------------------------------------------------------------------- +// CVtCtlVideoCall::GetCallState +// Gets call state +// ----------------------------------------------------------------------------- +// +TInt CVtCtlVideoCall::GetCallState( + MVtCtlCallControl::TVtCtlState& aState ) + { + __VTPRINTENTER( "CVtCtlVideoCall.GetCallState" ) + RMobileCall::TMobileCallStatus status; + aState = iCallInfo.iStatus; + const TInt res( iCall->GetMobileCallStatus( status ) ); + + // update internal state only if differs from previous state + if ( res == KErrNone && + CVtCtlCallStatusMonitor::IsLegalNewState( + status, iMobileCallInfo.iStatus ) ) + { + // update 1) internal values, and + iMobileCallInfo.iStatus = status; + iCallInfo.iPreviousStatus = iCallInfo.iStatus; + iCallInfo.iStatus = CVtCtlCallStatusMonitor::MapState( status ); + + // 2) return value + aState = iCallInfo.iStatus; + } + __VTPRINTEXITR( "CVtCtlVideoCall.GetCallState err=%d", res ) + return res; + } + +// ----------------------------------------------------------------------------- +// CVtCtlVideoCall::HandleCallStatusChangeL +// Handles status change +// ----------------------------------------------------------------------------- +// +void CVtCtlVideoCall::HandleCallStatusChangeL( + TVtCtlSessionId , + MVtCtlCallControl::TVtCtlState aStatus, + MVtCtlCallControl::TVtCtlState aPreviousStatus ) + { + __VTPRINTENTER( "CVtCtlVideoCall.HandleCallStatusChangeL" ) + // If monitor has received outdated notification ignore the event. + // This may happen if call status has asked from ETel and there + // are still old completed status notifications that are not handled. + // => contradition between internal status in this object and one + // received from ststus monitor. Ignore it. + if ( aStatus > iCallInfo.iStatus || aStatus == MVtCtlCallControl::EIdle ) + { + iCallInfo.iPreviousStatus = iCallInfo.iStatus; + iCallInfo.iStatus = aStatus; + + iObserver.HandleCallStatusChangeL( + iCallInfo.iId, + aStatus, + aPreviousStatus ); + } + __VTPRINTEXIT( "CVtCtlVideoCall.HandleCallStatusChangeL" ) + } +#pragma CTC ENDSKIP +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/CallCtrl/Src/VtCtlPanic.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/CallCtrl/Src/VtCtlPanic.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,36 @@ +/* +* Copyright (c) 2007 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: Call control panic +* +*/ + + +#pragma CTC SKIP +// INCLUDE FILES +#include "VtCtlPanic.h" + +// ============================= LOCAL FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// Panic +// +// ----------------------------------------------------------------------------- +// +void Panic( TVtCtlPanic aPanic ) + { + User::Panic( KVtCtlPanicCategory(), aPanic ); + } +#pragma CTC ENDSKIP +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/EABI/videotelengU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/EABI/videotelengU.DEF Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,8 @@ +EXPORTS + _ZN11CVtEngModel4NewLER19MVtEngEventObserverR21MVtEngCommandObserver @ 1 NONAME + _ZN11CVtEngModel9ExtensionERK4TUid @ 2 NONAME + _ZNK11CVtEngModel14CommandHandlerEv @ 3 NONAME + _ZNK11CVtEngModel5AudioEv @ 4 NONAME + _ZNK11CVtEngModel5MediaEv @ 5 NONAME + _ZNK11CVtEngModel7SessionEv @ 6 NONAME + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Group/bld.inf Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,66 @@ +/* +* Copyright (c) 2004 - 2007 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: videoteleng build information file. +* +*/ + +#include + +PRJ_PLATFORMS +DEFAULT + +PRJ_TESTEXPORTS + +PRJ_EXPORTS + + +../Inc/Base/VtEngEvents.h |../../../inc/vtengevents.h +../Inc/Base/CVtEngModel.h |../../../inc/cvtengmodel.h +../Inc/Base/MVtEngEventObserver.h |../../../inc/mvtengeventobserver.h +../Inc/Commands/vtengcommands.h |../../../inc/vtengcommands.h +../Inc/Commands/MVtEngCommandHandler.h |../../../inc/mvtengcommandhandler.h +../Inc/Commands/MVtEngCommandObserver.h |../../../inc/mvtengcommandobserver.h +../Inc/Session/MVtEngSessionInfo.h |../../../inc/mvtengsessioninfo.h +../Inc/Audio/MVtEngAudio.h |../../../inc/mvtengaudio.h +../Inc/Media/MVtEngMedia.h |../../../inc/mvtengmedia.h +../Inc/Media/MVtEngFrameObserver.h |../../../inc/mvtengframeobserver.h +../Inc/Media/TVtEngRendering.h |../../../inc/tvtengrendering.h +../Inc/Media/TVtEngRendering.inl |../../../inc/tvtengrendering.inl +../Inc/Media/TVtEngRenderingDSA.h |../../../inc/tvtengrenderingdsa.h +../Inc/Media/TVtEngRenderingDSA.inl |../../../inc/tvtengrenderingdsa.inl +../Inc/Media/TVtEngRenderingDP.h |../../../inc/tvtengrenderingdp.h +../Inc/Media/TVtEngRenderingDP.inl |../../../inc/tvtengrenderingdp.inl +../Inc/Media/TVtEngRenderingNGA.h |../../../inc/tvtengrenderingnga.h +../Inc/Media/TVtEngRenderingNGA.inl |../../../inc/tvtengrenderingnga.inl +../Inc/Extensions/MVtEngCameraPreferences.h |../../../inc/mvtengcamerapreferences.h +../Inc/Extensions/mvtengrecord2file.h |../../../inc/mvtengrecord2file.h + + +../data/videoteleng_stub.SIS /epoc32/data/z/system/install/videoteleng_stub.sis + +../Logger/Inc/cvtlogger.h |../../../inc/cvtlogger.h +../Logger/Inc/vtlogger.hrh |../../../inc/vtlogger.hrh + +// Export IBY file +../Rom/videoteleng.iby CORE_APP_LAYER_IBY_EXPORT_PATH(videoteleng.iby) + +PRJ_MMPFILES + +../Logger/Group/vtlogger.mmp +../CallCtrl/Group/videocallctrl.mmp +../Group/videoteleng.mmp + + + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Group/videoteleng.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Group/videoteleng.mmp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,154 @@ +/* +* Copyright (c) 2004 - 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: This is project specification file for the Videoteleng. +* +*/ + +#include +#include "../Inc/Base/VtEngDefs.hrh" + +// Capability assignment. +CAPABILITY CAP_GENERAL_DLL + +// default vendor id +VENDORID VID_DEFAULT + +TARGET videoteleng.dll +TARGETTYPE dll +UID 0x1000008d 0x101F867F + +SOURCEPATH ../Src/Audio +SOURCE CVtEngAudioHandler.cpp + +SOURCEPATH ../Src/Base +SOURCE CVtEngModel.cpp +SOURCE CVtEngEventManager.cpp +SOURCE CVtEngHandlerContainer.cpp +SOURCE CVtEngSettings.cpp +SOURCE CVtEngPubSubsListener.cpp +SOURCE cvtengincomingcallmonitor.cpp + +SOURCE cvtengmdtrcommandsender.cpp +SOURCE cvtengmdtrmessagelistener.cpp +SOURCE cvtengmediatorservice.cpp +SOURCE CVtEngAccessoryHandler.cpp + +SOURCE CVtEngCRProxy.cpp +SOURCE CVtEngCRObserverItem.cpp +SOURCE CVtEngInitializer.cpp +SOURCE CVtEngSATClient.cpp +SOURCE CVtEngDeviceLockMonitor.cpp +SOURCE VtEngUtils.cpp + +SOURCEPATH ../Src/Commands +SOURCE CVtEngCommandHandler.cpp +SOURCE CVtEngOperation.cpp +SOURCE cvtenginternaloperation.cpp +SOURCE TVtEngOperationUtils.cpp + +SOURCEPATH ../Src/Extensions +SOURCE CVtEngExtensions.cpp +SOURCE CVtEngExtensionBase.cpp +SOURCE CVtEngCameraPreferences.cpp +#if defined (RD_VT_RTF) +SOURCE cvtengrecord2file.cpp +SOURCE cvtengr2ftoneplayer.cpp +#endif // RD_VT_RTF + + +SOURCEPATH ../Src/Media +SOURCE CVtEngMediaHandler.cpp +SOURCE CVtEngDrawDP.cpp +SOURCE CVtEngDrawDSA.cpp +SOURCE CVtEngDrawNGA.cpp +SOURCE CVtEngDtmfHandler.cpp +SOURCE CVtEngLocalVideo.cpp +SOURCE CVtEngRemoteVideo.cpp +SOURCE CVtEngImageScaler.cpp + +SOURCEPATH ../Src/Session +SOURCE CVtEngSessionHandler.cpp + +SOURCEPATH ../Src/State +SOURCE CVtEngStateManager.cpp +SOURCE CVtEngStateAlerting.cpp +SOURCE CVtEngStateBase.cpp +SOURCE CVtEngStateClearing.cpp +SOURCE CVtEngStateConnected.cpp +SOURCE CVtEngStateIdle.cpp +SOURCE CVtEngStateInitializing.cpp +SOURCE CVtEngStateNegotiating.cpp +SOURCE CVtEngStateOpen.cpp +SOURCE CVtEngStateRinging.cpp +SOURCE CVtEngDtmfState.cpp +SOURCE CVtEngDtmfIdle.cpp +SOURCE CVtEngDtmfSending.cpp +SOURCE CVtEngDtmfBuffered.cpp + +DOCUMENT ../../Group/bld.inf + +USERINCLUDE ../Inc/Base +USERINCLUDE ../Inc/Audio +USERINCLUDE ../Inc/Commands +USERINCLUDE ../Inc/Session +USERINCLUDE ../Inc/Media +USERINCLUDE ../Inc/State +USERINCLUDE ../Inc/Extensions +USERINCLUDE ../CallCtrl/Inc + + +APP_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE ../../../inc +SYSTEMINCLUDE /epoc32/include/mmf/common +SYSTEMINCLUDE /epoc32/include/mmf/server + +LIBRARY euser.lib +LIBRARY fbscli.lib +LIBRARY ws32.lib +LIBRARY videosource.lib +LIBRARY bitgdi.lib +LIBRARY displaysink.lib +LIBRARY featmgr.lib +LIBRARY phoneclient.lib +LIBRARY dsclient.lib +LIBRARY efsrv.lib +LIBRARY bafl.lib +LIBRARY sysutil.lib +LIBRARY centralrepository.lib +LIBRARY cenrepnotifhandler.lib + +LIBRARY commonengine.lib +LIBRARY mediaclientaudio.lib + +LIBRARY accclient.lib +LIBRARY telephonyaudiorouting.lib + +LIBRARY vtimagetransforms.lib + +DEBUGLIBRARY vtlogger.lib + + +LIBRARY satclient.lib + +LIBRARY esock.lib // BigEndian + +LIBRARY mmfdevsound.lib + +LIBRARY gdi.lib + +LIBRARY mediatorclient.lib +LIBRARY videotelproto.lib +LIBRARY surfaceupdateclient.lib +LIBRARY surfacemanager.lib +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Audio/CVtEngAudioHandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Audio/CVtEngAudioHandler.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,304 @@ +/* +* Copyright (c) 2004-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: Audio handler class. +* +*/ + + + +#ifndef CVTENGAUDIOHANDLER_H +#define CVTENGAUDIOHANDLER_H + +// INCLUDES +#include +#include "MVtEngAudio.h" +#include "CVtEngOperation.h" +#include "MVtEngSettingPSObserver.h" +#include "CVTEngPubSubsListener.h" +#include "CVtEngAccessoryHandler.h" +#include "MVtEngAccessoryObserver.h" +// new audio routing +#include "TelephonyAudioRouting.h" +#include "MTelephonyAudioRoutingObserver.h" +#include +#include + +// FORWARD DECLARATIONS +class CVtEngStateManager; +class CRoutingEnabler; + +/** +* Class for audio handling. +* +* @lib videoteleng.lib +* @since Series 60 2.6 +*/ +NONSHARABLE_CLASS( CVtEngAudioHandler ) + : public CBase, + public MVtEngAudio, + private MVtEngAccessoryObserver, + private MTelephonyAudioRoutingObserver + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CVtEngAudioHandler* NewL(); + + /** + * Destructor. + */ + virtual ~CVtEngAudioHandler(); + + public: // New functions. + + /** + * Performs on operation in the handler. + * @param operation to be performed on the handler + */ + void HandleL( CVtEngOperation& aOperation ); + + /** + * Creates/releases temporary DevSound instance. + * @param aEnable + * ETrue creates devSound + * EFalse destructs devSound + */ + void SetRoutingEnablerL( const TBool aEnable ); + + /** + * Increases audio volume + */ + TBool IncreaseVolume(); + + /** + * Decreases audio volume + */ + TBool DecreaseVolume(); + + private: // Functions from base classes. + + // from MVtEngAccessoryObserver + + /** @see MVtEngAccessoryObserver */ + virtual void AccessoryModeChanged( const TAccMode& aMode, + const TBool aActivated ); + + // from MTelephonyAudioRoutingObserver + + /** @see MTelephonyAudioRoutingObserver::AvailableOutputsChanged */ + virtual void AvailableOutputsChanged( CTelephonyAudioRouting& aTelephonyAudioRouting ); + + /** @see MTelephonyAudioRoutingObserver::OutputChanged */ + virtual void OutputChanged( CTelephonyAudioRouting& aTelephonyAudioRouting ); + + /** @see MTelephonyAudioRoutingObserver::SetOutputComplete */ + virtual void SetOutputComplete( CTelephonyAudioRouting& aTelephonyAudioRouting, + TInt aError ); + + public: // Functions from base classes. + + /** @see MVtEngAudio::GetRoutingState. */ + virtual TInt GetRoutingState( TAudioRoutingState& aAudioRoutingState ); + + /** @see MVtEngAudio::GetRoutingAvailability. */ + virtual TInt GetRoutingAvailability( + const TAudioRoutingState aAudioRoutingState, + TBool& aAvailable ); + + /** @see MVtEngAudio::GetHeadsetType. */ + virtual TInt GetHeadsetType( TWiredHeadsetType& aHeadsetType ); + + /** @see MVtEngAudio::OutputVolume. */ + virtual TInt OutputVolume( const TBool aHandsetVolume ) const; + + private: + + /** + * C++ default constructor. + */ + CVtEngAudioHandler(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + /** + * Completes operation. + * @param aResult error code + */ + void CompleteOperation( TInt aResult ); + + /** + * Sets loudspeaker on / off. + * @param aTurnOn ETrue if on, EFalse if off + * @param aShowNote ETrue if note is allowed to be shown, EFalse if not + */ + void SetLoudspeakerL( TBool aTurnOn, TBool aShowNote ); + + /** + * Sets Bluetooth on / off. + * @param aTurnOn ETrue if on, EFalse if off + */ + void SetBluetoothL( TBool aTurnOn ); + + /** + * Updates current volume that should be used. + */ + void UpdateCurrentVolume(); + + /** + * Checks if given audio output route is available. + * @return ETrue if given audio output route is available + */ + TBool IsOutputAvailable( const CTelephonyAudioRouting::TAudioOutput aOutput ); + + /** + * Modifies the volume by aDelta. + */ + TBool AdjustVolume( const TInt aDelta ); + + private: // Data + + // Enumeration flags used in the implementation. + enum + { + // Handset + EFlagHandset = 1, + // Loudspeaker + EFlagLoudspeaker = 2, + // Bluetooth handsfree + EFlagBT = 4, + // Wired headset + EFlagWiredHeadset = 8 + }; + + // Accessory mode listener class. + CVtEngAccessoryHandler* iAccHandler; + + // Contains the current accessory and it's audio mode. + TAccPolAccessoryMode iAccMode; + + // Pointer to telephony audio routing instance + CTelephonyAudioRouting* iTelephonyAudioRouting; + + // Current audio routing state + CTelephonyAudioRouting::TAudioOutput iCurrentAudioOutput; + + // Holds old routing state. + TAudioRoutingState iOldAudioRoutingState; + + // Pointer to an operation. + CVtEngOperation* iOperation; + + /** + * For enabling audio routing before actual + * DevSound for play is created. + */ + CRoutingEnabler* iRoutingEnabler; + }; + +/** +* Class for handling dummy DevSound. It enables audio routing +* before video call is connected. Proper devSound instance +* must exist in order to control audio routing. Actual instance +* is created in protocol in later phase of the stack +* initialization and one in here is deleted. +*/ +NONSHARABLE_CLASS( CRoutingEnabler ) : + public CBase, + private MDevSoundObserver + { + public: // constructor and destructor + + // Constructor + static CRoutingEnabler* NewL(); + + // Destructor + ~CRoutingEnabler(); + + private: // constructors + + // c++ constructor + CRoutingEnabler(); + + /** + * Creates and starts devSound. + */ + void StartL(); + + public: // new functions + + public: // from MDevSoundObserver + + /** + * @see MDevSoundObserver + */ + virtual void InitializeComplete( TInt aError ); + + /** + * @see MDevSoundObserver + */ + virtual void ToneFinished( TInt aError ); + + /** + * @see MDevSoundObserver + */ + virtual void BufferToBeFilled( CMMFBuffer* aBuffer ); + + /** + * @see MDevSoundObserver + */ + virtual void PlayError( TInt aError ); + + /** + * @see MDevSoundObserver + */ + virtual void BufferToBeEmptied( CMMFBuffer* aBuffer ); + + /** + * @see MDevSoundObserver + */ + virtual void RecordError( TInt aError ); + + /** + * @see MDevSoundObserver + */ + virtual void ConvertError( TInt aError ); + + /** + * @see MDevSoundObserver + */ + virtual void DeviceMessage( + TUid aMessageType, + const TDesC8& aMsg ); + + private: + // Temporary DevSound instance to enable audio routing + // before actual instance in protocol is ready. + // Routing can be changed already when MO call is alerting. + CMMFDevSound* iDevSound; + + // Variable to detect failure in Devsound initialization or PlayInitL(). + // If failure happens, Devsound instance is deleted outside callback + // in desctructor. ETrue; failure happened, EFalse; all OK + TBool iDevsoundInitializeFailure; + }; + + +#endif // CVTENGAUDIOHANDLER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Audio/MVtEngAudio.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Audio/MVtEngAudio.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,117 @@ +/* +* 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: Audio volume and routing interface +* +*/ + + + +#ifndef MVTENGAUDIO_H +#define MVTENGAUDIO_H + +// INCLUDES +#include + +/** +* Interface for audio related information. +* +* @lib videoteleng +* @since 2.6 +*/ +class MVtEngAudio + { + public: + + /** + * Current routing state + */ + enum TAudioRoutingState + { + EAudioHandset, + EAudioLoudspeaker, + EAudioBT, + EAudioWiredHeadset + }; + + /** + * Wired headset type + */ + enum TWiredHeadsetType + { + EWiredHeadset, + EWiredLoopset, + EWiredTty, + EWiredNone + }; + + /** + * Audio routing setting to be used when changing + * audio routing from client. + */ + enum TVtEngRoutingSetting + { + EActivateHandsfree, + EDeactivateHansfree, + EActivateBT, + EDeactivateBT + }; + + /** + * Speaker volume levels for Handset and Handsfree. + */ + struct TVtEngOutputVolume + { + TInt iHandsetVolume; + TInt iHandsfreeVolume; + }; + + /** + * Returns target where audio is currently routed to. + * @param aAudioRoutingState routing target + * @return Symbian OS error code + */ + virtual TInt GetRoutingState( + TAudioRoutingState& aAudioRoutingState ) = 0; + + /** + * Returns if routing to specified target can be + * done. + * @param aAudioRoutingState routing target + * @param aAvailable ETrue if possible to do + * @return Symbian OS error code + */ + virtual TInt GetRoutingAvailability( + const TAudioRoutingState aAudioRoutingState, + TBool& aAvailable ) = 0; + + /** + * Returns type of wired headset + * @return Symbian OS error code. + */ + virtual TInt GetHeadsetType( + TWiredHeadsetType& aHeadsetType ) = 0; + + /** + * Returns speaker volume + * @param aHandsetVolume if ETrue returns handset volume, + * otherwise loudspeaker volume. + * @return output volume ranging from 1 to 10 or Symbian OS error code. + */ + virtual TInt OutputVolume( + const TBool aHandsetVolume ) const = 0; + + + }; + +#endif // MVTENGAUDIO_H diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/CVTEngPubSubsListener.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/CVTEngPubSubsListener.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,130 @@ +/* +* Copyright (c) 2004-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: Listener for Publish and subscribe data. +* +*/ + + +#ifndef CVTENGPUBSUBSGSETTINGS_H +#define CVTENGPUBSUBSGSETTINGS_H + +// INCLUDES +#include +#include +#include + +// FORWARD DECLARATIONS +class MVtEngSettingPSObserver; + +// CLASS DECLARATION + +/** +* RProperty poller. +* +* @lib videoteleng.lib +* @since Series 60 2.8 +*/ +NONSHARABLE_CLASS( CVtEngPubSubsListener ) : public CActive + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + * @param aUid the Uid to use + * @param aKey item's key + * @param aObserver callback interface for notification + * @return instance of CVtEngPubSubsListener + */ + static CVtEngPubSubsListener* NewL( const TUid aUid, const TInt aKey, + MVtEngSettingPSObserver* aObserver ); + + /** + * Destructor. + */ + virtual ~CVtEngPubSubsListener(); + + public: // New functions. + + /** + * Gets integer value from P & S. + * @param aVal a value in return + * @return error code + */ + TInt Get( TInt& aVal ); + + /** + * Gets 8 bit string value from P&S. + * @param aVal a value in return + * @return error code + */ + TInt Get( TDes8& aVal ); + + /** + * Gets 16 bit descriptor value from P&S. + * @param aVal a value in return + * @return error code + */ + TInt Get( TDes16& aVal ); + + private: // New functions. + + /** + * Starts the listening (RunL). + */ + void StartListening(); + + private: // From CActive. + + /** @see CActive::RunL */ + virtual void RunL(); + + /** @see CActive::Cancel */ + virtual void DoCancel(); + + /** @see CActive::RunError */ + virtual TInt RunError( TInt aError ); + + private: + + /** + * C++ default constructor. + * @param aUid the Uid to use + * @param aKey item's key + * @param aObserver callback interface for notification + */ + CVtEngPubSubsListener( const TUid aUid, TInt aKey, + MVtEngSettingPSObserver* aObserver ); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + private: // Data + + // UID of the monitored item. + TUid iUid; + + // ID of the monitored item. + TInt iId; + + // Property to subscribe to. + RProperty iProperty; + + // The notification interface. + MVtEngSettingPSObserver* iCallback; + }; + +#endif // CVTENGPUBSUBSGSETTINGS_H +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/CVtEngAccessoryHandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/CVtEngAccessoryHandler.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,144 @@ +/* +* Copyright (c) 2004-2005 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: Accessory handler. +* +*/ + + + +#ifndef CVTENGACCHANDLER_H +#define CVTENGACCHANDLER_H + +// INCLUDES +#include +#include +#include +#include + +// FORWARD DECLARATIONS +class MVtEngAccessoryObserver; + +// CLASS DECLARATION + +/** +* Accessory mode listener for video telephony. +* +* @lib videoteleng +* @since 3.0 +*/ +NONSHARABLE_CLASS( CVtEngAccessoryHandler ) : public CActive + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + ? @return instance of CVtEngAccessoryHandler + */ + static CVtEngAccessoryHandler* NewL( ); + + /** + * Destructor. + */ + virtual ~CVtEngAccessoryHandler(); + + public: // From base classes. + + /** + * Handles accessory mode changes. + */ + void RunL(); + + /** + * Cancels accessory mode monitoring. + */ + void DoCancel(); + + /** + * Handles exceptions in RunL. + * @param aError error code. + * @return error code. + */ + TInt RunError( TInt aError ); + + public: // New functions + + /** + * Sets a new listener interested in accessory changes. + * @param aObserver call back interface for notifications. + */ + void RegisterObserverL( MVtEngAccessoryObserver* aObserver ); + + /** + * Unregisters a listener. + * NOTE, do not call this from NotifyObserversL! + * @param aObserver call back interface for notifications. + */ + void RemoveObserver( MVtEngAccessoryObserver* aObserver ); + + /** + * Returns current accessory mode. + * @param aAccessoryMode accessory mode in return + * @return Symbian error code + */ + TInt AccessoryMode( TAccPolAccessoryMode& aAccessoryMode ) const; + + private: // New functions. + + /** + * Removes all observers + */ + void RemoveAllObservers(); + + /** + * Sets object active and renews subscription. + */ + void StartListening(); + + /** + * Notifies all registered listeners. + */ + void NotifyObserversL(); + + private: // Constructors. + + /** + * C++ default constructor. + */ + CVtEngAccessoryHandler(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL( ); + + private: // Data + // Current accessory mode. + TAccPolAccessoryMode iCurrentAccessoryMode; + + // Owned array of accessory mode observers. + RPointerArray< MVtEngAccessoryObserver > iAccessoryObservers; + + // Owned accessory server session. + RAccessoryServer iAccessoryServer; + + // Owned accessory mode subsession. + RAccessoryMode iAccessoryMode; + + // Accessory mode structure. + TAccPolAccessoryMode iMode; + + }; + +#endif // CVTENGACCHANDLER_H +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/CVtEngCRObserverItem.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/CVtEngCRObserverItem.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,199 @@ +/* +* Copyright (c) 2004-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: Central repository observer class. +* +*/ + + +#ifndef CVTENGCROBSITEM_H +#define CVTENGCROBSITEM_H + +// INCLUDES +#include +#include +#include "cenrepnotifyhandler.h" + +// FORWARD DECLARATIONS +class MVtEngCRSettingObserver; + +// CLASS DECLARATION + +/** +* Central repository listener for video telephony. +* +* @lib videoteleng.lib +* @since Series 60 3.0 +*/ +NONSHARABLE_CLASS( CVtEngCRObserverItem ) : public CBase, + public MCenRepNotifyHandlerCallback + { + public: // Constructors and destructor. + + /** + * Two-phased constructor. + * @param aObserver the real observer to notify + * @param aUid UID for this listener + * @param aKey ID for this listener + * @param aType type of information interested in + * @return this CR observer + */ + static CVtEngCRObserverItem* NewL( + MVtEngCRSettingObserver* aObserver, + TUid aUid, TUint32 aKey, + CCenRepNotifyHandler::TCenRepKeyType aType ); + + /** + * Destructor. + */ + virtual ~CVtEngCRObserverItem(); + + public: // From MCenRepNotifyHandlerCallback. + + /** + * Callback to notify changed integer setting. + * @param aId changed id + * @param aNewValue + */ + void HandleNotifyInt( TUint32 aId, TInt aNewValue ); + + /** + * Callback to notify changed real setting. + * @param aId changed id + * @param aNewValue + */ + void HandleNotifyReal( TUint32 aId, TReal aNewValue ); + + /** + * Callback to notify changed string setting. + * @param aId changed id + * @param aNewValue + */ + void HandleNotifyString( TUint32 aId, const TDesC16& aNewValue ); + + /** + * Callback to notify changed binary setting. + * @param aId changed id + * @param aNewValue + */ + void HandleNotifyBinary( TUint32 aId, const TDesC8& aNewValue ); + + /** + * Callback to notify changed setting. + * @param aId changed id + */ + void HandleNotifyGeneric( TUint32 aId); + + /** + * Callback to notify of an occurred error. + * @param aId changed id + * @param aError + * @param aHandler which handler + */ + void HandleNotifyError( TUint32 aId, TInt aError, + CCenRepNotifyHandler* aHandler ); + + public: // New functions. + + /** + * Checks if this one matches given UID and key. + * @param aUID UID to use in comparison + * @param aKey key to use in comparison + * @return ETrue if match + */ + TBool Offer( const TUid aUid, const TUint32 aKey ) const; + + /** + * Checks if this one matches given UID. + * @param aUID UID to use in comparison + * @return ETrue if match + */ + TBool Offer( const TUid aUid ) const; + + /** + * Checks if this one matches given key. + * @param aKey key to use in comparison + * @return ETrue if match + */ + TBool Offer( const TUint32 aKey ) const; + + /** + * Returns UID of this handler. + * @return UID + */ + TUid Uid() const; + + /** + * Returns key of this handler. + * @return key + */ + TUint32 Key() const; + + /** + * Returns notifier of this handler. + * @return notifier + */ + CCenRepNotifyHandler* Notifier() const; + + /** + * Returns type of this handler. + * @return type + */ + CCenRepNotifyHandler::TCenRepKeyType Type() const; + + /** + * Returns observer of this handler. + * @return observer + */ + MVtEngCRSettingObserver* Observer() const; + + /** + * Sets CenRep notifier + * @param notifier to set. + */ + void SetCenRepNotifier( CCenRepNotifyHandler* aNotifier ); + + + private: // Constructor. + + /** + * C++ default constructor. + * @param aObserver the real observer to notify + * @param aUid UID for this listener + * @param aKey ID for this listener + * @param aType type of information interested in + */ + CVtEngCRObserverItem( MVtEngCRSettingObserver* Observer, + TUid aUid, TUint32 aKey, + CCenRepNotifyHandler::TCenRepKeyType aType ); + + private: // Data + + // Callback for notifications. + MVtEngCRSettingObserver* iObserver; + + // UID for this item. + TUid iUid; + + // Key for this item. + TUint32 iKey; + + // Type of listener. + CCenRepNotifyHandler::TCenRepKeyType iType; + + // Central repository notifier. + CCenRepNotifyHandler* iNotifier; +}; +#endif // CVTENGCROBSITEM_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/CVtEngCRProxy.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/CVtEngCRProxy.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,237 @@ +/* +* Copyright (c) 2004-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: Central repository proxy, which is used by all CR dependent. +* +*/ + + + +#ifndef CVTENGCRPROXY_H +#define CVTENGCRPROXY_H + +// INCLUDES +#include +#include +#include + +// FORWARD DECLARATIONS +class CVtEngCRObserverItem; +class CRepository; +class MVtEngCRSettingObserver; + +// CLASS DECLARATION + +/** +* Central repository interface for video telephony. +* +* @lib videoteleng.lib +* @since Series 60 3.0 +*/ +NONSHARABLE_CLASS( CVtEngCRProxy ) : public CBase + { + public: // Data structures. + + // Internal data structure for storing CR sessions. + NONSHARABLE_CLASS( CCRSession ) : public CBase + { + public: + /** + * Destructor needed. + */ + ~CCRSession(); + + // CenRep session. + CRepository* iSession; + // Uid attached to CenRep session. + TUid iUid; + }; + + public: // Constructors and destructor. + + /** + * Two-phased constructor. + * @return instance of CVtEngCRProxy + */ + static CVtEngCRProxy* NewL( ); + + /** + * Destructor. + */ + virtual ~CVtEngCRProxy(); + + public: // New functions + + /** + * Sets integer value to Central Repository. + * @param aUid used UID + * @param aId which key to use + * @param aVal a value to set + * @return error code + */ + TInt Set( const TUid aUid, const TUint32 aId, TInt aVal ); + + /** + * Sets real value to Central Repository. + * @param aUid used UID + * @param aId which key to use + * @param aVal a value to set + * @return error code + */ + TInt Set( const TUid aUid, const TUint32 aId, const TReal& aVal ); + + /** + * Sets binary value to Central Repository. + * @param aUid used UID + * @param aId which key to use + * @param aVal a value to set + * @return error code + */ + TInt Set( const TUid aUid, const TUint32 aId, const TDesC8& aVal ); + + /** + * Sets string value to Central Repository. + * @param aUid used UID + * @param aId which key to use + * @param aVal a value to set + * @return error code + */ + TInt Set( const TUid aUid, const TUint32 aId, const TDesC16& aVal ); + + /** + * Gets integer value from Central Repository. + * @param aUid used UID + * @param aId which key to use + * @param aVal a value in return + * @return error code + */ + TInt Get( const TUid aUid, const TUint32 aId, TInt& aVal ); + + /** + * Gets real value from Central Repository. + * @param aUid used UID + * @param aId which key to use + * @param aVal a value in return + * @return error code + */ + TInt Get( const TUid aUid, const TUint32 aId, TReal& aVal ); + + /** + * Gets binary value from Central Repository + * @param aUid used UID + * @param aId which key to use + * @param aVal a value in return + * @return error code + */ + TInt Get( const TUid aUid, const TUint32 aId, TDes8& aVal ); + + /** + * Gets string value from Central Repository. + * @param aUid used UID + * @param aId which key to use + * @param aVal a value in return + * @return error code + */ + TInt Get( const TUid aUid, const TUint32 aId, TDes16& aVal ); + + /** + * Add a new Cen Rep interested object. + * @param aObserver callback interface + */ + void RegisterInterestedL( CVtEngCRObserverItem* aObserver ); + + /** + * Removes an observer. + * @param aObserver to be removed + */ + void RemoveInterested( CVtEngCRObserverItem& aObserver ); + + private: // New functions + + /** + * Gets a Cen Rep session matching UID. + * @param aUid UID to use in search + * @param aCRSession found session or a new session + * @return error code + */ + TInt GetSessionL( const TUid aUid, CRepository*& aCRSession ); + + /** + * Creates an id-CenRep paired session. + * @param aUid the UID to use + * @return new session or NULL + */ + CCRSession* NewCRSessionL( TUid aUid ); + + /** + * Finds observer item. + * @param aKey + * @param aIndex + * @return observer item or NULL + */ + CVtEngCRObserverItem* FindItem( + const TUint32 aKey, TInt& aIndex ) const; + + /** + * Removes all observers + * + */ + void RemoveAllObservers(); + + /** + * Removes all Central repository instances + * + */ + void RemoveSessions(); + + /** + * Maps a given UID to a certain central repository instance + * @param aUid the UID to map + * @return found CRepository item or NULL + */ + CRepository* MapUidToCR( const TUid aUid ); + + /** + * Finds observer item. + * @param aUid + * @param aKey + * @param aIndex + * @return observer item or NULL + */ + CVtEngCRObserverItem* FindItem( const TUid& aUid, const TUint32 aKey, + TInt& aIndex ) const; + + private: + + /** + * C++ default constructor. + */ + CVtEngCRProxy(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL( ); + + private: // Data + + // Storage for data observers. + RPointerArray iObserverItems; + + // Array for central repository sessions. + RPointerArray iCRSessions; + }; + +#endif // CVTENGCRPROXY_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/CVtEngDeviceLockMonitor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/CVtEngDeviceLockMonitor.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,83 @@ +/* +* 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: Monitor for device lock (autolock) +* +*/ + + + +#ifndef CVTENGDEVICELOCKMONITOR_H +#define CVTENGDEVICELOCKMONITOR_H + +// INCLUDES +#include +#include "MVtEngSettingPSObserver.h" + +// FORWARD DECLARATIONS +class CVtEngPubSubsListener; + +// CLASS DECLARATION + +/** +* Monitor for autolock state. +* +* @lib videoteleng +* @since 3.1 +*/ +NONSHARABLE_CLASS( CVtEngDeviceLockMonitor ) : public CBase, public MVtEngSettingPSObserver + { + public: // Constructors and destructor + + static CVtEngDeviceLockMonitor* NewL(); + + /** + * Destructor. + */ + virtual ~CVtEngDeviceLockMonitor(); + + public: // New functions + + /** + * Sends event to UI of current autolock state + */ + void NotifyState() const; + + public: // From MVtEngSettingPSObserver + + /** + * @see MVtEngSettingPSObserver::HandleNotifyPSL + */ + void HandleNotifyPSL( const TUid aUid, const TInt& aKey, + const TRequestStatus& aStatus ); + + private: + /** + * C++ constructor. + */ + CVtEngDeviceLockMonitor(); + + /** + * 2nd phase constructor + */ + void ConstructL(); + + private: + + // Listener for autolock state + CVtEngPubSubsListener* iAutolockListener; + }; + +#endif // CVTENGDEVICELOCKMONITOR_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/CVtEngEventManager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/CVtEngEventManager.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,119 @@ +/* +* 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: Event manager +* +*/ + + + +#ifndef CVTENGEVENTMANAGER_H +#define CVTENGEVENTMANAGER_H + +// INCLUDES +#include +#include "VtEngEvents.h" + +// FORWARD DECLARATIONS +class MVtEngEventObserver; + +// CLASS DECLARATION + +/** +* This class is responsible for notifying client +* on engine events. +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtEngEventManager ) : public CActive + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CVtEngEventManager* NewL( + MVtEngEventObserver& aEventObserver ); + + /** + * Destructor. + */ + virtual ~CVtEngEventManager(); + + public: // New functions + + /** + * Notifies client on session state change. + */ + void SessionStateChanged(); + + /** + * Notifies event to observer. + * @param aEvent event + */ + static void NotifyEvent( const TInt aEvent ); + + void AddObserverL( MVtEngEventObserver* aObserver ); + + void RemoveObserver( const MVtEngEventObserver* aObserver ); + + private: // from CActive + + void RunL(); + + void DoCancel(); + + private: + + /** + * Notifies event to observer + */ + void DoNotifyEvent( const TInt aEvent ); + + TBool QueueAsyncEvent( const TInt aEvent ); + + /** + * Queue event and signal AO. + * @param aEvent Asynchronous event to be signalled. + */ + void QueueAndSignal( const TInt aEvent ); + + /** + * Signals AO. + */ + void Signal(); + + private: + + /** + * C++ default constructor. + */ + CVtEngEventManager(); + + // 2nd phase constructor + void ConstructL( MVtEngEventObserver& aEventObserver ); + + private: // Data + + RPointerArray iObservers; + + // Asynchronous events are stored in this array and + // executed in order + CArrayFixFlat< TInt >* iEventQueue; + + }; + +#endif // CVTENGEVENTMANAGER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/CVtEngHandlerContainer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/CVtEngHandlerContainer.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,131 @@ +/* +* 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: Handler container +* +*/ + + + +#ifndef CVTENGHANDLERCONTAINER_H +#define CVTENGHANDLERCONTAINER_H + +// INCLUDES +#include +#include "CVtEngMediaHandler.h" +#include "CVtEngSessionHandler.h" +#include "CVtEngAudioHandler.h" +#include "CVtEngDtmfHandler.h" + +// FORWARD DECLARATIONS +class MVtEngSessionInfo; +class MVtEngMedia; +class MVtEngAudio; + +// CLASS DECLARATION + +/** +* Container for media, audio and session handlers. +* +* @lib videoteleng +* @since Series60 2.6 +*/ +NONSHARABLE_CLASS( CVtEngHandlerContainer ) : public CBase + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CVtEngHandlerContainer* NewL( ); + + /** + * Destructor. + */ + virtual ~CVtEngHandlerContainer(); + + public: // New functions + + + /** + * Returns session handler. + * @return session handler + */ + inline MVtEngSessionInfo& Session() const; + + /** + * Returns media handler. + * @return media handler + */ + inline MVtEngMedia& Media() const; + + /** + * Returns audio handler. + * @return audio handler + */ + inline MVtEngAudio& Audio() const; + + + /** + * Returns DTMF handler. + * @return DTMF handler + */ + inline CVtEngDtmfHandler& Dtmf() const; + + /* + * Uninitializes audio and session handlers. + * Media handler uninitialization is done + * asynchronously using directly the handler. + */ + void Uninitialize(); + + /** + * Creates DTMF handler + * @param aH324Config H324 configure interface + */ + void CreateDtmfHandlerL( MVtH324ConfigCommand* aH324Config ); + + private: + + /** + * C++ default constructor. + */ + CVtEngHandlerContainer(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + private: // member data + + // media handler + CVtEngMediaHandler* iMedia; + + // session handler + CVtEngSessionHandler* iSession; + + // audio handler + CVtEngAudioHandler* iAudio; + + + // DTMF handler + CVtEngDtmfHandler* iDtmf; + + }; + +#include "CVtEngHandlerContainer.inl" + +#endif // CVTENGHANDLERCONTAINER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/CVtEngHandlerContainer.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/CVtEngHandlerContainer.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,57 @@ +/* +* 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: handler container +* +*/ + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngHandlerContainer::Session +// Returns specific handler +// +// ----------------------------------------------------------------------------- +// +inline MVtEngSessionInfo& CVtEngHandlerContainer::Session() const + { + return *iSession; + } + +// ----------------------------------------------------------------------------- +// CVtEngHandlerContainer::Media +// Returns specific handler +// +// ----------------------------------------------------------------------------- +// +inline MVtEngMedia& CVtEngHandlerContainer::Media() const { return *iMedia; } + +// ----------------------------------------------------------------------------- +// CVtEngHandlerContainer::Audio +// Returns specific handler +// +// ----------------------------------------------------------------------------- +// +inline MVtEngAudio& CVtEngHandlerContainer::Audio() const { return *iAudio; } + + +// ----------------------------------------------------------------------------- +// CVtEngHandlerContainer::Dtmf +// Returns specific handler +// +// ----------------------------------------------------------------------------- +// +inline CVtEngDtmfHandler& CVtEngHandlerContainer::Dtmf() const { return *iDtmf; } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/CVtEngInitializer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/CVtEngInitializer.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,239 @@ +/* +* Copyright (c) 2004 - 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: Class for initializing the engine gradually. +* Active object initializes one "subsystem" on each +* round. In case of failure timer is started and +* retrial is done after time-out. Uninitialization +* is done is one shot. +* +*/ + + + +#ifndef CVTENGINITIALIZER_H +#define CVTENGINITIALIZER_H + +// INCLUDES +#include "MVtEngSettingObserver.h" +#include +#include + +// FORWARD DECLARATIONS +class CVtEngHandlerContainer; +class CVtEngOperation; + + +/** +* Engine initializer. +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtEngInitializer ) : + public CActive, + public MVtEngSettingObserver + { + public: // Constructors and destructor + + static CVtEngInitializer* NewL( CVtEngHandlerContainer& aHandlers ); + + /** + * Destructor. + */ + virtual ~CVtEngInitializer(); + + public: // new functions + + /** + * Starts initialization process. + */ + void InitializeL( CVtEngOperation& aCallback ); + + /** + * Cancels initialiation + * @return ETrue if CActive::Cancel was called + */ + TBool CancelInit(); + + /** + * Uninitializes engine. + */ + void Uninitialize( CVtEngOperation& aCallback ); + + /** + * Gets GetSessionCommand ownership after initialization. + * @return CSessionCommand interface. + */ + MVtSessionCommand* GetSessionCommand(); + + /** + * Returns if engine is initialized. + * @return ETrue if initialized + */ + TBool Initialized() const; + + /** + * Creates handler for DTMF sending. + * @param aH324Config H324 configure interface + */ + void CreateDtmfHandlerL( MVtH324ConfigCommand* aH324Config ); + + /** + * Gets pointer to comms. Still owns the comms. + * @return Pointer to comms. + */ + MCommServer* GetVtComms(); + + private: // from CActive + + /** + * performs one initialization step. + */ + void RunL(); + + /** + * Cancels initialization process. + */ + void DoCancel(); + + /** + * Handles error in the process. + * @return always returns KErrNone + */ + TInt RunError( TInt aError ); + + public: // from MVtEngSettingObserver + virtual void HandleSettingChangedL( + CVtEngSettings::TSettingId aId, + const TDesC& aValue ); + + + private: // Constructors + + /** + * c++ constructor + */ + CVtEngInitializer( CVtEngHandlerContainer& aHandlers ); + + /** + * + */ + void ConstructL(); + + private: + + enum TProcess + { + // Go to next step + EContinue, + // Reset engine + EReset, + // Retry current step when failed. + ERetry + }; + + private: // new functions + + /** + * Reads bit reversal information from locally variated flags. + * @return ETrue if reversed. + */ + TBool BitReversalUsed(); + + /** + * Proceeds to next step or starts retrial of + * previously failed step. + */ + void ContinueOrRetry( const TProcess aOperation ); + + /** + * Notifies observer on initialization completion. + */ + void Notify( const TInt aResult ); + + /** + * Callback for retrial timer. + */ + static TInt HandleTimer( TAny* aAny ); + + /** + * Handles retrial timer expiration. + */ + void DoHandleTimer(); + + TBool ActivateAndSignal( TInt aSignalValue ); + + private: + + + /** + * Initialization steps + */ + enum TVtEngInitializationSteps + { + EInitNone, + EInitSession, + EInitMedia, + EInitProto, + EInitDataportCompleted, + EInitComplete, + EResetMedia, + EResetMediaPhase2 + }; + + /** + * Dataport information handling flags. + */ + enum TVtEngDataportInformationFlags + { + EDataportListened = 0x01, + EDataportReceived = 0x02 + }; + + private: + + // handler container + CVtEngHandlerContainer& iHandlers; + + // Current (un)initialization step + TInt iStep; + + // Operation to be notified on completion + CVtEngOperation* iCallback; + + // Retrial count + TInt iRetrials; + + // Retrial timer + CPeriodic* iTimer; + + // Protocol Session Engine + MVtSessionCommand* iSessionCommand; + + // Protocol Comms Server + MCommServer* iComms; + + // Has subscription been made for dataport name. + TInt iDataportHandled; + + // If MediaHandler has taken ownership of 2-way, this is true, + // otherwise false. + TBool iOwnershipInMH; + + }; + + +#endif // CVTENGINITIALIZER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/CVtEngModel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/CVtEngModel.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,151 @@ +/* +* 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 telephony engine class +* +*/ + + + +#ifndef CVTENGMODEL_H +#define CVTENGMODEL_H + +// INCLUDES +#include +//#include + +// CONSTANTS +//const ?type ?constant_var = ?constant; + +// MACROS +//#define ?macro ?macro_def + +// DATA TYPES +//enum ?declaration +//typedef ?declaration +//extern ?data_type; + +// FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS +class MVtEngEventObserver; +class MVtEngCommandObserver; +class CVtEngEventManager; +class CVtEngHandlerContainer; +class MVtEngCommandHandler; +class CVtEngCommandHandler; +class MVtEngSessionInfo; +class MVtEngMedia; +class MVtEngAudio; +class CVtEngStateManager; +class CVtEngUtility; +class CVtEngExtensions; + +// CLASS DECLARATION + +/** +* Model for video telephony engine. +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtEngModel ) : public CBase + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + * @param aEventObserver event observer + * @param aCommandObserver command observer + */ + IMPORT_C static CVtEngModel* NewL( + MVtEngEventObserver& aEventObserver, + MVtEngCommandObserver& aCommandObserver ); + + /** + * Destructor. + */ + IMPORT_C virtual ~CVtEngModel(); + + public: // New functions + + IMPORT_C MVtEngCommandHandler& CommandHandler() const; + + IMPORT_C MVtEngSessionInfo& Session() const; + + IMPORT_C MVtEngMedia& Media() const; + + IMPORT_C MVtEngAudio& Audio() const; + + /** + * Returns extension or NULL if extension cannot be found. + * @param aExtensionUid extension uid + * @return pointer to extension + */ + IMPORT_C TAny* Extension( const TUid& aExtensionUid ); + + + + protected: // New functions + + /** + * ?member_description. + * @since ?Series60_version + * @param ?arg1 ?description + * @return ?description + */ + + protected: // Functions from base classes + + /** + * From ?base_class ?member_description + */ + + private: + + /** + * C++ default constructor. + */ + CVtEngModel(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL( MVtEngEventObserver& aEventObserver, + MVtEngCommandObserver& aCommandObserver ); + + private: // Data + + // Event manager acting as event mediator. + CVtEngEventManager* iEventManager; + + // Container for functional units. + CVtEngHandlerContainer* iHandlers; + + // Handler for UI commands + CVtEngCommandHandler* iCommandHandler; + + // Manager for engine states + CVtEngStateManager* iStateManager; + + // Utility for TLS access + CVtEngUtility* iUtils; + + // Container for engine extensions + CVtEngExtensions* iExtensions; + + }; + +#endif // CVTENGMODEL_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/CVtEngSATClient.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/CVtEngSATClient.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,87 @@ +/* +* Copyright (c) 2005 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: SAT listener. +* +*/ + + + +#ifndef CVTENGSATCLIENT_H +#define CVTENGSATCLIENT_H + +// INCLUDES +#include +#include +#include +#include + + +// CLASS DECLARATION + +/** +* SAT listener. +* +* @lib videoteleng.lib +* @since Series 60 3.0 +*/ +NONSHARABLE_CLASS( CVtEngSATClient ) : public CBase, MSatRefreshObserver + { + public: // Constructors and destructor. + + /** + * Two-phased constructor. + * @return instance of CVtEngSATClient + */ + static CVtEngSATClient* NewL( ); + + /** + * Destructor. + */ + virtual ~CVtEngSATClient(); + + public: // Functions from base classes + + /** + * From MSatRefreshObserver + */ + TBool AllowRefresh( + TSatRefreshType aType, const TSatRefreshFiles& aFiles ); + /** + * From MSatRefreshObserver. + */ + void Refresh( TSatRefreshType aType, const TSatRefreshFiles& aFiles ); + + private: + + /** + * C++ default constructor. + */ + CVtEngSATClient(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL( ); + + private: // Data + + // Session & Refresh for SAT listening. + RSatSession iSatSession; + RSatRefresh iSatRefresh; + + }; + +#endif // CVTENGSATCLIENT_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/CVtEngSettings.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/CVtEngSettings.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,484 @@ +/* +* Copyright (c) 2004-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 call setting data. +* +*/ + + + +#ifndef CVTENGSETTINGS_H +#define CVTENGSETTINGS_H + +// INCLUDES +#include +#include +#include "MVtEngCRSettingObserver.h" +#include "CVtEngCRObserverItem.h" +#include "CVtEngCRProxy.h" +#include "MVtEngAudio.h" +#include "MVtEngMedia.h" +#include "MVtEngSessionInfo.h" + +// CONSTANTS +// Default routing. +const MVtEngAudio::TVtEngRoutingSetting + KVtEngDefaultAudioRouting = MVtEngAudio::EActivateHandsfree; + +// FORWARD DECLARATIONS +class MVtEngSettingObserver; + +// CLASS DECLARATION + +/** +* Container for video call settings. +* +* @lib videoteleng.lib +* @since Series 60 2.6 +*/ +NONSHARABLE_CLASS( CVtEngSettings ) : public CBase +, public MVtEngCRSettingObserver + { + public: + + /** + * Settings ids + */ + enum TSettingId + { + EStillImage, + EStillImagePath, + ECallTimer, + EHandsetVolume, + EHandsfreeVolume, + EBTAudioAccessory, + EIhfMode, + ESelectVolume, // select Handset / Handsfree volume + EDataportInfo + }; + + /** + * Audio configuration + */ + struct TVtEngAudioConfig + { + // Current volume in use, EFalse: handset, + // ETrue: loudspeaker. + TBool iCurrentVolume; + // Speaker volume + MVtEngAudio::TVtEngOutputVolume iVolume; + // Audio routing + MVtEngAudio::TVtEngRoutingSetting iRouting; + }; + + /** + * Video configuration + */ + struct TVtEngVideoConfig + { + // Still image file name + TFileName iStillImageFile; + // Determines if still image is valid. + TBool iImageIsValid; + // Determines if video is enabled. + TBool iVideoEnabled; + }; + + /** + * Video quality framerates + */ + struct TVtEngVideoQualityFrameRateConfig + { + // Frame rate for videoquality settings detail + TInt iDetail; + + // Frame rate for videoquality settings normal + TInt iNormal; + + // Frame rate for videoquality settings motion + TInt iMotion; + }; + + /** + * Media configuration + */ + struct TVtEngVideoCallConfig + { + // @see TVtEngAudioConfig + TVtEngAudioConfig iAudio; + // @see TVtEngVideoConfig + TVtEngVideoConfig iVideo; + // defines if call timer is enabled + TBool iCallTimerOn; + // Engine has green light to make connect on Protocol. + TBool iReadyForConnect; + // Dataport loaning status + TBool iIsDataportLoaned; + }; + + public: // Constructors and destructor + + /** + * Two-phased constructor. + * @return instance of CVtEngSettings + */ + static CVtEngSettings* NewL(); + + /** + * Destructor. + */ + virtual ~CVtEngSettings(); + + public: // New functions + + /** + * Creates stored data observers. + * @param aObserver callback interface + * @param aUid UID to monitor + * @param aKey ID to monitor + * @param aType which data type + */ + void CreateDataObserverL( + MVtEngCRSettingObserver* aObserver, TUid aUid, TUint32 aKey, + CCenRepNotifyHandler::TCenRepKeyType aType ); + + /** + * Returns configuration. + * @return settings data + */ + const CVtEngSettings::TVtEngVideoCallConfig& Config() const; + + /** + * Sets current volume. + * @param aVolume selected volume, + * EFalse: handset, ETrue: loudspeaker. + */ + void SetCurrentVolume( TBool aVolume ); + + /** + * Returns current volume. + * @return EFalse: handset, ETrue: loudspeaker. + */ + TBool CurrentVolume() const; + + /** + * Sets audio output volume levels. + * @param aHandsetVolume handset volume level. + * @param aHandsfreeVolume handsfree volume level. + * @param aInternal not stored to shared data but + * internal variable to be used when correct state + * is entered. + * @return Symbian error code + */ + TInt SetVolume( + const TInt aHandsetVolume, + const TInt aHandsfreeVolume, + const TBool aInternal ); + + /** + * Gets audio output volume levels from Shared Data. + * @param aVolume volume level. + * @param aHandsfree if true handsfree volume is read, + * otherwise handset. + * @param aInternal not read from shared data but + * from internal variable + * @return error code + */ + TInt GetVolume( + TInt& aVolume, + const TBool aHandsfree, + const TBool aInternal ) const; + + /** + * Gets maximum audio output volume level. + * @return max volume for device + */ + inline TInt MaxVolume( ) const; + + + /** + * Gets minimum audio output volume level. + * @return max volume for device + */ + inline TInt MinVolume( ) const; + + /** + * Checks the validity of the volume level. + * return either constant minimum, constant maximum + * or the passed value level. + * @param aVolume the volume level to check + * @return suitable volume level + */ + inline TInt ValidVolume( const TInt aVolume ) const; + + /** + * Sets audio routing setting. + * @param aState audio routing state. + */ + void SetRouting( const MVtEngAudio::TVtEngRoutingSetting& aState ); + + /** + * Sets output video state setting. + * @param aEnabled ETrue if sending is enabled + */ + void SetVideoEnabled( const TBool aEnabled ); + + /** + * Sets connected state. + */ + void SetConnectReady(); + + /** + * Reads local variations. + */ + void ReadVariationsL(); + + /** + * Gets camera orientations for primary and secondary camera. + * @see MVtEngMedia::TCameraOrientation + * @param aPrimaryCameraOrientation primary camera orientation. + * @param aSecondaryCameraOrientation secondary camera orientation. + */ + void GetCameraOrientations( + MVtEngMedia::TCameraOrientation& aPrimaryCameraOrientation, + MVtEngMedia::TCameraOrientation& aSecondaryCameraOrientation ) const; + + /** + * Checks if given bits is turned on in local variation. + * @param aBits bits to check + * @return ETrue if turned on + */ + TBool CheckBits( const TInt aBits ); + + /** + * Returns video quality frame rate configuration. + * @return Reference to video quality frame rate + * configuration. + */ + const TVtEngVideoQualityFrameRateConfig& + VideoQualityFrameRateConfig() const; + + /** + * Resets settings to default values. + */ + void ResetAll(); + + /** + * Registers interest on setting change. + * @param aId event to observe for + * @param aObserver setting observer + */ + void NotifyChangeL( + TSettingId aId, + MVtEngSettingObserver& aObserver ); + + /** + * Cancels observering setting changes. + * @param aId event to cancel + * @param aObserver setting observer + */ + void CancelNotifyChange( + TSettingId aId, + const MVtEngSettingObserver& aObserver ); + + /** + * Informs setting is dataport loaned or not yet. + * @param aLoaned TBool value is loaned (ETrue) or not (EFalse) + */ + void SetDataportLoaned( TBool aLoaned ); + + /** + * Checks if still image exists. + * @return ETrue if still image exists. + */ + TBool IsDefaultStillImageDefined(); + + + + /** + * Sets CLI. + * @since S60 5.0 + * @params aCLI call id and address (MSISDN) availability + */ + void SetCLI( const MVtEngSessionInfo::TCLI& aCLI ); + + /** + * Returns CLI + * @since S60 5.0 + * @param aCLI call id and address (MSISDN) availability + * @return ETrue if CLI is valid (stored in the first place) + */ + TBool GetCLI( MVtEngSessionInfo::TCLI& aCLI ) const; + + /** + * Sets dataport info + * @since S60 5.0 + * @param aPortInfo port name and number as string + */ + void SetDataportInfoL( const TDesC& aPortInfo ); + + /** + * Returns dataport info or NULL if not available yet + * @since S60 5.0 + * @return dataport info + */ + const TDesC* DataportInfo() const; + + public: // From MVtEngCRSettingObserver. + + /** + * Callback to notify changed setting. + * @param aUid changed Uid + * @param aId changed id + * @param aNewValue + */ + void HandleNotifyInt( const TUid aUid, const TUint32 aId, + TInt aNewValue ); + + /** + * Callback to notify changed setting. + * @param aUid changed Uid + * @param aId changed id + * @param aNewValue + */ + void HandleNotifyReal( const TUid aUid, const TUint32 aId, + TReal aNewValue ); + + /** + * Callback to notify changed setting. + * @param aUid changed Uid + * @param aId changed id + * @param aNewValue + */ + void HandleNotifyString( const TUid aUid, const TUint32 aId, + const TDesC16& aNewValue ); + + private: // New functions. + struct TObserverItem + { + // Callback interface. + MVtEngSettingObserver* iObserver; + // UID of item. + TUid iUid; + // Key of observer. + TPtrC iKey; + // Integer key, used with CR. + TInt iIntKey; + // Settings internal id. + TSettingId iId; + }; + + /** + * Finds observer item. + * @param aUid + * @param aKey + * @return observer item or NULL + */ + TObserverItem* FindItem( const TUid& aUid, const TDesC& aKey ) const; + + /** + * Finds observer item. + * @param aUid + * @param aKey + * @return observer item or NULL + */ + TObserverItem* FindItem( const TUid& aUid, const TInt& aKey ) const; + + /** + * Returns value as integer. + * @param aValue value to convert + * @return value as integer + */ + static TInt SettingAsTInt( const TDesC& aValue ); + + /** + * Derived class for internal book keeping. Engine knows whether + * CLI has been received from call handling + */ + struct TVtEngCLI : public MVtEngSessionInfo::TCLI + { + // Set to True when CLI received from call handling. + TBool iValid; + }; + + private: + + /** + * C++ default constructor. + */ + CVtEngSettings(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + /** + * Callback function to inform the observer. + * @param aAny pointer to instance of this class. + * @return KErrNone always. + */ + static TInt DoInformSelectVolumeObserver( TAny* aAny ); + + + /** + * Parses VQ frame rates read from cenrep. + */ + void ParseFrameRates( TVtEngVideoQualityFrameRateConfig& aVQFR, + const TDesC& aBuffer ); + + private: // Data + // Central Repository proxy. + CVtEngCRProxy* iCRProxy; + + // Settings data. + TVtEngVideoCallConfig iConfig; + + // Setting data observers. + CArrayFixFlat* iObserverItems; + + // File system handle. + RFs iFs; + + // Owned idle callback instance. + CIdle* iSelectVolumeIdle; + + // Observer for ESelectVolume. + MVtEngSettingObserver* iSelectVolumeObserver; + + // Observer for EDataportInfo + MVtEngSettingObserver* iDataportObserver; + + // Locally variated bits are read to this. + TInt iVariantReadOnlyValues; + + // If local variations are read + TBool iVariationsRead; + + // Video quality frame rate configuration holder + TVtEngVideoQualityFrameRateConfig iVQFRConfig; + + // If default still image is defined + TBool iDefaultStillImageDefined; + + // CLI information of video call. + TVtEngCLI iCLI; + + HBufC* iDataportInfo; + }; + +#include "CVtEngSettings.inl" + +#endif // CVTENGSETTINGS_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/CVtEngSettings.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/CVtEngSettings.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,64 @@ +/* +* 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: Settings inline methods +* +*/ + + +//Constants +const TInt8 KVTEngMaxVolume = 10; +const TInt8 KVTEngMinVolume = 0; + + +// ----------------------------------------------------------------------------- +// CVtEngSettings::GetMinVolume +// Return device min volume. +// +// ----------------------------------------------------------------------------- +// +inline TInt CVtEngSettings::MinVolume() const + { return KVTEngMinVolume; } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::GetMaxVolume +// Return event manager. +// +// ----------------------------------------------------------------------------- +// +inline TInt CVtEngSettings::MaxVolume() const + { return KVTEngMaxVolume; } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::ValidVolume +// Checks if the volume is within allowed limits +// +// ----------------------------------------------------------------------------- +// +inline TInt CVtEngSettings::ValidVolume( const TInt aVolume ) const + { + if ( aVolume < KVTEngMinVolume ) + { + return KVTEngMinVolume; + } + else if ( aVolume > KVTEngMaxVolume ) + { + return KVTEngMaxVolume; + } + else + { + return aVolume; + } + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/MVtEngAccessoryObserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/MVtEngAccessoryObserver.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,47 @@ +/* +* Copyright (c) 2004-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: Observer interface for indicating changes in accessories. +* +*/ + +#ifndef MVTENGACCESSORYOBSERVER_H +#define MVTENGACCESSORYOBSERVER_H + +// INCLUDES +#include +#include + +// CLASS DECLARATION + +/** +* Interface to indicate changes in accessories. +* +* @lib videoteleng +* @since 3.0 +*/ +class MVtEngAccessoryObserver + { + public: // New functions + + /** + * Callback to notify mode change in accessories. + * @param aMode new mode + * @param aActivated audio is on + */ + virtual void AccessoryModeChanged( const TAccMode& aMode, + const TBool aActivated ) = 0; + }; + +#endif // MVTENGACCESSORYOBSERVER_H +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/MVtEngCRSettingObserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/MVtEngCRSettingObserver.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,67 @@ +/* +* Copyright (c) 2004-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: Observer interface for indicating setting changes in Cent Rep +* +*/ + + +#ifndef MVTENGSETTINCRGOBSERVER_H +#define MVTENGSETTINGCROBSERVER_H + +// INCLUDES +#include + +// CLASS DECLARATION + +/** +* Observer interface for indicating setting changes +* +* @lib videoteleng.lib +* @since Series 60 3.0 +*/ +class MVtEngCRSettingObserver + { + public: // New functions + + /** + * Callback to notify changed setting + * @param aUid changed Uid + * @param aId changed id + * @param aNewValue new value + */ + virtual void HandleNotifyInt( const TUid aUid, const TUint32 aId, + TInt aNewValue ) = 0; + + /** + * Callback to notify changed setting + * @param aUid changed Uid + * @param aId changed id + * @param aNewValue new value + */ + virtual void HandleNotifyReal( const TUid aUid, const TUint32 aId, + TReal aNewValue ) = 0; + + /** + * Callback to notify changed setting + * @param aUid changed Uid + * @param aId changed id + * @param aNewValue new value + */ + virtual void HandleNotifyString( const TUid aUid, const TUint32 aId, + const TDesC16& aNewValue ) = 0; + }; + +#endif // MVTENGCRSETTINGOBSERVER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/MVtEngEventObserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/MVtEngEventObserver.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,51 @@ +/* +* 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: Observer interface for video telephony events. +* +*/ + + + +#ifndef MVTENGEVENTOBSERVER_H +#define MVTENGEVENTOBSERVER_H + +// INCLUDES +#include + +// FORWARD DECLARATIONS + +// CLASS DECLARATION + +/** +* Video telephony event observer interface. +* +* @lib videlteleng +* @since 2.6 +*/ +class MVtEngEventObserver + { + public: // New functions + + /** + * Handler method for events + * @param aEvent events defined in VtEngEvents.h + */ + virtual void HandleVtEventL( + TInt aEvent ) = 0; + + }; + +#endif // MVTENGEVENTOBSERVER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/MVtEngSettingObserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/MVtEngSettingObserver.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,50 @@ +/* +* 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: Observer interface for indicating setting changes +* +*/ + + + +#ifndef MVTENGSETTINGOBSERVER_H +#define MVTENGSETTINGOBSERVER_H + +// INCLUDES +#include "CVtEngSettings.h" + +// CLASS DECLARATION + +/** +* Observer interface for indicating setting changes +* +* @lib videoteleng +* @since 2.6 +*/ +class MVtEngSettingObserver + { + public: // New functions + + /** + * Handler for setting changed event + * @param aId id of setting + * @param aValue new value for the setting + */ + virtual void HandleSettingChangedL( + CVtEngSettings::TSettingId aId, + const TDesC& aValue ) = 0; + }; + +#endif // MVTENGSETTINGOBSERVER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/MVtEngSettingPSObserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/MVtEngSettingPSObserver.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,51 @@ +/* +* Copyright (c) 2004-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: Observer interface for indicating publish and subscribe +* changes +* +*/ + + + +#ifndef MVTENGSETTINGPSOBSERVER_H +#define MVTENGSETTINGPSOBSERVER_H + +// INCLUDES +#include + +// CLASS DECLARATION + +/** +* Observer interface for indicating P&S changes +* +* @lib videoteleng.lib +* @since Series 60 2.8 +*/ +class MVtEngSettingPSObserver + { + public: // New functions + + /** + * Handler for changed event. + * @param aUid uid of setting + * @param aKey id of setting + * @param aStatus status of completed AO operation + */ + virtual void HandleNotifyPSL( const TUid aUid, const TInt& aKey, + const TRequestStatus& aStatus ) = 0; + }; + +#endif // MVTENGSETTINGPSOBSERVER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/TVtEngType.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/TVtEngType.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,73 @@ +/* +* 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: Base class for data types that can be identified by an +* identifier (extension id). +* +*/ + + + +#ifndef TVTENGTTYPE_H +#define TVTENGTTYPE_H + +// INCLUDES +#include + +// DATA TYPES + +enum TVtEngTypeId + { + EVtEngTypeV1 = 0, + EVtEngTypeDtmf + }; + +// CLASS DECLARATION + +/** +* Base class for data types +* +* @lib videoteleng +* @since 2.6 +*/ +class TVtEngtType + { + public: // constructor + + inline TInt TypeId() const; + + protected: // constructors + /** + * C++ constructor that only for descendant classes may call. + */ + inline TVtEngtType( TVtEngTypeId aTypeId ); + + /** + * copy constructor + */ + inline TVtEngtType( const TVtEngtType& aType ); + + protected: // operators + + inline TVtEngtType& operator=( const TVtEngtType& aType ); + + protected: + // Extension id + TInt iTypeId; + }; + +#include "TVtEngType.inl" + +#endif // TVTENGTTYPE_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/TVtEngType.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/TVtEngType.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,31 @@ +/* +* 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: Inline methods for TVtEngtType. +* +*/ + + +inline TVtEngtType::TVtEngtType( TVtEngTypeId aTypeId ) + : iTypeId( aTypeId ) {} + +inline TInt TVtEngtType::TypeId() const { return iTypeId; } + +inline TVtEngtType::TVtEngtType( const TVtEngtType& aType ) + : iTypeId( aType.iTypeId ) {} + +inline TVtEngtType& TVtEngtType::operator=( const TVtEngtType& aType ) + { iTypeId = aType.iTypeId; + return *this; } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/VtEngConstants.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/VtEngConstants.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,49 @@ +/* +* 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: Constants for video telephony +* +*/ + + + +#ifndef VTENGCONSTANTS_H +#define VTENGCONSTANTS_H + +// INCLUDES +#include +#include +// CONSTANTS + +/** +* Remote video default size. +* QCIF where one pixel removed from left, top and right side. +*/ +//const TSize KVtEngRemoteVideoDefaultSize( 174, 143 ); + +/** +* View finder default size. +*/ +//const TSize KVtEngLocalVideoDefaultSize( 44, 36 ); + +/** +* Display mode +*/ +//const TDisplayMode KVtEngDisplayMode( EColor64K ); + +// MACROS + + +#endif // VTENGCONSTANTS_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/VtEngDefs.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/VtEngDefs.hrh Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,71 @@ +/* +* 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: engine macro define +* +*/ + + +#ifndef VTDEFS_HRH +#define VTDEFS_HRH + + +// DATA TYPES +// MACROS + + +#if defined(_DEBUG) || defined(WINS) +/** +* Debugging enabled always in debug builds +*/ +#define VTDEBUG +#else +/** +* Define here for release builds (disabled by default) +* Uncomment VTDEBUG below if you want to enable logging in UREL. +*/ +//#define VTDEBUG +#endif + +#ifdef VTDEBUG +/** +* 0 = No logging +* 1 = File logging +* 2 = RDebug +*/ +#if defined(__WINSCW) || defined(__WINS__) || defined (WINS) +// In emulator log to output window +#define VTLOGGING 1 +#else +/** +* In HW to which ever is desired (File (1) by default) +* Change VTLOGGING to 1 (file) or 2 (RDebug) as desired. +*/ +#define VTLOGGING 1 +#endif + +#else // !VTDEBUG + +// no logging +#define VTLOGGING 0 + +#endif //VTDEBUG + +#if VTLOGGING == 1 +#define VTFILELOGGING 1 +#else +#define VTFILELOGGING 0 +#endif + +#endif // VTDEFS_HRH +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/VtEngEvents.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/VtEngEvents.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,147 @@ +/* +* Copyright (c) 2004-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 telephony engine events +* +*/ + + + +#ifndef VTENGEVENTS_H +#define VTENGEVENTS_H + +// INCLUDES +#include + +// CONSTANTS + +const TInt KVtEngEventNone = -1; + +const TInt KVtEngEventBase = 0; + +/** +* Engine configuration events +*/ +const TInt KVtEngConfigureEventBase = KVtEngEventBase + 100; // 100 +const TInt KVtEngDurationSettingChanged = KVtEngConfigureEventBase + 1; +const TInt KVtEngInitializationProblem = KVtEngConfigureEventBase + 2; + +/** +* Engine media events +*/ +const TInt KVtEngMediaEventBase = KVtEngConfigureEventBase + 100; // 200 +const TInt KVtEngCameraChanged = KVtEngMediaEventBase + 1; +const TInt KVtEngSourceChanged = KVtEngMediaEventBase + 2; +const TInt KVtEngRemoteVideoPaused = KVtEngMediaEventBase + 3; +const TInt KVtEngRemoteVideoResumed = KVtEngMediaEventBase + 4; +const TInt KVtEngRemoteAudioPaused = KVtEngMediaEventBase + 5; +const TInt KVtEngRemoteAudioResumed = KVtEngMediaEventBase + 6; +const TInt KVtEngAudioMuted = KVtEngMediaEventBase + 7; +const TInt KVtEngAudioUnmuted = KVtEngMediaEventBase + 8; +const TInt KVtEngRemoteVideoStarted = KVtEngMediaEventBase + 10; +const TInt KVtEngRemoteVideoStopped = KVtEngMediaEventBase + 11; +const TInt KVtEngRemoteAudioStarted = KVtEngMediaEventBase + 12; +const TInt KVtEngRemoteRenderingProblem = KVtEngMediaEventBase + 14; +const TInt KVtEngLocalRenderingProblem = KVtEngMediaEventBase + 15; +const TInt KVtEngSourceCapsChanged = KVtEngMediaEventBase + 16; +const TInt KVtEngRemoteRenderStopped = KVtEngMediaEventBase + 17; +const TInt KVtEngViewFinderStopped = KVtEngMediaEventBase + 18; +const TInt KVtEngResolutionToSQCIF = KVtEngMediaEventBase + 19; +const TInt KVtEngResolutionToQCIF = KVtEngMediaEventBase + 20; + +// Problems in starting negotiation with remote end +const TInt KVtEngNegotiationProblem = KVtEngMediaEventBase + 21; + +// Initializing media component failed +const TInt KVtEngMediaInitFailure = KVtEngMediaEventBase + 22; + +// Begin initialization of image sharing (convert, scale, etc.) +const TInt KVtEngShareImageInitializeBegin = KVtEngMediaEventBase + 23; + +// End initialization of image sharing (convert, scale, etc.) +const TInt KVtEngShareImageInitializeEnd = KVtEngMediaEventBase + 24; + +// Informs status change in outgoing video channel. +const TInt KVtEngMediaOutgoingVideoChannelStatusChanged = + KVtEngMediaEventBase + 25; + +// Informs status change in outgoing audio channel. +const TInt KVtEngMediaOutgoingAudioChannelStatusChanged = + KVtEngMediaEventBase + 26; + +// Informs UI that decoding error happened during image share +const TInt KVtEngShareImageDecodingError = KVtEngMediaEventBase + 27; + +// Informs UI that volume is already maximum +const TInt KVtEngAudioVolumeMax = KVtEngMediaEventBase + 28; + +// Informs UI that volume is already minimum +const TInt KVtEngAudioVolumeMin = KVtEngMediaEventBase + 29; + +// Informs UI that Locvid layoutchange has been done +const TInt KVtEngLCHProviderSwitchDone = KVtEngMediaEventBase + 30; + +/** +* Engine audio events +*/ +const TInt KVtEngAudioEventBase = KVtEngMediaEventBase + 100; // 300 +const TInt KVtEngAudioOutputVolumeChanged = KVtEngAudioEventBase + 1; +const TInt KVtEngAudioRoutingChanged = KVtEngAudioEventBase + 2; +const TInt KVtEngAudioRoutingAvailabilityChanged = KVtEngAudioEventBase + 3; +const TInt KVtEngAudioRoutingIHFActivated = KVtEngAudioEventBase + 4; +const TInt KVtEngAudioRoutingIHFDeactivated = KVtEngAudioEventBase + 5; + +/** +* Engine session events +*/ +const TInt KVtEngSessionEventBase = KVtEngAudioEventBase + 100; // 400 +const TInt KVtEngSessionStateChanged = KVtEngSessionEventBase + 1; +const TInt KVtEngSessionAnswerPossible = KVtEngSessionEventBase + 2; +const TInt KVtEngSessionWaitingCallActive = KVtEngSessionEventBase + 3; +const TInt KVtEngSessionWaitingCallInactive = KVtEngSessionEventBase + 4; +const TInt KVtEngCLIAvailable = KVtEngSessionEventBase + 5; + +/** +* General events +*/ +const TInt KVtEngGeneralEventBase = KVtEngSessionEventBase + 100; // 500 +const TInt KVtEngResourceMemAllocFailure = KVtEngGeneralEventBase + 1; +const TInt KVtEngDtmfFailure = KVtEngGeneralEventBase + 2; +/** +* Remote supports UII DTMF. +*/ +const TInt KVtEngRemoteUIIDtmfSupport = KVtEngGeneralEventBase + 13; +/** +* Remote supports UII basic string. +*/ +const TInt KVtEngRemoteUIIBasicStringSupport = KVtEngGeneralEventBase + 14; +/** +* Remote supports UII IA5 string. +*/ +const TInt KVtEngRemoteUIIIA5StringSupport = KVtEngGeneralEventBase + 15; +/** +* Remote supports UII general string. +*/ +const TInt KVtEngRemoteUIIGeneralStringSupport = KVtEngGeneralEventBase + 6; + + +// Device is locked or unlocked (autolock feature) +const TInt KVtEngDeviceLockOn = KVtEngGeneralEventBase + 3; +const TInt KVtEngDeviceLockOff = KVtEngGeneralEventBase + 4; + +// Remote disconnected +const TInt KVtEngRemoteDisconnect = KVtEngGeneralEventBase + 5; + +#endif // VTENGEVENTS_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/VtEngPanic.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/VtEngPanic.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,63 @@ +/* +* 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: Panic definitions for video telephone engine. +* +*/ + + + +#ifndef CVTENGPANIC_H +#define CVTENGPANIC_H + +// INCLUDES +#include + +// CONSTANTS +_LIT( KVtEngPanicCategory, "VTENG" ); + +// DATA TYPES +enum TVtEngPanic + { + EVtEngPanicInvalidInitializationEntry, /** 0 */ + EVtEngPanicInvalidInitializationState, /** 1 */ + EVtEngPanicIncorrectUtility, /** 2 */ + EVtEngPanicTlsPanic, /** 3 */ + EVtEngPanicNoVideoProvider, /** 4 */ + EVtEngPanicInvalidSessionState, /** 5 */ + EVtEngPanicMediaHandlerOpStateFailure, /** 6 */ + EVtEngPanicInvalidFlag, /** 7 */ + EVtEngPanicInvalidPointer, /** 8 */ + EVtEngPanicInvalidAudioPointer, /** 9 */ + EVtEngPanicCommsDestructOnInvalidState, /** 10 */ + EVtEngPanicUnInitIncorrectOperation, /** 11 */ + EVtEngPanicDisconnectTimerExpired, /** 12 */ + EVtEngPanicInvalidDtmfState, /** 13 */ + EVtEngPanicInvalidBitmapHandle, /** 14 */ + EVtEngPanicInvalidPortRead, /** 15 */ + /** Too many asynchronous events pending in queue */ + EVtEngPanicInvalidTooManyPendingEvents, /** 16 */ + /** VT variation cenrep file is missing or corrupt */ + EVtEngPanicVtCenrepVariation, /** 17 */ + /** VT configuration cenrep file is missing or corrupt */ + EVtEngPanicVtCenrepConfiguration, /** 18 */ + EVtEngPanicInvalidVideoQualityValue, /** 19 */ + EVtEngPanicWrongMediatorSenderState /** 20 */ + }; + +// FUNCTION PROTOTYPES +void Panic( TVtEngPanic aPanic ); + +#endif // CVTENGPANIC_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/VtEngUtils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/VtEngUtils.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,200 @@ +/* +* Copyright (c) 2004-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 telephony engine TLS container. +* +*/ + + + +#ifndef VTENGUTILS_H +#define VTENGUTILS_H + +// INCLUDES +#include + + +// FORWARD DECLARATIONS +class CVtEngInitializer; +class CVtEngHandlerContainer; +class CVtEngDebug; +class CVtEngStateManager; +class CVtEngSettings; +class CVtEngEventManager; +class CVtEngCRProxy; +class CVtEngAccessoryHandler; +class CVtEngSATClient; +class CVtEngDeviceLockMonitor; +class CVtEngExtensions; +class CVtEngMdtrMessageListener; +class CVtEngMdtrCommandSender; + +// CLASS DECLARATION + +/** +* TLS container for pointers to essential objects. +* +* @lib videoteleng.lib +* @since Series 60 2.6 +*/ +NONSHARABLE_CLASS( CVtEngUtility ) : public CBase + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CVtEngUtility* NewL(); + + /** + * Destructor. + */ + virtual ~CVtEngUtility(); + + public: // New functions + + /** + * Creates SAT listener for updates. + */ + void StartSATListenL(); + + /** + * Returns engine initializer. + * @return initializer + */ + inline CVtEngInitializer& Initializer() const; + + /** + * Returns engine utility. + * @return utility + */ + static CVtEngUtility* EngineUtils(); + + /** + * Returns state manager. + * @return state manager + */ + static CVtEngStateManager* StateManager(); + + /** + * Returns event manager. + * @return event manager + */ + static CVtEngEventManager& EventManager(); + + /** + * Returns Central repository proxy. + * @return ref to CR proxy + */ + static CVtEngCRProxy& CRProxy(); + + /** + * Returns accessory listener. + * @return accessory handler + */ + static CVtEngAccessoryHandler& AccessoryHandler(); + + /** + * Returns settings. + * @return ref to settings + */ + static CVtEngSettings& Settings(); + + /** + * Returns mediator command sender. + * @return ref to command sender + */ + static CVtEngMdtrCommandSender& MediatorCommands(); + + /** + * Prepares the utility + * @param aHandlers handler container + * @param aStateManagerPtr state manager pointer ref + * @param aEventManagerPtr event manager pointer ref + * @param aExtensionPtr extension container pointer + */ + void PrepareL( + CVtEngHandlerContainer& aHandlers, + CVtEngStateManager*& aStateManagerPtr, + CVtEngEventManager*& aEventManagerPtr, + CVtEngExtensions* aExtensionPtr ); + + /** + * Notifies device lock to UI. + */ + void NotifyLockState(); + + /** + * Returns Extension container. + * @since S60 v3.2 + * @return pointer to extensions + */ + static CVtEngExtensions* Extensions(); + /** + * Starts listening mediator messages. + */ + void StartMediatorListenerL(); + + private: + + /** + * C++ default constructor. + */ + CVtEngUtility(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + private: // Data + + // Initializater for the engine + CVtEngInitializer* iEngineInit; + + // State manager pointer + CVtEngStateManager** iStateManager; + + // Settigs + CVtEngSettings* iSettings; + + // Event manager pointer + CVtEngEventManager** iEventManager; + + // Central repository interface + CVtEngCRProxy* iCRProxy; + + // Accessory handler + CVtEngAccessoryHandler* iAccessoryHandler; + + // SAT refresh listener + CVtEngSATClient* iSATClient; + + // Monitor for device lock state + CVtEngDeviceLockMonitor* iLockMonitor; + + // Extension pointer + CVtEngExtensions* iExtensions; + // For receiving Mediator commands and events + CVtEngMdtrMessageListener* iMdtrMessageListener; + + // For sending Mediator commands + CVtEngMdtrCommandSender* iMdtrCommandSender; + + }; + +#include "VtEngUtils.inl" + +#endif // VTENGUTILS_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/VtEngUtils.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/VtEngUtils.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,26 @@ +/* +* 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 telephony engine TLS container. +* +*/ + + +// MEMBER FUNCTIONS + +inline CVtEngInitializer& CVtEngUtility::Initializer() const + { + return *iEngineInit; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/cvtengincomingcallmonitor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/cvtengincomingcallmonitor.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,82 @@ +/* +* 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: Monitor for incoming call +* +*/ + + + +#ifndef C_VTENGINCOMINGCALLMONITOR_H +#define C_VTENGINCOMINGCALLMONITOR_H + +// INCLUDES +#include +#include "MVtEngSettingPSObserver.h" + +// FORWARD DECLARATIONS +class CVtEngPubSubsListener; + +// CLASS DECLARATION +/** +* Monitor for incoming call state. +* +* @lib videoteleng +* @since S60 v3.2 +*/ +NONSHARABLE_CLASS( CVtEngIncomingCallMonitor ) : public CBase, public MVtEngSettingPSObserver + { +public: // Constructors and destructor + + static CVtEngIncomingCallMonitor* NewL(); + + /** + * Destructor. + */ + virtual ~CVtEngIncomingCallMonitor(); + +public: // New functions + + /** + * Sends event to UI of current incoming call state + */ + void NotifyState() const; + +public: // From MVtEngSettingPSObserver + + /** + * @see MVtEngSettingPSObserver::HandleNotifyPSL + */ + void HandleNotifyPSL( const TUid aUid, const TInt& aKey, + const TRequestStatus& aStatus ); + +private: + /** + * C++ constructor. + */ + CVtEngIncomingCallMonitor(); + + /** + * 2nd phase constructor + */ + void ConstructL(); + +private: + + // Listener for incoming call state + CVtEngPubSubsListener* iIncomingCallListener; + }; + +#endif // C_VTENGINCOMINGCALLMONITOR_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/cvtengmdtrcommandsender.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/cvtengmdtrcommandsender.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,115 @@ +/* +* Copyright (c) 2008 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: Sender class for mediator commands +* +*/ + + +#ifndef C_VTENGMDTRCOMMANDSENDER_H +#define C_VTENGMDTRCOMMANDSENDER_H + +// INCLUDES + +#include +#include +#include "MVtEngEventObserver.h" + +// FORWARD DECLARATIONS +class CVtEngUtility; +class CVtEngOperation; +class CVtEngMdtrCommandSender; +class TVtMdtrStateIdle; +// CLASS DECLARATION + +/** +* Mediator command sender +* +* @lib videoteleng +* @since 5.0 +*/ +NONSHARABLE_CLASS( CVtEngMdtrCommandSender ) : + public CBase, + public MMediatorCommandResponseObserver, + public MVtEngEventObserver + { +public: // constructor and destructors + + /** + * two-phase constructor + */ + static CVtEngMdtrCommandSender* NewL( CVtEngUtility& aUtils ); + + // Destructor + ~CVtEngMdtrCommandSender(); + +public: // new methods + + /** + * Requests telephony to end video call + */ + void EndCall(); + + /** + * Requests telephony to fallback to voice call + */ + void VoiceFallback(); + + /** + * Requests telephony to make voice call + */ + void SwitchToVoiceL( CVtEngOperation& aOperation ); + + /** + * Notifies telephony about outgoing audio state change + */ + void NotifyOutgoingAudioState( const TBool aMicEnabled ); + + void SetSenderState( TVtMdtrStateIdle& aNewState ); + + +public: // from MMediatorCommandResponseObserver + + // responses are not handled but required by mediator api + virtual void CommandResponseL( TUid aDomain, + TUid aCategory, + TInt aCommandId, + TInt aStatus, + const TDesC8& aData ); + +public: // from MVtEngEventObserver + + // handles event accordint to ongoing operation + virtual void HandleVtEventL( TInt aEvent ); + +private: // constructors + + CVtEngMdtrCommandSender( CVtEngUtility& aUtils ); + + void ConstructL(); + +private: + // for switch to voice operation, signaled when mediator command is issued. + CVtEngOperation* iOperation; + + // for mediator command reception + CMediatorCommandInitiator* iMediatorInitiator; + + CVtEngUtility& iUtils; + + TVtMdtrStateIdle* iSenderState; + }; + +#endif // C_VTENGMDTRCOMMANDSENDER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/cvtengmdtrmessagelistener.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/cvtengmdtrmessagelistener.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,110 @@ +/* +* Copyright (c) 2008 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: Listener class for mediator commands +* +*/ + + +#ifndef C_VTENGMDTRMESSAGELISTENER_H +#define C_VTENGMDTRMESSAGELISTENER_H + +// INCLUDES + +//#include +#include +#include +#include "MVtEngEventObserver.h" +#include "CVtEngStateManager.h" +#include "MVtEngSessionInfo.h" + +// FORWARD DECLARATIONS +class CMediatorCommandResponder; +class CVtEngUtility; + +// CLASS DECLARATION + +/** +* Mediator command and event listener +* +* @lib videoteleng +* @since 5.0 +*/ +NONSHARABLE_CLASS( CVtEngMdtrMessageListener ) : + public CBase, + private MMediatorCommandObserver, + private MMediatorEventObserver, + private MVtEngEventObserver + + { +public: // constructor and destructors + + /** + * two-phase constructor + */ + static CVtEngMdtrMessageListener* NewL( CVtEngUtility& aUtils ); + + // Destructor + ~CVtEngMdtrMessageListener(); + +public: // from MMediatorCommandObserver + + virtual void MediatorCommandL( TUid aDomain, + TUid aCategory, + TInt aCommandId, + TVersion aVersion, + const TDesC8& aData ); + + virtual void CancelMediatorCommand( TUid aDomain, + TUid aCategory, + TInt aCommandId ); + +public: // from MMediatorEventObserver + + virtual void MediatorEventL( TUid aDomain, + TUid aCategory, + TInt aEventId, + const TDesC8& aData ); + +public: // from MVtEngEventObserver + + // handles deferred CLI event dispatching + virtual void HandleVtEventL( TInt aEvent ); + +private: // constructors + + CVtEngMdtrMessageListener( CVtEngUtility& aUtils ); + + void ConstructL(); + +private: // new functions + + void HandleCLIEventL( const TDesC8& aData ); + + TBool IsReadyForCLIEvent() const; + +private: + CVtEngUtility& iUtils; + + // for mediator command reception + CMediatorCommandResponder* iMediatorResponder; + + CMediatorEventConsumer* iMediatorEvents; + + // supported mediator commands + MediatorService::RCommandList iCommandList; + }; + +#endif // C_VTENGMDTRMESSAGELISTENER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Base/cvtengmediatorservice.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Base/cvtengmediatorservice.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,124 @@ +/* +* Copyright (c) 2008 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: Handles commands received via Mediator +* +*/ + + +#ifndef C_VTENGMEDIATORSERVICE_H +#define C_VTENGMEDIATORSERVICE_H + +// INCLUDES +#include +#include "mvtengoperationobserver.h" +#include "MVtEngEventObserver.h" +#include "vtengcommands.h" + +// FORWARD DECLARATIONS +class CMediatorCommandResponder; +class CVtEngOperation; +class CVtEngInternalOperation; +class CVtEngUtility; + +// CLASS DECLARATION + +/** +* Handles shutdown and audio commands from mediator. Deletes itself +* after service is completed. +* +* @lib videoteleng +* @since 5.0 +*/ +NONSHARABLE_CLASS( CVtEngMediatorService ) : + public CBase, + private MVtEngOperationObserver, + private MVtEngEventObserver + { +public: // constructor and destructors + + /** + * Starts requested service. + * @param aResponder target for mediator response + * @param aUtils engine internal utility + * @param aCommandId service to start + */ + static void StartLD( + CMediatorCommandResponder& aResponder, + CVtEngUtility& aUtils, + const TUid aCategory, + const TInt aCommandId ); + + ~CVtEngMediatorService(); + +public: // from MVtEngOperationObserver + + /** + * @see MVtEngOperationObserver + */ + virtual void SetOperation( CVtEngOperation* aActiveOp ); + + /** + * @see MVtEngOperationObserver + */ + virtual void CommandCompleteL( + const TVtEngCommandId aCommand, + const TInt aResult ); + +public: // from MVtEngEventObserver + + // handles event according to ongoing operation + virtual void HandleVtEventL( TInt aEvent ); + +private: // c++ constructor + + CVtEngMediatorService( + CMediatorCommandResponder& aResponder, + CVtEngUtility& aUtils, + const TUid aCategory, + const TInt aCommandId ); + +private: + + // prepares and starts requested operation + void ConstructAndDoServiceL(); + + // sends response to shutdown command if shutdown already ongoing + TBool IsShuttingDown() const; + + void StartOperationL( const TVtEngCommandId aCommand ); + + // Sends mediator response for shutdown or audio mute/unmute commands. + // deletes itself if not waiting internal command response. + void SendMediatorResponseD( const TBool aDeleteThis ); + +private: + CMediatorCommandResponder& iResponder; + + CVtEngInternalOperation* iOperation; + + CVtEngUtility& iUtils; + + // mediator Category [KCatVideotelInternalCommands, KCatPhoneToVideotelCommands] + TUid iCategory; + + // mediator command [shutdown, mute mic, unmute mic] + TInt iCommandId; + + // this is used for controlling + TInt iServiceStatus; + }; + +#endif // T_VTENGMEDIATORSERVICE_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Commands/CVtEngCommandHandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Commands/CVtEngCommandHandler.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,199 @@ +/* +* 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: Command handler of the engine. +* +*/ + + + +#ifndef CVTENGCOMMANDHANDLER_H +#define CVTENGCOMMANDHANDLER_H + +// INCLUDES +#include +#include "MVtEngCommandHandler.h" +#include "mvtengoperationobserver.h" + +// FORWARD DECLARATIONS +class CVtEngHandlerContainer; +class CVtEngOperation; + +// CLASS DECLARATION + +/** +* Handler for commands from client. +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtEngCommandHandler ) : public CBase, + public MVtEngCommandHandler, + public MVtEngOperationObserver + { + public: // constructor and destructors + + static CVtEngCommandHandler* NewL( + CVtEngHandlerContainer& aHandlers ); + + virtual ~CVtEngCommandHandler(); + + public: // from MVtEngCommandHandler + + /** + * @see MVtEngCommandHandler + */ + virtual void ExecuteL( + const TVtEngCommandId aCommand, + TDesC8* aParams ); + + /** + * @see MVtEngCommandHandler + */ + virtual TInt CancelCommand( const TVtEngCommandId aCommandId ); + + /** + * @see MVtEngCommandHandler + */ + virtual TInt GetCommandCaps( + const TVtEngCommandId aCommand ); + + /** + * @see MVtEngCommandHandler + */ + virtual TVtEngCommandId PendingCommand(); + + /** + * @see MVtEngCommandHandler + */ + virtual TVtEngCommandId InvalidCommand(); + + /** + * @see MVtEngCommandHandler + */ + virtual void AddObserverL( MVtEngCommandObserver& aObserver ); + + /** + * @see MVtEngCommandHandler + */ + virtual void RemoveObserver( MVtEngCommandObserver& aObserver ); + + public: // from MVtEngOperationObserver + + /** + * Handles command completion. + * @param aCommand command id + * @param aResult Symbian OS error code. + */ + virtual void CommandCompleteL( + const TVtEngCommandId aCommand, + const TInt aResult ); + + /** + * Sets pending asynch operation + * @param aActiveOp pending operation or NULL. + */ + virtual void SetOperation( CVtEngOperation* aActiveOp ); + + private: // constructors + + /** + * Second phase constructor + */ + void ConstructL(); + + /** + * c++ constructor + */ + CVtEngCommandHandler( CVtEngHandlerContainer& aHandlers ); + + private: + + void AddToPoolL( TVtEngCommandId aCommand ); + + /** + * Validates command + */ + void ValidateL( + const TVtEngCommandId aCommandId, + TDesC8* aParams ); + + /** + * Check if command is async. + */ + void CheckAsynchronity( + const TVtEngCommandId aCommandId, + TInt& aCaps ); + + /** + * Check if command is supported. + */ + void CheckSupport( + const TVtEngCommandId aCommandId, + TInt& aCaps ); + + /** + * Check if command is applicable in current state. + */ + void CheckState( + const TVtEngCommandId aCommandId, + TInt& aCaps ); + + private: // command pool + + struct TVtOpItem + { + TVtEngCommandId iId; + CVtEngOperation* iOperation; + }; + /** + * Command pool for commands instantiated at construction + * time to guarantee certain operations. + */ + NONSHARABLE_CLASS( CVtEngCmdPool ): public CArrayPtrFlat + { + public: // constructor and destructor + + // Constructor + CVtEngCmdPool( TInt aGranularity ); + + // Destructor + ~CVtEngCmdPool(); + + public: // data structures + + + public: // new methods + + /** + * Returns operation stored in the pool. + * @param aId command id + * @return operation or NULL if not found. + */ + CVtEngOperation* Get( const TVtEngCommandId aId ); + + }; + + private: // Data members + + RPointerArray iObservers; + CVtEngHandlerContainer& iHandlers; + CVtEngOperation* iActiveOp; + CVtEngCmdPool* iCommandPool; + TVtEngCommandId iInvalidCommandId; + + }; + +#endif //CVTENGCOMMANDHANDLER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Commands/CVtEngOperation.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Commands/CVtEngOperation.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,158 @@ +/* +* 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: Operation base class. +* +*/ + + + +#ifndef CVTENGOPERATION_H +#define CVTENGOPERATION_H + +// INCLUDES +#include +#include "vtengcommands.h" + +// FORWARD DECLARATIONS +class CVtEngCommandHandler; +class CVtEngHandlerContainer; +class MVtEngOperationObserver; + +/** +* Operation base class. +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtEngOperation ) : public CBase + { + public: // constructor and destructors + + /** + * two-phase constructor + * @param aCommandId command id + * @param aHandlers handler container + * @param aObserver observer called back when operation is completed + * @param aDelete if ETrue command deletes itself after completion + */ + static CVtEngOperation* NewL( + TVtEngCommandId aCommandId, + CVtEngHandlerContainer& aHandlers, + MVtEngOperationObserver& aObserver, + TBool aDelete = ETrue ); + + /** + * Destructor + */ + ~CVtEngOperation( ); + + public: // new functions + + /** + * Performs operations. + * @return ETrue is operation is complete (i.e. sync). + */ + virtual TBool ExecuteL( TDesC8* aParams ); + + /** + * Cancels pending command. + * @return ETrue if cancelled was succesfull or there + * is nothing to cancel. + */ + TBool Cancel(); + + /** + * Returns command identifier. + * @return command identifier + */ + inline TVtEngCommandId Command() const; + + /** + * Returns command parameter buffer. + * @return parameter buffer + */ + inline const TDesC8* Parameters() const; + + /** + * Notifies observer on completion. + * @param aResult Symbian OS error code + */ + virtual void HandleOpComplete( const TInt aResult ); + + protected: // new functions + + /** + * + */ + TBool OfferExecuteSyncL( TDesC8* aParams ); + + protected: + /** + * c++ constructor + */ + CVtEngOperation( + TVtEngCommandId aCommandId, + CVtEngHandlerContainer& aHandlers, + MVtEngOperationObserver& aCommandHandler, + TBool aDelete ); + + /** + * Handles asynchronous operation complete + */ + static TInt ASyncHandleOpComplete( TAny* aPtr ); + + protected: + + // Command identifier + const TVtEngCommandId iCommand; + + // Handler container + CVtEngHandlerContainer& iHandlers; + + // observer for command response + MVtEngOperationObserver& iObserver; + + // Parameter + TDesC8* iParams; + + // Delete command when complete + TBool iDelete; + + // Pointer to asynchronous callback + CAsyncCallBack* iAsyncCallback; + + // Asynchronous callback error identifier + TInt iAsyncErr; + }; + +/** +* Utility class for unpacking data type with descriptor data. +* @lib videoteleng +* @since 2.6 +*/ +template +class TVtEngOpParamUtil + { + public: + /** + * Sets parameter in aDes to aRef. + */ + inline void static Set( T& aRef , const CVtEngOperation& aOp ); + }; + +#include "CVtEngOperation.inl" + +#endif // CVTENGOPERATION_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Commands/CVtEngOperation.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Commands/CVtEngOperation.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,45 @@ +/* +* 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: Operation inline methods +* +*/ + + +// ============================ MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// CVtEngOperation::Command +// ----------------------------------------------------------------------------- +inline TVtEngCommandId CVtEngOperation::Command() const { return iCommand; } + +// ----------------------------------------------------------------------------- +// CVtEngOperation::Parameters +// ----------------------------------------------------------------------------- +inline const TDesC8* CVtEngOperation::Parameters() const { return iParams; } + +// ----------------------------------------------------------------------------- +// TVtEngOpParamUtil::Set +// ----------------------------------------------------------------------------- +template +inline void TVtEngOpParamUtil::Set( + T& aRef, + const CVtEngOperation& aOp ) + { + TPckgC pckg( aRef ); + pckg.Set( *aOp.Parameters() ); + aRef = pckg(); + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Commands/MVtEngCommandHandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Commands/MVtEngCommandHandler.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,122 @@ +/* +* 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: Command handler interface of the engine. +* +*/ + + + +#ifndef MVTENGCOMMANDHANDLER_H +#define MVTENGCOMMANDHANDLER_H + +// INCLUDES +#include +#include "vtengcommands.h" + +// CONSTANTS + +// MACROS + +// DATA TYPES + +// FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS + +class MVtEngCommandObserver; + +// CLASS DECLARATION + +/** +* Handler for commands from client. +* +* @lib videoteleng +* @since 2.6 +*/ +class MVtEngCommandHandler + { + public: + + /** + * EAttribAsync + * command is asynchronous. + * EAttribEnabled + * Command can be executed at the moment. + * EAttribSupported + * Command is supported by the engine. + */ + enum TCommandCaps + { + EAttribAsync = 0x00000001, + EAttribEnabled = 0x00000002, + EAttribSupported = 0x00000004 + }; + + /** + * Excecutes a command. This function leaves KErrNotReady + * if engine is in such a state that command cannot be + * executed. + * + * @param aCommandId command to be executed. + * @param aParams command parameters, NULL if command + * does not require any. + */ + virtual void ExecuteL( + const TVtEngCommandId aCommandId, + TDesC8* aParams ) = 0; + + /** + * Cancels a command. + * @param aCommandId command to cancel. + * @return KErrNotFound if command is not pending. + */ + virtual TInt CancelCommand( const TVtEngCommandId aCommandId ) = 0; + + /** + * Returns capabilities of a command. + * @return command caps + */ + virtual TInt GetCommandCaps( + const TVtEngCommandId aCommand ) = 0; + + /** + * Returns pending command. + * @return pending command + */ + virtual TVtEngCommandId PendingCommand() = 0; + + /** + * Returns invalid command. + * @return invalid command + */ + virtual TVtEngCommandId InvalidCommand() = 0; + + /** + * Sets command observer. First call on this is guaranteed + * to succeed. + * @param aObserver command observer. + */ + virtual void AddObserverL( MVtEngCommandObserver& aObserver ) = 0; + + /** + * Removes a command observer or if non-op if specified observer + * is not found. + * @param aObserver command observer to be removed. + */ + virtual void RemoveObserver( MVtEngCommandObserver& aObserver ) = 0; + }; + +#endif //MVTENGCOMMANDHANDLER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Commands/MVtEngCommandObserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Commands/MVtEngCommandObserver.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,62 @@ +/* +* 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: Observer for asynchronous commands. +* +*/ + + + +#ifndef MVTENGCOMMANDOBSERVER_H +#define MVTENGCOMMANDOBSERVER_H + +// INCLUDES +#include + +// CONSTANTS + +// MACROS + +// DATA TYPES + +// FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS + + +// CLASS DECLARATION + +/** +* Observer for asynchronous commands. +* +* @since 2.6 +*/ +class MVtEngCommandObserver + { + public: // new functions + + /** + * Callback for command completion. + * @param aCommand completed command. This is + * same instance as passed in MVtEngCommandHandler::ExecuteL. + * Client may delete the command. + * @param aError Symbian OS error code. + */ + virtual void HandleVTCommandPerformedL( + TVtEngCommandId aCommand, + const TInt aError ) = 0; + }; + +#endif // MVTENGCOMMANDOBSERVER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Commands/TVtEngOperationUtils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Commands/TVtEngOperationUtils.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,169 @@ +/* +* 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: Handler utili +* +* +*/ + + + +#ifndef TVTENGOPERATIONUTILS +#define TVTENGOPERATIONUTILS + +// INCLUDES +#include +#include "vtengcommands.h" + + +// FORWARD DECLARATIONS +class CVtEngHandlerContainer; +class CVtEngOperation; +// CLASS DECLARATION + +/** +* Handles rendering operation +* +* @lib videoteleng +* @since 2.6 +*/ +class TVtEngRenderUtil + { + public: + + static void HandleL( + CVtEngOperation& aOperation, + CVtEngHandlerContainer& aHandlers ); + + static void Cancel( + CVtEngOperation& aOperation, + CVtEngHandlerContainer& aHandlers ); + }; + +/** +* Handles audio routing operation. +* +* @lib videoteleng +* @since 2.6 +*/ +class TVtEngAudioRoutingUtil + { + public: + + /** + * + * @param aOperation operation + */ + static void HandleL( + CVtEngOperation& aOperation ); + }; + + +/** +* Handles audio playback operation. +* +* @lib videoteleng +* @since 2.6 +*/ +class TVtEngAudioPlaybackUtil + { + public: + + static void HandleL( + CVtEngOperation& aOperation, + CVtEngHandlerContainer& aHandlers ); + }; + +/** +* Handles media transport operation like pausing/resuming. +* +* @lib videoteleng +* @since 2.6 +*/ +class TVtEngMediaTransportUtil + { + public: + + static void HandleL( + CVtEngOperation& aOperation, + CVtEngHandlerContainer& aHandlers ); + }; + +/** +* +* +* @lib videoteleng +* @since 2.6 +*/ +class TVtEngViewFinderConfigureUtil + { + public: + + static void HandleL( + CVtEngOperation& aOperation, + CVtEngHandlerContainer& aHandlers ); + }; + +/** +* +* +* @lib videoteleng +* @since 2.6 +*/ +class TVtEngCameraConfigUtil + { + public: + + static void HandleL( + CVtEngOperation& aOperation, + CVtEngHandlerContainer& aHandlers ); + }; + +/** +* Handles engine initialization. +* +* @lib videoteleng +* @since 2.6 +*/ +class TVtEngEngineInitUtil + { + public: + + static void HandleL( + CVtEngOperation& aOperation, + CVtEngHandlerContainer& aHandlers ); + + static void Cancel( CVtEngOperation& aOperation ); + }; + + +/** +* Handles extension operations. +* +* @lib videoteleng +* @since S60 v3.2 +*/ +class TVtEngExtensionUtil + { + public: + + /** + * Handles extension operations + * @param aOperation operation + */ + static void HandleL( + CVtEngOperation& aOperation ); + }; +#endif // TVTENGOPERATIONUTILS + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Commands/cvtenginternaloperation.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Commands/cvtenginternaloperation.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,88 @@ +/* +* Copyright (c) 2008 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: Operation class for commands not originated by UI but +* engine itself. +* +*/ + + +#ifndef C_VTENGINTERNALOPERATION_H +#define C_VTENGINTERNALOPERATION_H + +// INCLUDES +#include +#include "CVtEngOperation.h" + +// FORWARD DECLARATIONS +class CVtEngCommandHandler; +class CVtEngHandlerContainer; + +/** +* Class for handling operation (command) originated engine itself. +* Deviation from base class behavior: does not set itself as "active +* operation" in command handler (observer of the operation). Also +* response is given in synchronous manner. +* +* @lib videoteleng +* @since S60 5.0 +*/ +NONSHARABLE_CLASS( CVtEngInternalOperation ) : public CVtEngOperation + { +public: // constructor and destructors + + /** + * two-phase constructor + * @param aCommandId command id + * @param aHandlers handler container + * @param aCommandHandler command handler + * @param aDelete if ETrue command deletes itself after completion + * @return internal operation + */ + static CVtEngInternalOperation* NewL( + TVtEngCommandId aCommandId, + CVtEngHandlerContainer& aHandlers, + MVtEngOperationObserver& aObserver, + TBool aDelete = ETrue ); + + /** + * Destructor + */ + ~CVtEngInternalOperation( ); + +public: // from CVtEngOperation + + /** + * @see CVtEngOperation + */ + virtual TBool ExecuteL(); + + /** + * @see CVtEngOperation + */ + virtual void HandleOpComplete( const TInt aResult ); + +private: + /** + * c++ constructor + */ + CVtEngInternalOperation( + TVtEngCommandId aCommandId, + CVtEngHandlerContainer& aHandlers, + MVtEngOperationObserver& aObserver, + TBool aDelete ); + }; + +#endif // C_VTENGINTERNALOPERATION_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Commands/mvtengoperationobserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Commands/mvtengoperationobserver.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,50 @@ +/* +* Copyright (c) 2008 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: Observer interface for engine operations +* +*/ + + +#ifndef M_VTENGOPERATIONOBSERVER_H +#define M_VTENGOPERATIONOBSERVER_H + +// INCLUDES +#include +#include "vtengcommands.h" + +// FORWARD DECLARATIONS +class CVtEngOperation; + +// CLASS DECLARATION + +/** +* Interface for setting active operation and responding to commands +* +* @lib videoteleng +* @since 5.0 +*/ +class MVtEngOperationObserver + { +public: + + virtual void SetOperation( CVtEngOperation* aActiveOp ) = 0; + + virtual void CommandCompleteL( + const TVtEngCommandId aCommand, + const TInt aResult ) = 0; + }; + +#endif // M_VTENGOPERATIONOBSERVER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Commands/vtengcommands.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Commands/vtengcommands.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,300 @@ +/* +* 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 telephony engine command identifiers. +* +*/ + + + +#ifndef CVTENGCOMMANDS_H +#define CVTENGCOMMANDS_H + +// INCLUDES +#include + +// DATA TYPES +typedef TInt TVtEngCommandId; + +// CONSTANTS + + +const TInt KVtEngCommandNone = -1; + +const TInt KVtEngCommandBase = 0; + +/** +* Configuration commands +*/ +const TInt KVtEngConfigureCommandBase = KVtEngCommandBase + 100; + +// Allocates essential resources when application starts up +const TInt KVtEngInitializeEngine = KVtEngConfigureCommandBase + 1; + +// Resets engine. Use when all video calls are ended. +const TInt KVtEngResetEngine = KVtEngConfigureCommandBase + 2; + +/** +* Makes voice call to existing peer. +*/ +const TInt KVtEngSwitchToVoice = KVtEngConfigureCommandBase + 4; + +// Allocates essential resources when application starts up - TEST MODE +const TInt KVtEngInitializeEngineDiag = KVtEngConfigureCommandBase + 50; + +// Allocates essential resources when application starts up - TEST MODE +const TInt KVtEngInitializeEngineTest = KVtEngConfigureCommandBase + 51; +// + +/** +* Media commands for controlling local display and sending +* of media (audio/video) to the peer. +*/ +const TInt KVtEngMediaCommandBase = KVtEngConfigureCommandBase + 100; // 200 + +// Actual commands + +/** +* Selects source, +* @see MVtEngMedia::TMediaSource for command parameters. +*/ +const TInt KVtEngSetSource = KVtEngMediaCommandBase + 1; + +/** +* Async +* Initializes default or selected camera. +* Does not take parameters. See KVtEngSetSource command parameters. +*/ +const TInt KVtEngPrepareCamera = KVtEngMediaCommandBase + 2; + +/** +* prepares engine to pass view finder frames to UI +* @see MVtEngMedia::TVtEngViewFinderConfig for command parameters. +*/ +const TInt KVtEngPrepareViewFinder = KVtEngMediaCommandBase + 3; + +/** +* Sync +* prepares engine to render view finder frames using DSA +* @see MVtEngMedia::TRenderingOptionsDSA for command parameters. +*/ +const TInt KVtEngPrepareViewFinderDSA = KVtEngMediaCommandBase + 4; + +/** +* Async +* Starts view finder +* @see MVtEngMedia::TRenderingOptionsDSA for command parameters. +*/ +const TInt KVtEngStartViewFinder = KVtEngMediaCommandBase + 5; + +/** +* Async +* View finder control commands, do not take parameters. +*/ +const TInt KVtEngPauseViewFinder = KVtEngMediaCommandBase + 6; +const TInt KVtEngStopViewFinder = KVtEngMediaCommandBase + 7; + +/** +* Prepares engine for rendering video (with DSA) from peer +* @see MVtEngMedia::TRenderingOptionsDSA for command parameters. +*/ +const TInt KVtEngPrepareRemoteRenderDSA = KVtEngMediaCommandBase + 8; + +/** +* Prepares engine for rendering video from peer +* @see MVtEngMedia::TVtEngViewFinderConfig for command parameters. +*/ +const TInt KVtEngPrepareRemoteRender = KVtEngMediaCommandBase + 9; + +/** +* Remote video rendering commands, do not take parameters. +*/ +const TInt KVtEngStartRenderRemote = KVtEngMediaCommandBase + 10; +const TInt KVtEngPauseRenderRemote = KVtEngMediaCommandBase + 11; +const TInt KVtEngStopRenderRemote = KVtEngMediaCommandBase + 12; + +/** +* Media transport control commands, do not take parameters. +*/ +// Audio +const TInt KVtEngMuteOutgoingAudio = KVtEngMediaCommandBase + 13; +const TInt KVtEngUnmuteOutgoingAudio = KVtEngMediaCommandBase + 14; +const TInt KVtEngPauseIncomigAudio = KVtEngMediaCommandBase + 15; +const TInt KVtEngResumeIncomigAudio = KVtEngMediaCommandBase + 16; + +/** +* Sync. +* Sets video source provider zoom step. +* Parameter is TInt from zero to maximum zoom step. +* @see MVtEngMedia::GetMaxZoomStep. +*/ +const TInt KVtEngSetZoomStep = KVtEngMediaCommandBase + 17; + +/** +* Sync +* Sets size of remote video, parameter is of type TSize +*/ +const TInt KVtEngSetRemoteVideoSize = KVtEngMediaCommandBase + 18; + +/** +* Sets UI foreground state (ETrue or EFalse) +*/ +const TInt KVtEngSetUIForeground = KVtEngMediaCommandBase + 19; + +/** +* Freeze provider video. +*/ +const TInt KVtEngFreeze = KVtEngMediaCommandBase + 20; + +/** +* Unfreeze provider video. +*/ +const TInt KVtEngUnfreeze = KVtEngMediaCommandBase + 21; + +/** +* Adjusts video quality. +*/ +const TInt KVtEngSetVideoQuality = KVtEngMediaCommandBase + 22; + +/** +* Initialize image sharing. +*/ +const TInt KVtEngInitializeShareImage = KVtEngMediaCommandBase + 23; + +/** +* Start image sharing (must be initialized first). +*/ +const TInt KVtEngStartShareImage = KVtEngMediaCommandBase + 24; + +/** +* Stop image sharing. +*/ +const TInt KVtEngStopShareImage = KVtEngMediaCommandBase + 25; + +/** +* Sync +* prepares engine to render view finder frames using DP +* @see MVtEngMedia::TRenderingOptionsDP for command parameters. +*/ +const TInt KVtEngPrepareViewFinderDP = KVtEngMediaCommandBase + 26; + +/** +* Prepares engine for rendering video (with DP) from peer +* @see MVtEngMedia::TRenderingOptionsDP for command parameters. +*/ +const TInt KVtEngPrepareRemoteRenderDP = KVtEngMediaCommandBase + 27; + +/** +* Engine reintializes camera instance when layout change happens and active +* provider is onboard camera. If anyother provider is selected, then nothing +* will be done by the engine. +*/ +const TInt KVtEngHandleLayoutChange = KVtEngMediaCommandBase + 28; + +/** + * Sync + * Request update last remote video frame through MVtEngFrameObserver::vtSetFrame + */ +const TInt KVtEngRequestLastRemoteFrame = KVtEngMediaCommandBase + 29; + + +const TInt KVtEngPrepareRemoteRenderNGA = KVtEngMediaCommandBase + 30; + +/** +* Audio control +*/ +const TInt KVtEngAudioCommandBase = KVtEngMediaCommandBase + 100; // 300 + +// Actual commands + +/** +* Sets output volume level [1..10] for active audio device +*/ +const TInt KVtEngSetAudioVolume = KVtEngAudioCommandBase + 1; + +/** +* Audiorouting command +*/ +const TInt KVtEngSetAudioRouting = KVtEngAudioCommandBase + 2; + +/** +* Increase volume by one step. +*/ +const TInt KVtEngIncreaseAudioVolume = KVtEngAudioCommandBase + 3; + +/** +* Decrease volume by one step. +*/ +const TInt KVtEngDecreaseAudioVolume = KVtEngAudioCommandBase + 4; + +/** +* Session commands +*/ +const TInt KVtEngSessionCommandBase = KVtEngAudioCommandBase + 100; + +// Actual commands + +/** +* Terminates session and tears down connection +*/ +const TInt KVtEngTerminateSession = KVtEngSessionCommandBase + 1; + +const TInt KVtEngSendDtmf = KVtEngSessionCommandBase + 2; + +/** +* Starts sending a DTMF tone. Takes TChar parameter. Sync +*/ +const TInt KVtEngStartDtmfTone = KVtEngSessionCommandBase + 3; + +/** +* Stops previously started tone. Does not take parametners. Sync +*/ +const TInt KVtEngStopDtmfTone = KVtEngSessionCommandBase + 4; + +/** +* Remote supports UII DTMF. +*/ +const TInt KVtEngSetUIIDtmfSupport = KVtEngSessionCommandBase + 5; + +/** +* Remote supports UII basic string. +*/ +const TInt KVtEngSetUIIBasicStringSupport = KVtEngSessionCommandBase + 6; + +/** +* Remote supports UII IA5 string. +*/ +const TInt KVtEngSetUIIIA5StringSupport = KVtEngSessionCommandBase + 7; + +/** +* Remote supports UII general string. +*/ +const TInt KVtEngSetUIIGeneralStringSupport = KVtEngSessionCommandBase + 8; + + +/** +* Extension commands. +*/ +const TInt KVtEngExtensionCommandBase = KVtEngSessionCommandBase + 100; //500 +const TInt KVtEngSetContrast = KVtEngExtensionCommandBase + 1; +const TInt KVtEngSetBrightness = KVtEngExtensionCommandBase + 2; +const TInt KVtEngSetWhiteBalance = KVtEngExtensionCommandBase + 3; +const TInt KVtEngSetColorTone = KVtEngExtensionCommandBase + 4; +#if defined ( RD_VT_RTF ) +const TInt KVtEngStartRecord = KVtEngExtensionCommandBase + 5; +const TInt KVtEngStopRecord = KVtEngExtensionCommandBase + 6; +#endif // RD_VT_RTF + +#endif // CVTENGCOMMANDS_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Extensions/CVtEngCameraPreferences.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Extensions/CVtEngCameraPreferences.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,153 @@ +/* +* 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: Videoteleng Camera Preferences extension +* +*/ + + +#ifndef CVTENGCAMERAPREFERENCES_H +#define CVTENGCAMERAPREFERENCES_H + +// INCLUDES +#include "VtEngPanic.h" +#include "CVtEngSettings.h" +#include "VtEngUtils.h" +#include "CVtEngOperation.h" + +#include +#include + +#include +#include "CVtEngExtensionBase.h" + +// FORWARD DECLARATIONS +class CVSDataProvider; +class MVtEngCameraPreferencesObserver; + +// CLASS DECLARATION + +/** +* Videoteleng extension base class. +* +* @lib videoteleng.lib +* @since S60 v3.2 +*/ +NONSHARABLE_CLASS ( CVtEngCameraPreferences ): public CVtEngExtensionBase, + public MVtEngCameraPreferences + { + public: //Constructor and destructor. + + /** + * Symbian two-phase constructor. + * @return engine extension instance + */ + static CVtEngCameraPreferences* NewL(); + + /** + * Destructor. + */ + ~CVtEngCameraPreferences(); + + public: // from base class CVtEngExtensionBase + + /** + * @see CVtEngExtensionBase::GetInterface + */ + virtual TAny* GetInterface(); + + /** + * @see CVtEngExtensionBase::HandleL + */ + virtual TBool HandleL( CVtEngOperation* aOp ); + + /** + * @see CVtEngExtensionBase::ValidateCommand + */ + virtual TBool ValidateCommand( const TVtEngCommandId aCommandId ); + + public: // from base class MVtEngCameraPreferences + + /** + * @see MVtEngCameraPreferences::GetColorTone + */ + virtual TInt GetColorTone( + MVtEngCameraPreferences::TColorTone& aColortone ) const; + + /** + * @see MVtEngCameraPreferences::GetSupportedColorTones + */ + virtual TInt GetSupportedColorTones( + TUint32& aSupportedColorTones ) const; + + /** + * @see MVtEngCameraPreferences::GetWhiteBalance + */ + virtual TInt GetWhiteBalance( + MVtEngCameraPreferences::TWhiteBalance& aWhiteBalance ) const; + + /** + * @see MVtEngCameraPreferences::GetSupportedWhiteBalanceModes + */ + virtual TInt GetSupportedWhiteBalanceModes( + TUint32& aWhiteBalance ) const; + + /** + * @see MVtEngCameraPreferences::GetBrightness + */ + virtual TInt GetBrightness( TInt& aBrightness) const; + + /** + * @see MVtEngCameraPreferences::GetContrast + */ + virtual TInt GetContrast( TInt& aContrast ) const; + + public: + + /** + * Sets data provider to camera prefefrences + * @param aProvider pointer to current active data provider + * @param aObserver reference to observer + */ + virtual void SetProvider( CVSDataProvider* aProvider, + MVtEngCameraPreferencesObserver& aObserver ); + + /** + * Detaches observer from preference instance. + * @param aObserver reference to observer + */ + void Detach( MVtEngCameraPreferencesObserver& aObserver ); + + private: + + /* + * C++ default constructor. + */ + CVtEngCameraPreferences(); + + /** + * Symbian two-phase constructor. + */ + void ConstructL(); + + private: + + // Video source data provider pointer + CVSDataProvider* iProvider; + + // Preference observer pointer + MVtEngCameraPreferencesObserver* iObserver; + + }; + +#endif //CVTENGCAMERAPREFERENCES_H \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Extensions/CVtEngExtensionBase.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Extensions/CVtEngExtensionBase.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,80 @@ +/* +* 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: Videoteleng extension base class +* +*/ + + +#ifndef CVTENGEXTENSIONSBASE_H +#define CVTENGEXTENSIONSBASE_H + +// INCLUDES +#include +#include "vtengcommands.h" + +// FORWARD DECLARATIONS +class CVtEngOperation; + +// CLASS DECLARATION + +/** +* Videoteleng extension base class. +* +* @lib videoteleng.lib +* @since S60 v3.2 +*/ +NONSHARABLE_CLASS ( CVtEngExtensionBase ): public CBase + + { + public: // pure virtuals. + + /** + * Returns extension API interface + * @return API IF as TAny pointer + */ + virtual TAny* GetInterface() = 0; + + /** + * Handles requested extension operation + * @param aOp requested operation pointer + * @return TBool if operation succeed or not + */ + virtual TBool HandleL( CVtEngOperation* aOp ) = 0; + + /** + * Validates requested extension command + * @param aCommandId requested command identifier (TInt) + * @return TBool if command is valid or not + */ + virtual TBool ValidateCommand( const TVtEngCommandId aCommandId ) = 0; + + /** + * Gets extension UID + * @return extension UID + */ + const TUid& Uid() const; + + protected:// Constructor. + /* + * C++ default constructor. + */ + CVtEngExtensionBase( TUid aExtensionUid ); + + private: + + // Extension UID + const TUid iExtensionUid; + }; + +#endif //CVTENGEXTENSIONSBASE_H diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Extensions/CVtEngExtensions.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Extensions/CVtEngExtensions.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,116 @@ +/* +* 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: Videoteleng API extension configuration +* +*/ + + +#ifndef CVTENGEXTENSIONS_H +#define CVTENGEXTENSIONS_H + +// INCLUDES +#include +#include "vtengcommands.h" + +// CONSTANTS AND MACROS +const TInt KExtensionGranularity = 1; + +// FORWARD DECLARATIONS +class CVtEngExtensionBase; +class CVtEngCameraPreferences; +class CVtEngOperation; +class CVtEngMediaHandler; + +// CLASS DECLARATION + +/** +* Video telephony extension handling. +* +* @lib videoteleng.lib +* @since S60 v3.2 +*/ +NONSHARABLE_CLASS(CVtEngExtensions): public CBase + + { + public: // Constructor and destructor. + + /** + * Symbian two-phase constructor. + * @return engine extension instance + */ + static CVtEngExtensions* NewL(); + + /** + * Destructor. + */ + ~CVtEngExtensions(); + + public: + + /** + * Gets client interface from certain extension + * @param aInterfacePtr a pointer to client IF pointer + * @param aUid requested client IF extension UID + * @param aHandler a handle to media handler + */ + TInt GetClientInterface( TAny** aInterfacePtr, + const TUid& aUid , CVtEngMediaHandler& aHandler ); + + /** + * Offers operation for extensions + * @param aOp operation pointer + * @return TBool value indicating if any of exsisting extension + * was able to handle operation + */ + TBool OfferOperationL( CVtEngOperation* aOp ); + + /** + * Validates extension command + * @param aCommandId command ID (TInt) + * @return TBool value indicating if any of exsisting extension + * was able to validate operation + */ + TBool ValidateCommand( const TVtEngCommandId aCommandId ); + + private: + + /** + * C++ default constructor. + */ + CVtEngExtensions(); + + /** + * Symbian constructor that may leave. + */ + void ConstructL(); + + /** + * Creates certain extension + */ + CVtEngExtensionBase* CreateExtensionsL( const TUid& aUid, + CVtEngMediaHandler& aHandler ); + + /** + * Search extensions using UID + */ + TInt LookupExtensions( const TUid& aUid) const; + + private: + + // Extension handle container + RPointerArray iExtensionArray; + + }; + +#endif //CVTENGEXTENSIONS_H \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Extensions/MVtEngCameraPreferences.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Extensions/MVtEngCameraPreferences.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,142 @@ +/* +* 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: Videoteleng Camera Preferences extension API +* +*/ + + +#ifndef MVTENGCAMERAPREFERENCES_H +#define MVTENGCAMERAPREFERENCES_H + +// INCLUDES +#include +#include + +// FORWARD DECLARATIONS + +// CLASS DECLARATION + +// CONSTANTS +const TUid KVtEngExtensionCameraPreferences = {0x10282814}; + +/** +* Camera preferences extension API class. +* +* @lib videoteleng.lib +* @since S60 v3.2 +*/ + +class MVtEngCameraPreferences + { + public: + + enum TColorTone + { + /** Normal colors. */ + ENormal = CCamera::CCameraImageProcessing::EEffectNone, + /** Sepial. */ + ESepia = CCamera::CCameraImageProcessing::EEffectSepia, + /** Black and White. */ + EGrayscale = CCamera::CCameraImageProcessing::EEffectMonochrome, + /** Inverted colors. */ + ENegative = CCamera::CCameraImageProcessing::EEffectNegative + }; + + enum TWhiteBalance + { + /** Automatically adjusted. */ + EAuto = CCamera::EWBAuto, + /** Normal daylight. */ + EDaylight = CCamera::EWBDaylight, + /** Overcast daylight. */ + ECloudy = CCamera::EWBCloudy, + /** Tungsten filament lighting. */ + ETungsten = CCamera::EWBTungsten, + /** Fluorescent bulb lighting. */ + EFluorescent = CCamera::EWBFluorescent, + /** Flash lighting. */ + EFlash = CCamera::EWBFlash, + /** High contrast daylight primarily snowy. */ + ESnow = CCamera::EWBSnow, + /** High contrast daylight primarily near the sea. */ + EBeach = CCamera::EWBBeach, + /** User configurable mode. */ + EManual = CCamera::EWBManual, + /** Shade. */ + EShade = CCamera::EWBShade + }; + + enum TBrightness + { + /** Automatically set brightness value*/ + EAutomaticBrightness = KMinTInt + }; + + enum TContrasts + { + /** Automatically set contrast value*/ + EAutomaticContrast = KMinTInt + }; + + /** + * Gets current color tone value from camera + * @param aColortone reference value for current color tone + * @return Symbian error code + */ + virtual TInt GetColorTone( TColorTone& aColortone ) const = 0; + + /** + * Gets all suported color tone values from camera + * @param aSupportedColorTones reference value for supported colortone + * values (a bit field) + * @return Symbian error code + */ + virtual TInt GetSupportedColorTones( + TUint32& aSupportedColorTones ) const = 0; + + /** + * Gets current whitebalance value from camera + * @param aWhiteBalance reference value for current whitebalance + * @return Symbian error code + */ + virtual TInt GetWhiteBalance( + TWhiteBalance& aWhiteBalance ) const = 0; + + /** + * Gets all suported whitebalance values from camera + * @param aWhiteBalance reference value for supported whitebalance + * values (a bit field) + * @return Symbian error code + */ + virtual TInt GetSupportedWhiteBalanceModes( + TUint32& aWhiteBalance ) const = 0; + + /** + * Gets current brightness value from camera + * @param aBrightness reference value for current brightness + * @return Symbian error code + */ + virtual TInt GetBrightness( TInt& aBrightness) const = 0; + + /** + * Gets current contrast value from camera + * @param aContrast reference value for current brightness + * @return Symbian error code + */ + virtual TInt GetContrast( TInt& aContrast ) const = 0; + + }; + +#endif //MVTENGCAMERAPREFERENCES_H + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Extensions/cvtengr2ftoneplayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Extensions/cvtengr2ftoneplayer.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,113 @@ +/* +* 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: Plays video start/stop sounds. +* +*/ + + +#ifndef CVTENGR2FTONEPLAYER_H +#define CVTENGR2FTONEPLAYER_H + +// INCLUDES +#include +#include + +// CONSTANTS + +// FORWARD DECLARATIONS + +// CLASS DECLARATION + +/** +* Plays video start/stop sounds. +* @since s60 v5.0 +*/ +NONSHARABLE_CLASS ( CVtEngR2FTonePlayer ) : public CBase, + public MMdaAudioPlayerCallback + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CVtEngR2FTonePlayer* NewL(); + + /** + * Destructor. + */ + virtual ~CVtEngR2FTonePlayer(); + + public: // New functions + /** + * Play a sound with given id. + * @param aSound identifies which sound to play + * (see r_ccor_sound_list in resources). + * @return Symbian error code. + */ + TInt PlaySound( TInt aSound ); + + /** + * Stop any ongoing sound. + */ + void StopSound(); + + private: // Functions from base classes + /** + * From MMdaAudioPlayerCallback. + */ + void MapcInitComplete( TInt aError, + const TTimeIntervalMicroSeconds& aDuration ); + + /** + * From MMdaAudioPlayerCallback. + */ + void MapcPlayComplete( TInt aError ); + + private: // New functions + /** + * C++ constructor. + */ + CVtEngR2FTonePlayer(); + + /** + * Symbian OS 2nd phase constructor. + */ + void ConstructL(); + + private: // Data + + TBool iOpenFileInProgress; + TBool iSoundInProgress; + CMdaAudioPlayerUtility* iAudioPlayer; // owned + + HBufC* iVideoStartSound; // owned + HBufC* iVideoStopSound; // owned + + public: + + /** + * Enum for tone player sound ID's + */ + enum TVtR2FSoundId + { + /** Video record start sound*/ + EVtR2FVideoStartSoundId = 1, + /** Video record stopt sound*/ + EVtR2FVideoStopSoundId + }; + }; + +#endif //CVTENGR2FTONEPLAYER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Extensions/cvtengrecord2file.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Extensions/cvtengrecord2file.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,106 @@ +/* +* 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: Videoteleng Camera Preferences extension +* +*/ + + +#ifndef CVTENGRECORD2FILE_H +#define CVTENGRECORD2FILE_H + +// INCLUDES +#include "VtEngPanic.h" +#include "CVtEngSettings.h" +#include "VtEngUtils.h" +#include "CVtEngOperation.h" + +#include "cvtengr2ftoneplayer.h" + +#include +#include + +#include +#include "CVtEngExtensionBase.h" + +// FORWARD DECLARATIONS + +// CLASS DECLARATION +class CVtEngR2FTonePlayer; +/** +* Videoteleng extension base class. +* +* @lib videoteleng.lib +* @since S60 v3.2 +*/ +NONSHARABLE_CLASS ( CVtEngRecord2File ): public CVtEngExtensionBase, + public MVtEngRecord2File + { + public: //Constructor and destructor. + + /** + * Symbian two-phase constructor. + * @return engine extension instance + */ + static CVtEngRecord2File* NewL(); + + /** + * Destructor. + */ + ~CVtEngRecord2File(); + + public: // from base class CVtEngExtensionBase + + /** + * @see CVtEngExtensionBase::GetInterface + */ + virtual TAny* GetInterface(); + + /** + * @see CVtEngExtensionBase::HandleL + */ + virtual TBool HandleL( CVtEngOperation* aOp ); + + /** + * @see CVtEngExtensionBase::ValidateCommand + */ + virtual TBool ValidateCommand( const TVtEngCommandId aCommandId ); + + public: // from base class MVtEngRecord2File + + /** + * For testin puposes only + * @see MVtEngRecord2File::IsTonePlaySupported + */ + virtual TInt IsTonePlaySupported( TBool& aSupported) const; + + + private: + + /** + * C++ default constructor. + */ + CVtEngRecord2File(); + + /** + * Symbian two-phase constructor. + */ + void ConstructL(); + + public: // data + + private: // data + CVtEngR2FTonePlayer* iTonePlayer; + }; + +#endif //CVTENGRECORD2FILE_H \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Extensions/mvtengcamerapreferencesobserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Extensions/mvtengcamerapreferencesobserver.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,79 @@ +/* +* Copyright (c) 2008 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: Videoteleng Camera Preferences extension Observer +* +*/ + + +#ifndef MVTENGCAMERAPREFERENCESOBSERVER_H +#define MVTENGCAMERAPREFERENCESOBSERVER_H + +// INCLUDES +#include + +/** +* Camera preferences extension observer. +* +* @lib videoteleng.lib +* @since S60 v5.0 +*/ +class MVtEngCameraPreferencesObserver + { + +public: + + /** + * Called when observer is attached to camera preferences instance. + * @param aCamPrefs Reference to camera preferences instance this observer + * was attached to. + */ + virtual void Attach( MVtEngCameraPreferences& aCamPrefs ) = 0; + + /** + * Called when color tone is updated. + * @param aColorTone New color tone value. + */ + virtual void ColorToneUpdated( + MVtEngCameraPreferences::TColorTone aColorTone ) = 0; + + /** + * Called when white balance is updated. + * @param aWhiteBalance New white balance value. + */ + virtual void WhiteBalanceUpdated( + MVtEngCameraPreferences::TWhiteBalance aWhiteBalance ) = 0; + + /** + * Called when brightness is updated. + * @param aBrightness New brightness value set. + */ + virtual void BrightnessUpdated( TInt aBrightness ) = 0; + + /** + * Called when contrast is updated. + * @param aContrast New contrast value set. + */ + virtual void ContrastUpdated( TInt aContrast ) = 0; + + /** + * Called when observer is detached from camera preferences instance. + * @param aCamPrefs Reference to camera preferences instance this observer + * was detached from. + */ + virtual void Detach( MVtEngCameraPreferences& aCamPrefs ) = 0; + + }; + +#endif // MVTENGCAMERAPREFERENCESOBSERVER_H + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Extensions/mvtengrecord2file.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Extensions/mvtengrecord2file.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,51 @@ +/* +* 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: Videoteleng Record to file extension API +* +*/ + + +#ifndef MVTENGRECORD2FILE_H +#define MVTENGRECORD2FILE_H + +// INCLUDES +#include + +// FORWARD DECLARATIONS + +// CLASS DECLARATION + +// CONSTANTS +const TUid KVtEngExtensionRecord2File = {0x10283156}; + +/** +* Record to file extension API class. +* +* @lib videoteleng.lib +* @since S60 v5.0 +*/ + +class MVtEngRecord2File + { + public: + + /** + * For testin puposes only REMOVE + * @param aSupported boolean for tone play support + * @return Symbian error code + */ + virtual TInt IsTonePlaySupported( TBool& aSupported) const = 0; + }; +#endif //MVTENGRECORD2FILE_H + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/CVtEngDrawDP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/CVtEngDrawDP.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,509 @@ +/* +* Copyright (c) 2004-2005 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: Remote video handling class. +* +*/ + + + +#ifndef CVTENGDRAWDP_H +#define CVTENGDRAWDP_H + +// INCLUDES + +#include "CVtEngRemoteVideo.h" +#include "TVtEngRenderConfigDP.h" + +#include + +// FORWARDS + +class TDisplaySinkParamsDP; +class CVtImageBitmap; +class CVtImageScaler; + +// CONSTANTS AND MACROS + +const TInt KVtEngMaxBuffers = 2; + +// CLASSES + +/** +* Buffer waiter observer API +* +* @lib videoteleng.lib +* @since Series 60 3.2 +*/ +NONSHARABLE_CLASS( MVtEngBufferWaiterObserver ) + { + public: // New methods + + /** + * Buffer fetched without errors. + * @param aBuffer Pointer to fetched buffer. + */ + virtual void BufferReady( + CPostingSurface::TPostingBuff* aBuffer ) = 0; + + /** + * Buffer fetch error. + * @param aError Error code. + */ + virtual void FetchError( TInt aError ) = 0; + }; + +/** +* Display Posting drawer +* +* @lib videoteleng.lib +* @since Series 60 3.2 +*/ +NONSHARABLE_CLASS( CVtEngDrawDP ) : public CVtEngRemoteVideo::CVtEngDraw, + public MVtEngBufferWaiterObserver, + public MVtImageScalerObserver + + { + public: // constructor and destructor + + /** + * Two-phased constructor. + * @param aObserver call back interface to Display Sink + * @return instance of CVtEngDrawDP + */ + static CVtEngDrawDP* NewL( MDisplaySinkObserver* aObserver ); + + // Destructor + ~CVtEngDrawDP(); + + private: + + /** + * C++ constructor as private. + * @param aObserver callback interface for Display Sink + */ + CVtEngDrawDP( MDisplaySinkObserver* aObserver ); + + private: // from MVtEngDraw + + /** + * @see CVtEngDraw::BaseConstructL + */ + void BaseConstructL(); + + /** + * @see CVtEngDraw::CreateSinkL + */ + MDisplaySink* CreateSinkL(); + + /** + * @see CVtEngDraw::BaseRefreshL + */ + void BaseRefreshL(); + + /** + * @see CVtEngDraw::BaseRefreshBitmapsL + */ + void BaseRefreshBitmapsL(); + + /** + * @see CVtEngDraw::BaseDoCancel + */ + void BaseDoCancel(); + + /** + * @see CVtEngDraw::BaseVerifyConfigL + */ + void BaseVerifyConfigL(); + + /** + * @see CVtEngDraw::BaseRestartL + */ + void BaseRestartL(); + + /** + * @see CVtEngDraw::BaseAbortNow + */ + void BaseAbortNow(); + + /** + * @see CVtEngDraw::BaseStartDrawL + */ + void BaseStartDrawL(); + + /** + * @see CVtEngDraw::BaseStopDraw + */ + void BaseStopDraw(); + + /** + * @see CVtEngDraw::BaseSetConfigL + */ + void BaseSetConfigL( const TVtEngRenderConfig& aConfig ); + + /** + * @see CVtEngDraw::BaseSetUIForegroundL + */ + void BaseSetUIForegroundL( TBool aForeground ); + + /** + * @see CVtEngDraw::BaseVideoFrameSizeChangedL + */ + void BaseVideoFrameSizeChangedL( const TSize& aTo ); + + /** + * @see CVtEngDraw::BaseRequestLastFrame + */ + void BaseRequestLastFrame(); + + /** + * @see CVtEngDraw::Config + */ + TVtEngRenderConfig& Config(); + + private: // new methods + + /** + * Handles all delayed calls. + */ + void HandleDelayedCallsL(); + + /** + * Base construct implementation + */ + void DoBaseConstructL(); + + /** + * Base start drawing implementation + */ + void DoBaseStartDrawL(); + + /** + * Initialize posting surface implementation + */ + void DoInitializePostingSurfaceL(); + + /** + * Update sink params implementation. + */ + void DoUpdateSinkParamsL(); + + /** + * Updates sink params. + */ + void UpdateSinkParamsL(); + + /** + * Checks if the alpha has been trashed on screen buffer (ETrue if it + * has been trashed, EFalse otherwise). + */ + TBool IsAlphaTrashed() const; + + /** + * Sets clipping region (read from DSA). + */ + void SetClipRegionL(); + + /** + * Initializes DP. + */ + void InitializePostingSurfaceL(); + + /** + * Fills posting source params structure. + */ + void GetPostingSourceParams( + CPostingSurface::TPostingSourceParams& aParams ) const; + + /** + * Fills posting params structure. + */ + void GetPostingParams( + CPostingSurface::TPostingParams& aParams ) const; + + /** + * Returns ETrue if given format is supported, EFalse otherwise. + */ + TBool SupportsFormat( + const CPostingSurface::TPostingFormat& aFormat ) const; + + /** + * Returns ETrue if given size is supported, EFalse otherwise. + */ + TBool SupportsSize( const TSize& aSize ) const; + + /** + * Returns ETrue if given rotation is supported, + * EFalse otherwise. + */ + TBool SupportsRotation( + CPostingSurface::TRotationType aRotation ) const; + + /** + * Returns ETrue if mirroring is supported, EFalse otherwise. + */ + TBool SupportsMirroring() const; + + /** + * Returns ETrue if scaling is supported, EFalse otherwise. + */ + TBool SupportsScaling() const; + + /** + * Returns ETrue if brightness controlling is supported, + * EFalse otherwise. + */ + TBool SupportsBrightness() const; + + /** + * Returns ETrue if contrast controlling is supported, + * EFalse otherwise. + */ + TBool SupportsContrast() const; + + /** + * Returns buffer size in bytes for given size and current posting + * format. + */ + TInt GetFrameBufferSize( const TSize& aTo ) const; + + /** + * Recreates clipregion. May leave with KErrNoMemory. + */ + void RecalculateClipRegionL(); + + /** + * Fixes rect for DP. + */ + void FixRectForDP( TRect& aRect ) const; + + /** + * Fills sink parameters. + */ + void GetSinkParams( TDisplaySinkParamsDP& aSinkParams ); + + /** + * Returns reference to sink. + */ + MDisplaySink& DisplaySink(); + + /** + * Stores given frame buffer. + */ + void StoreFrameBuffer( CPostingSurface::TPostingBuff* aPostingBuffer ); + + /** + * Creates frame buffer. + */ + void CreateFrameBufferL( const TSize& aSize ); + + /** + * Async draw callback. + */ + static TInt CallBack( TAny* aPtr ); + + /** + * Sets given buffer available to display sink. + */ + void SetAvailableToSink( CPostingSurface::TPostingBuff* aBuffer ); + + /** + * Creates instance of posting surface. + */ + CPostingSurface* CreatePostingSurfaceL(); + + /** + * Close the DP API library and free the allocated instance. + */ + void CloseDPLibrary(); + + /** + * Loads DP API library. + */ + void LoadDPLibraryL(); + + /** + * Converts YUV420 image to bitmap. + */ + void Convert420ToVtImg( HBufC8* aSource, CVtImageBitmap& aTarget ); + + /** + * Converts YUV422 image to bitmap. + */ + void Convert422ToVtImg( HBufC8* aSource, CVtImageBitmap& aTarget ); + + /** + * Updates Vt frame to frame observer. + */ + void UpdateVtFrame(); + + public: // From MVtImageScalerObserver. + + /** + * @ see MVtImageScalerObserver. + */ + virtual void ScalingFinished( TInt aError ); + + + private: // from CActive + + /** + * Handles prepared bitmap from display sink. + * @see CActive::RunL + */ + void RunL(); + + private: // from MVtEngBufferWaiterObserver + + /** + * @see MVtEngBufferWaiterObserver::BufferReady + */ + void BufferReady( CPostingSurface::TPostingBuff* aBuffer ); + + /** + * @see MVtEngBufferWaiterObserver::FetchError + */ + void FetchError( TInt aError ); + + private: // inner classes + + // Buffer class for storing buffer. + NONSHARABLE_CLASS( TVtEngBuffer ) + { + public: + + /** + * C++ constructor + */ + TVtEngBuffer(); + + /** + * Sets buffer + */ + void Set( CPostingSurface::TPostingBuff* aBuffer ); + + /** + * Unsets buffer + */ + void UnSet(); + + /** + * Returns ETrue if buffer is set + */ + TBool IsSet() const; + + /** + * Returns pointer reference to stored buffer. + */ + CPostingSurface::TPostingBuff*& Buffer(); + + private: + + // Pointer's pointer to buffer + CPostingSurface::TPostingBuff* iBuffer; + }; + + // Waiter class for asynchronous events. + NONSHARABLE_CLASS( CVtEngBufferWaiter ) : public CActive + { + public: + + /** + * C++ constructor. + */ + CVtEngBufferWaiter( CPostingSurface& aPostingSurface, + MVtEngBufferWaiterObserver& aObserver ); + + /** + * Destructor, frees all resources allocated by this instance. + */ + ~CVtEngBufferWaiter(); + + /** + * Fetch new buffer (also activates listening). + */ + TInt FetchBuffer(); + + private: // new methods + + /** + * Activate buffer listening (also calls CActive::SetActive()). + */ + void Activate(); + + private: // from CActive + + /** + * @see CActive::RunL() + */ + void RunL(); + + /** + * @see CActive::DoCancel() + */ + void DoCancel(); + + private: // data + + // Posting surface instance (not owned) + CPostingSurface* iPostingSurface; + + // BufferWaiter observer who gets informed about buffers + MVtEngBufferWaiterObserver* iObserver; + }; + + private: // data + + // Posting surface instance + CPostingSurface* iPostingSurface; + + // Posting capabilities + CPostingSurface::TPostingCapab iPostingCaps; + + // Posting buffers + TVtEngBuffer + iBuffers[ MDisplaySink::EFirstBitmap + KVtEngMaxBuffers ]; + + // Buffer waiter instance + CVtEngBufferWaiter* iBufferWaiter; + + // Rendering configuration + TVtEngRenderConfigDP iConfig; + + // Clipping region + RRegion iClipRegion; + + // Frame buffer + HBufC8* iFrameBuffer; + + // Selected posting format + CPostingSurface::TPostingFormat iPostingFormat; + + // DP API DLL + RLibrary* iDPLib; + + // Source image contains converted YUV frame + CVtImageBitmap* iSource; + + // Target image contains scaled bitmap + CVtImageBitmap* iTarget; + + // Image scaler instance + CVtImageScaler* iImageScaler; + + // Clip region updated + TBool iClipRegionUpdated; + + }; + +#endif // CVTENGDRAWDP_H \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/CVtEngDrawDSA.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/CVtEngDrawDSA.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,189 @@ +/* +* Copyright (c) 2004-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: Remote video handling class. +* +*/ + + + +#ifndef CVTENGDRAWDSA_H +#define CVTENGDRAWDSA_H + +// INCLUDES + +#include "CVtEngRemoteVideo.h" +#include "TVtEngRenderConfigDSA.h" + +// FORWARDS + +class TDisplaySinkParamsDSA; + +/** +* Direct Screen Access drawer +* +* @lib videoteleng.lib +* @since Series 60 3.2 +*/ +NONSHARABLE_CLASS( CVtEngDrawDSA ) : public CVtEngRemoteVideo::CVtEngDraw, + public MVtEngScalerObserver + { + public: // constructor and destructor + + /** + * Two-phased constructor. + * @param aObserver call back interface to Display Sink + * @return instance of CVtEngDrawDSA + */ + static CVtEngDrawDSA* NewL( MDisplaySinkObserver* aObserver ); + + // Destructor + ~CVtEngDrawDSA(); + + private: // construction + + /** + * C++ constructor as private. + * @param aObserver callback interface for Display Sink + */ + CVtEngDrawDSA( MDisplaySinkObserver* aObserver ); + + private: // from CVtEngDraw + + /** + * @see CVtEngDraw::BaseConstructL + */ + void BaseConstructL(); + + /** + * @see CVtEngDraw::CreateSinkL + */ + MDisplaySink* CreateSinkL(); + + /** + * @see CVtEngDraw::BaseRefreshL + */ + void BaseRefreshL(); + + /** + * @see CVtEngDraw::BaseRefreshBitmapsL + */ + void BaseRefreshBitmapsL(); + + /** + * @see CVtEngDraw::BaseDoCancel + */ + void BaseDoCancel(); + + /** + * @see CVtEngDraw::BaseVerifyConfigL + */ + void BaseVerifyConfigL(); + + /** + * @see CVtEngDraw::BaseRestartL + */ + void BaseRestartL(); + + /** + * @see CVtEngDraw::BaseAbortNow + */ + void BaseAbortNow(); + + /** + * @see CVtEngDraw::BaseStartDrawL + */ + void BaseStartDrawL(); + + /** + * @see CVtEngDraw::BaseStopDraw + */ + void BaseStopDraw(); + + /** + * @see CVtEngDraw::BaseSetConfigL + */ + void BaseSetConfigL( const TVtEngRenderConfig& aConfig ); + + /** + * @see CVtEngDraw::BaseSetUIForegroundL + */ + void BaseSetUIForegroundL( TBool aForeground ); + + /** + * @see CVtEngDraw::BaseVideoFrameSizeChangedL + */ + void BaseVideoFrameSizeChangedL( const TSize& ); + + /** + * @see CVtEngDraw::BaseRequestLastFrame + */ + void BaseRequestLastFrame(); + + /** + * @see CVtEngDraw::Config + */ + TVtEngRenderConfig& Config(); + + private: // from CActive + + /** + * Handles prepared bitmap from display sink. + * @see CActive::RunL + */ + void RunL(); + + public: // from MVtEngScalerObserver + + /** + * From MVtEngScalerObserver, this method is called when + * scaling is finished. + * @see MVtEngScalerObserver::ScalingCompleted + */ + virtual void ScalingCompleted( + CFbsBitmap* aBitmap, TInt aError ); + + private: // New functions + + /** + * Does the drawing. + * @param aBitmap a bitmap to draw + */ + void DrawBitmap( CFbsBitmap& aBitmap ); + + /** + * Fills TDisplaySinkParamsDSA struct + */ + void GetSinkParams( TDisplaySinkParamsDSA& aSinkParams ); + + private: // data + + // Bitmapts for remote video (double buffering). + CFbsBitmap* iBitmap1; + CFbsBitmap* iBitmap2; + + // Bitmap indexes indicating which. + // bitmap was provided. + MDisplaySink::TBitmapNo iBitmapNo; + + // If a bitmap has been set available. + TBool iBitmapSetAvail; + + // VT image scaler + MVtEngImageScaler* iImageScaler; + + // DSA configuration + TVtEngRenderConfigDSA iConfig; + }; + +#endif // CVTENGDRAWDSA_H \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/CVtEngDrawNGA.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/CVtEngDrawNGA.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,464 @@ +/* +* Copyright (c) 2004-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: Class for NGA Drawer. +* +*/ + + +#ifndef CVTENGDRAWNGA_H +#define CVTENGDRAWNGA_H + +// INCLUDES +//#include +#include +#include +#include +//#include +// GCE Surface +#include "graphics/surfacemanager.h" +#include "graphics/surface.h" +#include "graphics/surfaceupdateclient.h" + +#include "CVtEngRemoteVideo.h" +#include "TVtEngRenderConfigNGA.h" + +// FORWARDS + +class TDisplaySinkParamsNGA; + +// CONSTANTS AND MACROS +const TInt KVtEngMaxSurfaceBuffers = 2; + +NONSHARABLE_CLASS( TVTSurfaceBuffer ) + { + public: + + /** + * C++ constructor + */ + TVTSurfaceBuffer( TUint8* aBuffer = NULL, TInt aSurfaceNo = KErrNotFound ); + + /** + * Returns pointer reference to stored buffer. + */ + TUint8* &Buffer(); + + /** + * Returns surface no.. + */ + TInt SurfaceNo(); + + void Set( TUint8* aBuffer, TInt aSurfaceNo ); + + void UnSet(); + + private: + + // Pointer's pointer to buffer + TUint8* iBuffer; + TInt iSurfaceBufferNo; + }; + +/** +* Buffer waiter observer API +* +* @lib videoteleng.lib +* @since Series 60 MCL +*/ +NONSHARABLE_CLASS( MVtEngNGABufferWaiterObserver ) + { + public: // New methods + + /** + * Buffer fetched without errors. + * @param aBuffer Pointer to fetched buffer. + */ + virtual void BufferReadyL( + TVTSurfaceBuffer* aBuffer ) = 0; + + /** + * Buffer fetch error. + * @param aError Error code. + */ + virtual void FetchError( TInt aError ) = 0; + }; + + +/** +* DNGA drawer +* +* @lib videoteleng.lib +* @since Series 60 MCL +*/ +NONSHARABLE_CLASS( CVtEngDrawNGA ) : + public CVtEngRemoteVideo::CVtEngDraw, + public MVtEngNGABufferWaiterObserver + { + + public: // constructor and destructor + + /** + * Two-phased constructor. + * @param aObserver call back interface to Display Sink + * @return instance of CVtEngDrawDSA + */ + static CVtEngDrawNGA* NewL( MDisplaySinkObserver* aObserver ); + + // Destructor + ~CVtEngDrawNGA(); + + private: // construction + + /** + * C++ constructor as private. + * @param aObserver callback interface for Display Sink + */ + CVtEngDrawNGA( MDisplaySinkObserver* aObserver ); + + private: // from CVtEngDraw + + /** + * @see CVtEngDraw::BaseConstructL + */ + void BaseConstructL(); + + /** + * @see CVtEngDraw::CreateSinkL + */ + MDisplaySink* CreateSinkL(); + + /** + * @see CVtEngDraw::BaseRefreshL + */ + void BaseRefreshL(); + + /** + * @see CVtEngDraw::BaseRefreshBitmapsL + */ + void BaseRefreshBitmapsL(); + + /** + * @see CVtEngDraw::BaseDoCancel + */ + void BaseDoCancel(); + + /** + * @see CVtEngDraw::BaseVerifyConfigL + */ + void BaseVerifyConfigL(); + + /** + * @see CVtEngDraw::BaseRestartL + */ + void BaseRestartL(); + + /** + * @see CVtEngDraw::BaseAbortNow + */ + void BaseAbortNow(); + + /** + * @see CVtEngDraw::BaseStartDrawL + */ + void BaseStartDrawL(); + + /** + * @see CVtEngDraw::BaseStopDraw + */ + void BaseStopDraw(); + + /** + * @see CVtEngDraw::BaseSetConfigL + */ + void BaseSetConfigL( const TVtEngRenderConfig& aConfig ); + + /** + * @see CVtEngDraw::BaseSetUIForegroundL + */ + void BaseSetUIForegroundL( TBool aForeground ); + + /** + * @see CVtEngDraw::BaseVideoFrameSizeChangedL + */ + void BaseVideoFrameSizeChangedL( const TSize& ); + + /** + * @see CVtEngDraw::BaseRequestLastFrame + */ + void BaseRequestLastFrame(); + + /** + * @see CVtEngDraw::Config + */ + TVtEngRenderConfig& Config(); + + private: // New mothod + + /** + * Returns reference to sink. + */ + MDisplaySink& DisplaySink(); + + /** + * Base construct implementation + */ + void DoBaseConstructL(); + + /** + * Base start drawing implementation + */ + void DoBaseStartDrawL(); + + /** + * Sets given buffer available to display sink. + */ + void SetAvailableToSink( TVTSurfaceBuffer* aBuffer ); + + /** + * Update sink params implementation. + */ + void DoUpdateSinkParamsL(); + + /** + * Updates sink params. + */ + void UpdateSinkParamsL(); + + /** + * Create surface + */ + void CreateSurfaceL(); + + /** + * Create surface implementation + */ + void DoCreateSurfaceL(); + + /** + *clearing a surface buffer to given colour + */ + void ClearSurfacebuffer( + TUint8* aStartAddr, + TInt aOffset, + const RSurfaceManager::TSurfaceInfoV01 aInfo, + TRgb &aColor ); + + static TInt SurfaceBuffer0Ready(TAny* aAny); + + static TInt SurfaceBuffer1Ready(TAny* aAny); + + TBool DoSurfaceBuffer0Ready(); + + TBool DoSurfaceBuffer1Ready(); + + public: //from MVtEngNGABufferWaiterObserver + + /** + * @see MVtEngNGABufferWaiterObserver::BufferReadyL + */ + void BufferReadyL( TVTSurfaceBuffer* aBuffer ); + + /** + * @see MVtEngNGABufferWaiterObserver::FetchError + */ + void FetchError( TInt aError ); + + + private: + /** + * @see CActive::RunL + */ + void RunL(); + + private: // New functions + /** + * Fills TDisplaySinkParamsNGA struct + */ + void GetSinkParams( TDisplaySinkParamsNGA& aSinkParams ); + + private: //inner class + + // Buffer class for storing buffer. + NONSHARABLE_CLASS( TVtEngBuffer ) + { + public: + + /** + * C++ constructor + */ + TVtEngBuffer(); + + /** + * Sets buffer + */ + void Set( TVTSurfaceBuffer* aBuffer ); + + /** + * Unsets buffer + */ + void UnSet(); + + /** + * Returns ETrue if buffer is set + */ + TBool IsSet() const; + + /** + * Returns pointer reference to stored buffer. + */ + TVTSurfaceBuffer* &SurfaceBuffer(); + + /** + * Returns pointer reference to stored buffer. + */ + TUint8* &Buffer(); + + private: + + // Pointer's pointer to buffer + TUint8* iBuffer; + TVTSurfaceBuffer* iSurfaceBuffer; + }; + + // Waiter class for asynchronous events. + NONSHARABLE_CLASS( CVtEngBufferWaiter ) : public CActive + { + public: + + /** + * C++ constructor. + */ + CVtEngBufferWaiter( //CVideoRenderer& aVideoRenderer, + MVtEngNGABufferWaiterObserver& aObserver ); + + /** + * Destructor, frees all resources allocated by this instance. + */ + ~CVtEngBufferWaiter(); + + /** + * Fetch new buffer (also activates listening). + */ + TInt FetchBuffer(); + + /** + * One SurfaceBuffer is available + */ + void BufferAvailable(TVTSurfaceBuffer& aBuffer); + + private: // new methods + + /** + * Activate buffer listening (also calls CActive::SetActive()). + */ + void Activate(); + + private: // from CActive + + /** + * @see CActive::RunL() + */ + void RunL(); + + /** + * @see CActive::DoCancel() + */ + void DoCancel(); + + private: // data + + // Video frame renderer (not owned) + //CVideoRenderer* iVideoRenderer; + + // BufferWaiter observer who gets informed about buffers + MVtEngNGABufferWaiterObserver* iObserver; + + //Avaiable surface buffers + TVTSurfaceBuffer* iBuffers[KVtEngMaxSurfaceBuffers]; + + }; + + // Surface Buffer Active Call back. + NONSHARABLE_CLASS( CActiveCallBack ) : public CActive + { + public: + CActiveCallBack( TCallBack aCallBack, TInt aPriority): CActive(aPriority), iCallBack(aCallBack) + {}; + CActiveCallBack(); + + public: // Functions from base classes + void SetActive() + { + CActive::SetActive(); + }; + void RunL() + { + iCallBack.CallBack(); + }; + void DoCancel() + {}; + + private: // Data + TCallBack iCallBack; + }; + + private: // data + + //Video frame renderer + //CVideoRenderer *iVideoRenderer; + RSurfaceManager* iSurfaceManager; + RSurfaceUpdateSession iSurfaceUpdateSession; + //Surface pixel format + TUidPixelFormat iSurfaceFormat; + + RChunk* iSurfaceChunk; + + TInt8* iChunkBuffer0; + + TInt8* iChunkBuffer1; + + TVTSurfaceBuffer iSurfaceBuffer0; + + TVTSurfaceBuffer iSurfaceBuffer1; + + //CActiveCallBack* iSurfaceBufferAo0; + + //CActiveCallBack* iSurfaceBufferAo1; + + CActiveCallBack* iCallBackTable[KVtEngMaxSurfaceBuffers]; + + //NGA surface id + TSurfaceId iSurfaceId; + + //NGA surface has created + TBool iSurfaceCreated; + + // Buffer waiter instance + CVtEngBufferWaiter* iBufferWaiter; + + // Surface buffers + TVtEngBuffer + iSurfaceBuffers[ MDisplaySink::EFirstBitmap + KVtEngMaxSurfaceBuffers ]; + + TSglQue iWaitingBuffers; // buffers waiting to be submitted + TBool iSubmitPending; + + // Configuration + TVtEngRenderConfigNGA iConfig; + + // Time stamp for surface update + TTimeStamp iTimeStamp; + }; + +#endif // CVTENGDRAWDSA_H diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/CVtEngDtmfHandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/CVtEngDtmfHandler.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,174 @@ +/* +* 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: DTMF handler +* +*/ + + + +#ifndef CVTENGDTMFHANDLER_H +#define CVTENGDTMFHANDLER_H + +// INCLUDES +#include +#include +#include "CVtEngDtmfState.h" +#include "CVtEngOperation.h" +#include "MVtEngDtmfHandler.h" + +// FORWARD DECLARATIONS +class MVTUserInput; + +// CLASS DECLARATION + +/** +* Base class for data types +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtEngDtmfHandler ) : public CBase, public MVtEngDtmfHandler + { + public: // Data structures + enum TUIISupport + { + EBasicString = 2, + EIA5String = 4, + EGeneralString = 8, + EDTMFString = 16 + }; + + public: // constructor and destructor + + /** + * Two-phased constructor. + * @param aH324Config H324 configure interface + * @return dtmf handler + */ + static CVtEngDtmfHandler* NewL( + MVtH324ConfigCommand& aH324Config ); + + /** + * Destructor + */ + ~CVtEngDtmfHandler(); + + public: // from MVtEngDtmfHandler + + /** + * @see MVtEngDtmfHandler + */ + virtual void HandleL( CVtEngOperation& aOp ); + + /** + * @see MVtEngDtmfHandler + */ + virtual CVtEngDtmfState& ActivateState( + MVtEngDtmfHandler::TVtEngDtmfState aNewState ); + + /** + * @see MVtEngDtmfHandler + */ + virtual void SendComplete( TInt aError ); + + /** + * @see MVtEngDtmfHandler + */ + virtual MVTUserInput& ReserveProtoDtmfL( + const TVtEngDtmfTone& aTone ); + + /** + * @see MVtEngDtmfHandler + */ + virtual void ReleaseProtoDtmf(); + + /** + * @see MVtEngDtmfHandler + */ + virtual TBool CheckCommandId( TInt aCheckCommandId ) const; + + /** + * @see MVtEngDtmfHandler + */ + virtual void StoreCommandId( TInt aStoreCommandId ); + + + public: // Protocol DTMF Support + + /** + * Specifies the UII support + * @param aValue the support to be used + */ + void SetUIISupport( TUIISupport aValue ); + + /** + * Gets the current UII support + * @return UII support + */ + TUIISupport GetUIISupport() const; + + private: // constructors + + /** + * C++ constructor + */ + CVtEngDtmfHandler( MVtH324ConfigCommand& aH324Config ); + + /** + * 2nd phase constructor + */ + void ConstructL(); + + private: // new functions + + /** + * Handles completion of DTMF sending, leavable method. + */ + void HandleSendCompleteL( TInt aError ); + + /** + * Creates a state instance + * @param EVtDtmfStateIdle, EVtDtmfStateSending or EVtDtmfStateBuffered + */ + void CreateStateL( TInt aState ); + + private: // member data + + // DTMF states + CArrayPtrFlat* iDtmfStates; + + // current state index + TVtEngDtmfState iCurrentState; + + // protocol tone + MVTUserInput* iProtoDtmf; + + // H324 interface + MVtH324ConfigCommand& iH324Config; + + // Indicates supported UII type: + // 16 DTMF + // 8 General String + // 4 IA5 String + // 2 Basic string + TUIISupport iUIISupport; + + // DTMF command ID returned by H324 interface for last tone + TInt iIssuedDtmfCommandId; + }; + + +#endif CVTENGDTMFHANDLER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/CVtEngImageScaler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/CVtEngImageScaler.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,154 @@ +/* +* Copyright (c) 2004-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: Scaler for bitmaps. +* +*/ + + + +#ifndef CVTENGIMAGESCALER_H +#define CVTENGIMAGESCALER_H + +// INCLUDES +#include "MVtEngImageScaler.h" +#include + +// FORWARD DECLARATIONS +class MVtEngScalerObserver; +class CVtImageScaler; +class CVtImageBitmap; + +/** +* Image scaler implementation class. +* +* @lib videoteleng.lib +* @since Series 60 2.8 +*/ +NONSHARABLE_CLASS( CVtEngImageScaler ) : public CBase, + public MVtImageScalerObserver, + public MVtEngImageScaler + { + public: // constructor and destructor + + /** + * Two-phased constructor. + * @param aObserver scaling finished callback. + * @return scaler + */ + static MVtEngImageScaler* NewL( + MVtEngScalerObserver& aObserver ); + + /** + * Destructor + */ + virtual ~CVtEngImageScaler(); + + private: // constructor + + /** + * C++ constructor. + * @param aObserver scaling finished callback. + */ + CVtEngImageScaler( + MVtEngScalerObserver& aObserver ); + + + /** + * Symbian constructor that may leave. + */ + void ConstructL(); + + public: // From MVtEngImageScaler. + + /** + * @see MVtEngImageScaler. + */ + virtual void ScaleL( + TInt aSourceIndex ); + + /** + * @see MVtEngImageScaler + */ + virtual TBool ConfigureL( + TDisplayMode aDisplayMode, + TSize aSize, + TInt aSourceHandle1, + TInt aSourceHandle2 ); + + /** + * @see MVtEngImageScaler. + */ + virtual void Release(); + + /** + * @see MVtEngImageScaler. + */ + virtual TInt Cancel(); + + public: // From MVtImageScalerObserver. + + /** + * @ see MVtImageScalerObserver. + */ + virtual void ScalingFinished( TInt aError ); + + private: + /** + * EFirstBitmap + * Use the first bitmap. + * ESecondBitmap + * Use the second bitmap. + */ + enum + { + EFirstBitmap = 0, + ESecondBitmap = 1 + }; + + /** + * Fetches the used scaling method from locally. + * variated properties, and stores it into iScalingMethod. + */ + void GetScalingMethodL(); + + private: + + // Observer receiving scaled bitmaps. + MVtEngScalerObserver& iObserver; + + // Actual component doing the scaling. + CVtImageScaler* iVtScaler; + + // Target bitmaps. + RPointerArray iTargets; + + // Source bitmaps. + RPointerArray iSources; + + // Bitmap index in targets. + TInt iTargetBitmapInUse; + + // Display mode. + TDisplayMode iMode; + + // Scaled size. + TSize iSize; + + // Method of scaling + CVtImageScaler::TQuality iScalingMethod; + }; + +#endif // CVTENGIMAGESCALER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/CVtEngLocalVideo.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/CVtEngLocalVideo.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,1575 @@ +/* +* Copyright (c) 2004-2007 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: Local video handler. +* +*/ + + +#ifndef CVTENGLOCALVIDEO_H +#define CVTENGLOCALVIDEO_H + +// INCLUDES +#include +#include +#include "TVtEngRendering.h" +#include "TVtEngRenderingDSA.h" +#include "TVtEngRenderingDP.h" +#include "TVtEngRenderingNGA.h" +#include "VtEngEvents.h" +#include "MVtEngMedia.h" //TMediaSource +#include "MVtEngSettingPSObserver.h" +#include "CVTEngPubSubsListener.h" +#include "mvtengcamerapreferencesobserver.h" + +#include "graphics/surfacemanager.h" +#include "graphics/surface.h" +#include "graphics/surfaceupdateclient.h" + +// FORWARD DECLARATIONS +class CVSDataProvider; +class CVtEngMediaHandler; +class CVtEngCameraPreferences; + + +// LOCAL CONSTANTS +// Default source width. +static const TInt KVtEngLocalVideoDefaultWidth = 176; + +// Default source height. +static const TInt KVtEngLocalVideoDefaultHeight = 144; + +// CLASS DECLARATION + +/** +* Local (uplink) video handling. +* +* @lib videoteleng.lib +* @since Series 60 2.6 +*/ +NONSHARABLE_CLASS( CVtEngLocalVideo ) : + public CActive, + public MVSDataProviderObserver, + public MVSDataSourceObserver, + public MVSControllerObserver, + public MVtEngSettingPSObserver + { + public: // Constructors and destructor + + /** + * Symbian two-phase constructor. + * @param aObserver callback interface to Media Handler + * @return local video instance + */ + static CVtEngLocalVideo* NewL( + CVtEngMediaHandler& aObserver ); + + /** + * Destructor. + */ + virtual ~CVtEngLocalVideo(); + + public: // Public data structures + enum TVtEngProviderType + { + KVtEngProviderUndefined = -1, + /** Blank imnage provider */ + KVtEngProviderNone = 0, + /** Primary camera provider */ + KVtEngProviderCam1, + /** Secondary camera provider */ + KVtEngProviderCam2, + /** GS image provider */ + KVtEngProviderImage, + /** ? */ + KVtEngProviderTempImage, + /** Still share provider */ + KVtEngProviderShareImage, + /** Video share provider */ + KVtEngProviderShareVideoClip, + /** Default image provider */ + KVtEngProviderDefaultStillImage + }; + + public: // from MVSDataProviderObserver + + /** + * @see MVSDataProviderObserver::vsProviderError + */ + virtual void vsProviderError( TInt aError ); + + /** + * @see MVSDataProviderObserver::vsProviderReady + */ + virtual void vsProviderReady(); + + /** + * @see MVSDataProviderObserver::vsViewFinderFrameReady + */ + virtual void vsViewFinderFrameReady( CFbsBitmap& aFrame ); + + public: // from MVSDataSourceObserver + + /** + * @see MVSDataSourceObserver::vsProviderSwitchDone + */ + virtual void vsProviderSwitchDone( CVSDataProvider* aOldProvider ); + + public: // from MVSControllerObserver + + /** + * @see MVSControllerObserver::vsProvidersChanged + */ + void vsProvidersChanged( TBool aAttached ); + + public: // From MVtEngSettingPSObserver. + + /** @see MVtEngSettingPSObserver */ + virtual void HandleNotifyPSL( const TUid aUid, + const TInt& aKey, const TRequestStatus& aStatus ); + + public: // New functions + + /** + * Pauses frame sending from video source (this method is called when + * VT is initializing and video source has not yet been added to stack) + * + */ + void PauseVideoSending(); + + /** + * Resumes frame sending from video source. + * + */ + void ResumeVideoSending(); + + /** + * Tells if the provider has started viewfinder. + * @return ETrue if started + */ + TBool ViewFinderStarted() const; + + /** + * Tells if the provider has been frozen. + * @return ETrue if frozen + */ + TBool IsFrozen() const; + + /** + * Creates an audio source. + * @return an error code + */ + TInt CreateAudioSource(); + + /** + * Sets configuration for view finder. + * @param aParams view finder configuration + */ + void SetViewFinderParameters( const TVtEngRenderingOptions& aParams ); + + /** + * Sets DSA configuration for view finder. + * @param aDSA DSA configuration + */ + void SetViewFinderParameters( const TVtEngRenderingOptionsDSA& aDSA ); + + /** + * Sets DP configuration for view finder. + * @param aDP DP configuration + */ + void SetViewFinderParameters( const TVtEngRenderingOptionsDP& aDP ); + + + /** + * Sets NGA configuration for view finder. + * @param aNGA NGA configuration + */ + void SetViewFinderParameters( const TVtEngRenderingOptionsNGA &aNGA ); + + /** + * Sets default still image. + */ + void SetDefaultStillImageL(); + + /** + * Sets still image or none. + * @param aSetAsActive sets as active provider + */ + void SetStillImageL( TBool aSetAsActive ); + + /** + * Initializes default blank provider. + */ + void InitializeL(); + + /** + * Selects camera1, camera2, still image or none as source. + * @param aSource video source + * @return ETrue if selecting started + */ + TBool SelectSourceL( TVtEngProviderType aSource ); + + /** + * Returns currently active video provider. + * @return provider type + */ + TVtEngProviderType ActiveProvider( ) const; + + /** + * Starts view finder if it was started earlier and current state is + * ELocReady. + */ + void StartViewFinderIfWasStartedL(); + + /** + * Starts view finder. Uses either DSA or WS depending on + * which configuration is active. + * @param aClientRequest request issued by user + */ + void StartViewFinderL( TBool aClientRequest = EFalse ); + + /** + * Stops view finder. + * @param aClientRequest request issued by user + */ + void StopViewFinder( TBool aClientRequest = EFalse ); + + /** + * Freeze video sending (i.e. start sending last frame only). + */ + void FreezeL(); + + /** + * Unfreeze video sending (i.e. resume sending). + */ + void UnfreezeL(); + + /** + * Checks that all other providers don't have + * view finder active and stops if found. + * @param aProvider provider that should not be stopped + */ + void CheckOthersStopped( const CVSDataProvider& aProvider ); + + /** + * Returns video source. + * @return video source + */ + MVTVideoSource* Source() const; + + /** + * Returns audio source. + * @return audio source + */ + MVTAudioSource* AudioSource() const; + + /** + * Gets media state. + * @param aActiveMedia returns active TMediaType + * @return Symbian OS error code + */ + TInt GetMediaState( TInt& aActiveMedia ); + + /** + * Gets source type. + * @return media source type + */ + MVtEngMedia::TMediaSource GetMediaSource(); + + /** + * Gets source capabilities. + * @param aCaps capability of providers + * @return Symbian OS error code + */ + TInt GetSourceCaps( TInt& aCaps ); + + /** + * Sets boolean to indicate if the provider is to be initialized only. + * Selected camera is not necessary activated. If current media is + * other than camera, initialization can be done on the background. + * @param aInitOnly boolean value stating if to initialize only + */ + void InitializeOnly( TBool aInitOnly = ETrue ); + + /** + * Sets boolean to indicate if the provider is to be initialized only. + * @param aInitOnly boolean value stating if to initialize only + */ + void InitializeOnlyEx( TBool aInitOnly = ETrue ); + + /** + * Indicates if camera provider is initialized. + * @param aId provider ID + * @param aInitialized + * @return Symbian OS error code + */ + TInt IsInitialized( MVtEngMedia::TCameraId aId, TBool& aInitialized ); + + /** + * Gets camera info. + * @param TCameraId camera ID + * @param aInfo camera info + * @return Symbian OS error code + */ + TInt GetCameraInfo( MVtEngMedia::TCameraId aId, + MVtEngMedia::TCameraInfo& aInfo ); + + /** + * Gets current digital zoom step (Factor in VS camera terminology). + * @param aCurrentStep current zoom step + * @return Symbian OS error code + */ + TInt GetDigitalZoomFactor( TInt& aCurrentStep ); + + /** + * Gets maximum digital zoom value that may be passed to camera. + * @param aMaxZoomStep maximum zoom step + * @return Symbian OS error code + */ + TInt GetMaxDigitalZoomStep( TInt& aMaxZoomStep ); + + /** + * Gets number of major zoom level leaps. + * One to maximum digital zoom steps plus one. + * Less than or equal to maximum digital zoom steps plus one. + * @param aCount number of leaps + * @param aProviderSupplied use original or mapped + * @return Symbian OS error code + */ + TInt GetMajorDigitalZoomStepCount( TInt& aCount, + TBool aProviderSupplied = EFalse ); + + /** + * Maps major zoom leap step to corresponding step index. + * @param aIndex major zoom step + * @param aStep zoom step + */ + void GetMajorDigitalZoomStep( const TInt aIndex, TInt& aStep ); + + /** + * Sets video provider's digital zoom step. + * @param aDigitalZoomFactor step + */ + void SetDigitalZoomFactorL( TInt aDigitalZoomFactor ); + + /** + * Gets video provider's freeze support. + * @param aFreezeSupported Freeze support status + * @return KErrNotReady if provider not initialized. + */ + TInt GetFreezeSupported( TBool& aFreezeSupported ) const; + + /** + * Returns ETrue if it is ok to freeze provider. + */ + TBool OkToFreeze() const; + + /** + * Returns ETrue if it is ok to unfreeze provider. + */ + TBool OkToUnfreeze() const; + + /** + * Sets audio as muted. + */ + void Mute(); + + /** + * Resumes audio output. + */ + void UnMute(); + + /** + * Sets UI foreground state (i.e. is the Application + * current active application or not). + * @param aForeground ETrue if the VT application is + * in foreground, EFalse otherwise. + */ + void SetUIForeground( TBool aForeground ); + + /** + * Gets current media object sharing state. Only local video related + * checks do here. Connection issues have been checked by + * the caller. + * @param aObjectSharingState On return contains current media object + * sharing state. @see MVtEngMedia::TShareObjectState. + */ + void GetObjectSharingState( + MVtEngMedia::TShareObjectState& aObjectSharingState ) const; + + /** + * Start Image sharing initialization. + */ + void InitializeShareImageL( + const MVtEngMedia::TShareObjectImageParameters& aParameters, + TBool& aFirstTime ); + + /** + * Cancel Image sharing initialization. + */ + void CancelInitializeShareImage(); + + /** + * Start Image sharing. + */ + void StartShareImageL(); + + /** + * Stop Image sharing. + */ + void StopShareImageL(); + + /** + * Report error. + */ + void ShareError( TInt aError ); + + /** + * Returns share's stored media source. + */ + TVtEngProviderType ShareStoredSource() const; + + /** + * General settings changed. + */ + void SettingsChanged(); + + /** + * Creates camera preferences extension + * @since S60 v3.2 + * @return pointer to extension + * @exeption Leaves if creation fails + */ + CVtEngCameraPreferences* CreateCameraPreferencesL(); + + /** + * Called when prepare camera has been handled in media handler. + */ + void SetIsPrepareCameraCalled( TBool aCalled ); + + /** + * Returns ETrue if prepare camera has been handled in media handler, + * EFalse otherwise. + */ + TBool IsPrepareCameraCalled() const; + + /** + * Reinitializes camera if onboard camera is being used as a provider. + */ + void HandleLayoutChangeL(); + + /** + * Returns ETrue if delayed select is pending. + */ + TBool IsDelayedSelectPending() const; + + /** + * Completes operation to mediahandler. + */ + void CompleteOperation( const TInt aResult ); + + /** + * Called when video channel is opened. + */ + void VideoChannelOpenedL(); + + private: // constructors + + /** + * C++ constructor. + * @param aObserver callback interface to Media Handler + */ + CVtEngLocalVideo( + CVtEngMediaHandler& aObserver ); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL( ); + + /** + * Async callback method + */ + static TInt CallBackFunc( TAny* aPtr ); + + /** + * Returns result. + */ + TInt Result() const; + + /** + * Sets result. + */ + void SetResult( const TInt aResult ); + + private: // Rendering configuration + + /** + * Options for window server rendering. + * iObserver callback interface + * iSize VF image size + */ + struct TOptions + { + MVtEngFrameObserver* iObserver; + TSize iSize; + }; + + /** + * Direct screen access options. + * iWsSession windor server session + * iWsSD screen device + * iWindow handle to server based window + * iRect iRect window size + * iClipRect drawing size + */ + struct TDsaOptions + { + RWsSession* iWs; + CWsScreenDevice* iWsSD; + RWindowBase* iWindow; + TRect iRect; + TRect iClipRect; + }; + + /** + * Internal state of a video provider. + */ + enum TProviderState + { + /** initial state */ + EUndefined = KErrNone, + /** never deleted */ + EPermanent, + /** to be deleted when another provider selected */ + EFading, + /** waiting for blank provider switch */ + EWaiting, + /** changing still image */ + ERefreshing + }; + + private: // inner classes + + /** + * Provider information. + */ + NONSHARABLE_CLASS( TProviderItem ) : + public MVtEngCameraPreferencesObserver + { + public: + + /** + * C++ constructor + */ + TProviderItem(); + + /** + * Destructor + */ + ~TProviderItem(); + + /** + * Sets zoom factor to resetted state. + */ + void ResetStoredValues(); + + /** + * Tries to restore preferences. + */ + TInt RestoreZoomFactor(); + + /** + * Tries to restore preferences. + */ + TInt RestorePreferences(); + + public: + // pointer to provider + CVSDataProvider* iProvider; + + // provider type + TVtEngProviderType iType; + + // provider initialized + TBool iInitialized; + + // provider has errors + TInt iErrorCode; + + // state of a provider + TProviderState iProviderState; + + // Stored zoom value + TInt iStoredZoomFactor; + + // Error code setting zoom factor + TInt iZFErr; + + public: // MVtEngCameraPreferencesObserver + + /** + * @see MVtEngCameraPreferencesObserver::Attach + */ + void Attach( MVtEngCameraPreferences& aCamPrefs ); + + /** + * @see MVtEngCameraPreferencesObserver::ColorToneUpdated + */ + void ColorToneUpdated( + MVtEngCameraPreferences::TColorTone aColorTone ); + + /** + * @see MVtEngCameraPreferencesObserver::WhiteBalanceUpdated + */ + void WhiteBalanceUpdated( + MVtEngCameraPreferences::TWhiteBalance aWhiteBalance ); + + /** + * @see MVtEngCameraPreferencesObserver::BrightnessUpdated + */ + void BrightnessUpdated( TInt aBrightness ); + + /** + * @see MVtEngCameraPreferencesObserver::ContrastUpdated + */ + void ContrastUpdated( TInt aContrast ); + + /** + * @see MVtEngCameraPreferencesObserver::Detach + */ + void Detach( MVtEngCameraPreferences& aCamPrefs ); + + public: + + /** + * Detach from preference and reset pointer. + */ + void DetachFromCameraPreferences(); + + private: + + // Pointer to camera preferences object this provider item is + // attached to + MVtEngCameraPreferences* iCamPrefs; + + // Stored color tone value + MVtEngCameraPreferences::TColorTone iColorTone; + + // Error code reading color tone value + TInt iCtErr; + + // Stored white balance + MVtEngCameraPreferences::TWhiteBalance iWhiteBalance; + + // Error code reading white balance value + TInt iWbErr; + + // Stored brightness + TInt iBrightness; + + // Error code reading brightness value + TInt iBrErr; + + // Stored contrast + TInt iContrast; + + // Error code reading contrast value + TInt iCrErr; + + // ETrue if Attach is called first time + TBool iFirstTime; + + }; + + /** + * Inner class for hiding image sharing details. + */ + NONSHARABLE_CLASS( CVtEngShareImage ) : public CBase + { + private: // enumerations + + /** + * Media object sharing internal state. + */ + enum TState + { + EStopped, + EInitializing, + ESharing + }; + + public: // New public methods + + /** + * Constructor. + */ + static CVtEngShareImage* NewL( CVtEngLocalVideo& aLocalVideo ); + + /** + * C++ destructor. + */ + ~CVtEngShareImage(); + + /** + * Start initialization of image sharing. + * @param aParameters Image sharing parameters (from UI) + * @param aCurrent Currently active provider's type. + * @param aFirstTime After call ETrue if this call was first to + * share initialize, EFalse otherwise. + * @exception May leave with KErrNotReady already initializing. May + * also leave with system wide error code if something goes wrong + * during provider initialization. + */ + void InitializeL( + const MVtEngMedia::TShareObjectImageParameters& aParameters, + TVtEngProviderType aCurrent, + TBool& aFirstTime ); + + /** + * Cancel sharing initialized image. + */ + void CancelInitialize(); + + /** + * Start sharing initialized image. + * @exception May leave with KErrNotReady if not initialized. May + * also leave with system wide error code if something goes wrong + * during provider swap. + */ + void ShareL(); + + /** + * Stop sharing image. + * @exception May leave with KErrNotReady if not sharing. May also + * leave with system wide error code if something goes wrong during + * provider swap. + */ + void StopL(); + + /** + * An error happened during initialization, sharing or stopping. + * @param aError Error reason. + */ + void Error( TInt aError ); + + /** + * Returns stored source from sharer. + * @return Stored source (source that was selected before share). + */ + TVtEngProviderType StoredSource() const; + + /** + * Get sharing state. + * @param aObjectSharingState On return contains current object + * sharing state. + */ + void GetObjectSharingState( + MVtEngMedia::TShareObjectState& aObjectSharingState ) const; + + /** + * Check whether share is being initialized or not. + * @return ETrue if share is being initialized EFalse otherwise. + */ + TBool IsInitializingShare() const; + + /** + * Called when General settings have been changed. + */ + void SettingsChanged(); + + /** + * Called when vsProviderSwitchDone() is called to local video. + */ + void ProviderSwitchDone( CVSDataProvider* aOldProvider ); + + /** + * Called when camera change event is received from PS. + */ + void NotifyCameraChanged( const TVtEngProviderType& aProviderType ); + + private: // New private methods + + /** + * C++ constructor. + */ + CVtEngShareImage( CVtEngLocalVideo& aLocalVideo ); + + /** + * 2nd constructor, may leave. + */ + void ConstructL(); + + /** + * Get image sharing parameters. + * @return Constant reference to image sharing parameters. + */ + const MVtEngMedia::TShareObjectImageParameters& Parameters() const; + + /** + * Get initialization state. + * @return ETrue if sharing is being initialized, EFalse otherwise. + */ + TBool IsInitializing() const; + + /** + * Set sharing state. + * @param aNewState New image sharing state. + */ + void SetState( const TState aNewState ); + + /** + * Fetches next available provider item pointer. + * @return Pointer to next available provider item or NULL if none + * could be found. + */ + TProviderItem* FetchProviderItem() const; + + /** + * Creates provider. + */ + void CreateProviderL( TProviderItem& aProviderItem ); + + /** + * Initializes provider. + */ + void InitializeProviderL( TProviderItem& aProviderItem ); + + /** + * Deletes provider. + */ + void DeleteProvider( TVtEngProviderType aProviderType ); + + /** + * Deletes all precreated providers. + */ + void DeleteProviders(); + + private: // Data + + // Pointer to local video instance + CVtEngLocalVideo* iLocalVideo; + + // Current state + TState iState; + + // Previous state + TState iPreviousState; + + // Copy of image sharing parameters + MVtEngMedia::TShareObjectImageParameters iParameters; + + // Type of provider that was active before image sharing + TVtEngProviderType iStoredType; + + // Type of provider that was originally active before image sharing + // This is needed because iStoredType may change according to PS + // events. + TVtEngProviderType iOriginalStoredType; + + // Currently active provider + TProviderItem* iActiveProvider; + + // Currently initialized provider + TProviderItem* iInitializingProvider; + + // Buffered items + RPointerArray< TProviderItem > iBuffered; + + // General settings were changed while sharing + TBool iSettingsChanged; + }; + + /** + * Inner class for handling delayed provider switches (e.g. PS signalled + * camera changes) + */ + NONSHARABLE_CLASS( TVtEngDelayedSelect ) + { + public: + + /** + * Constructor + */ + TVtEngDelayedSelect(); + + /** + * Called when camera change event is received from PS. + */ + void NotifyDelayedSelect( const TVtEngProviderType& aProviderType ); + + /** + * Returns ETrue if delayed select is pending, EFalse otherwise. + */ + TBool IsDelayedSelectPending() const; + + /** + * Returns delayed select target and resets stored value. + */ + TVtEngProviderType DelayedSelectTarget(); + + private: // data + + TVtEngProviderType iDelayedProviderType; + }; + + /** + * Inner class for handling layout change reinitialization. + */ + NONSHARABLE_CLASS( TVtEngLayoutChangeHandler ) + { + + public: + + /** + * Constructor + */ + TVtEngLayoutChangeHandler( CVtEngLocalVideo& aLocalVideo ); + + /** + * Called when layout change has happened + */ + void HandleLayoutChangeL(); + + /** + * Called when layout change needs to be cancelled + */ + void CancelHandleLayoutChange(); + + /** + * Called when provider is unfrozen. + * @return ETrue if unfreeze was handled by the layout change handler, + * EFalse otherwise. + */ + TBool UnfreezeL(); + + /** + * Called by the local video when provider error happens. + * @param aError Type of error + * @return ETrue If error was handled by the layout change handler + */ + TBool ProviderError( TInt aError ); + + /** + * Called by the local video when provider is ready after initialization. + * @return ETrue If callback was handled by the layout change handler. + */ + TBool ProviderReady(); + + /** + * Called by the local video when provider has been switched. + * @param CVSDataProvider Pointer of old provider instance. + * @return ETrue If callback was handled by the layout change handler. + */ + TBool ProviderSwitchDone( CVSDataProvider* aOldProvider ); + + private: + + /** + * 2nd constructor + */ + void ConstructL(); + + /** + * Does the layout change handling. + */ + void DoHandleLayoutChangeL(); + + /** + * Call to CompleteL() that is trapped. + */ + TInt Complete( const TInt aError ); + + /** + * Completes handling and resets state to EIdle. + */ + void CompleteL( const TInt aError ); + + /** + * Completes asynchronous request. + */ + void CompleteOperation( const TInt aError ); + + private: // data + + // Pointer to local video instance + CVtEngLocalVideo* iLocalVideo; + + /** + * Layout change handler internal state. + */ + enum TState + { + /** Layout change handler is ready to be called */ + EIdle, + /** Layout change handler has been called, but layout update is + pending */ + ELayoutChangePending, + /** Layout change handler is switching blank provider */ + ESwitchingBlank, + /** Layout change handler is initializing camera provider */ + EInitializingCamera, + /** Layout change handler is switching camera provider */ + ESwitchingCamera + }; + + // Handler's internal state + TState iState; + + // Stored provider type + TVtEngProviderType iStored; + + }; + + // class for NGA rendering viewfinder bitmap. + NONSHARABLE_CLASS( CVtEngVFBitmapNGARender ) : public CActive + { + + public: // constructor and destructor + + /** + * Two-phased constructor. + * @param aObserver call back interface to Display Sink + * @return instance of CVtEngDrawDSA + */ + static CVtEngVFBitmapNGARender * NewL(); + + // Destructor. + ~CVtEngVFBitmapNGARender(); + + public: // New mothod + + // update the buffer for bitmap, also activate this AO + TInt UpdateBitmapL( CFbsBitmap& aFrame ); + + // Initialize surface and set it to the background + TInt AttachSurfaceL( RWsSession *aWs, RWindow *aWindow ); + + private: // constructors + + // C++ constructor. + CVtEngVFBitmapNGARender(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL( ); + + private: // From CActive. + + /* + * @see CActive::RunL + */ + virtual void RunL(); + + /** + * @see CActive::DoCancel() + */ + virtual void DoCancel(); + + private: // enumerations + + enum { EVtEngVFMaxBuffers = 1 }; + + private: // Data + + RSurfaceManager iSurfaceManager; + RSurfaceUpdateSession iSurfaceUpdateSession; + + //Surface pixel format + const TUidPixelFormat iSurfaceFormat; + + RChunk* iSurfaceChunk; + + TUint8* iBuffer; + + //NGA surface id + TSurfaceId iSurfaceId; + + RWsSession *iWs; + RWindow *iWindow; + + //NGA surface has created + TBool iSurfaceCreated; + + TTimeStamp iTimeStamp; + + }; + + private: + + /** + * Rendering method. + */ + enum TRenderingMethod + { + // Unspecified + EUnspecified, + // Through window server + EWindowServer, + // Direct screen access + EDSA, + // Display posting + EDP + }; + + /** + * View finder state. + */ + enum TViewFinderState + { + // View finder not active. + EVFNone, + // View finder started to reveive bitmaps. + EVFReceivingBitmaps, + // View finder started to render with DSA. + EVFRenderingDsa + }; + + /** + * Internal state. + */ + enum TState + { + // Initial and state when error occurred. + ELocNone, + // Provider initialization ongoing. + ELocInitializing, + // Switch to another provider ongoing. + ELocSwichingProvider, + // Provider initialization or switch completed. + ELocReady + }; + + public: + + /** + * Deletes provider. + * @param aItem provider to delete + */ + void DeleteProvider( TProviderItem& aItem ); + + /** + * Deletes provider. + * @param aType type of provider to delete. + */ + void DeleteProvider( TVtEngProviderType aType ); + + /** + * Resets local video after a video call. + */ + void Reset(); + + private: // New functions + + /** + * Sets current camera id. + */ + void SetCurrentCameraId( MVtEngMedia::TCameraId aCamId ); + + /** + * Configures provider item for outwards camera in + * construction phase. + */ + void ConfigureOutwardsCameraItem( + TProviderItem& aItem, + const TInt aCurrentIndex ); + + /** + * Calculater digital zoom steps. + * @param aProvider the used provider in counting + * @return amount of major zoom steps + */ + TInt CalculateMajorDigitalZoomStepCount( + CVSDataProvider* aProvider ); + + /** + * Calculater digital zoom steps. + * @param aInfo provider info structure from which zoom steps will be + * calculated + * @return amount of major zoom steps + */ + TInt CalculateMajorDigitalZoomStepCount( + const TVSDataProviderInfo& aInfo ) const; + + /** + * Deletes audio source. + */ + void DeleteAudioSource(); + + /** + * Gets a provider for a given type. + * @param aType type to search for + * @param aItem returned provider item + * @return index in provider array or KErrNotFound + */ + TInt GetProviderByType( + TVtEngProviderType aType, TProviderItem& aItem ); + + /** + * Gets a provider for a given type. + * @param aType type to search for + * @param aItem returned provider item + * @return index in provider array or KErrNotFound + */ + TInt GetProviderByType( + TVtEngProviderType aType, TProviderItem*& aItem ); + + /** + * Gets a provider for a given provider instance. + * @param aInstance Instance to search for + * @param aItem returned provider item + * @return index in provider array or KErrNotFound + */ + TInt GetProviderByInstance( + const CVSDataProvider* aInstance, + TProviderItem*& aItem ) const; + + /** + * Initializes provider. + * @param aProviderItem provider + */ + void InitializeProviderL( TProviderItem& aProviderItem ); + + /** + * Initializes provider for sharing. + */ + void InitializeShareProviderL( TProviderItem& aProviderItem, + const TDesC8& aParams ); + + /** + * Re-creates provider. First deletes old instance inside provider + * item structure and then creates a new instance, using given + * provider type. + * @param aProviderItem Provider to be recreated. + * @param aType Type of the new provider to be created. + */ + void ReCreateProviderL( + TProviderItem& aProviderItem, const TVtEngProviderType aType ); + + /** + * Provider index by provider type. + * @param aType Type of provider + */ + TInt ProviderIndex( TVtEngProviderType aType ) const; + + /** + * Gets a provider index by state. + * @param aState state of returned provider + * @return Index of provider + */ + TInt ProviderIndexByState( TProviderState aState ) const; + + /** + * Gets a provider index by provider instance. + * @param aInstance instance of provider to be found + * @return Index of provider or KErrNotFound if given provider item + * is not found + */ + TInt ProviderIndexByInstance( const CVSDataProvider* aInstance ) const; + + /** + * Creates VideoSource provider by type. + * @param aType Engine provider type + * @return CVSDataProvider pointer + */ + CVSDataProvider* CreateDataProviderL( TVtEngProviderType aType ); + + /** + * Maps camera orientation to provider type. + * @param aOrientation camera orientation + * @return provider type + */ + static TVtEngProviderType + OrientationToType( TCameraInfo::TCameraOrientation aOrientation ); + + /** + * Maps camera ID to provider type. + * @param aId camera ID + * @return provider type + */ + static TVtEngProviderType CameraIdToType( MVtEngMedia::TCameraId aId ); + + /** + * Creates blank still image provider. + * @param aIndex index of still image provider + */ + void CreateBlankProviderL( const TInt aIndex ); + + /** + * Creates default still image provider. + * @param aIndex index of default still image provider + */ + void CreateDefaultStillImageProviderL( const TInt aIndex ); + + /** + * Updates available camera providers. + * @return primary provider + */ + TVtEngProviderType UpdateAvailableProvidersL(); + + /** + * Switches to active provider. + */ + void SwitchProvider( TProviderItem* aProviderItem ); + + /** + * Overloaded SwitchProvider() that takes new provider as a parameter. + */ + void SwitchProvider( TProviderItem& aProviderItem ); + + /** + * Uninitializes non-permanent provider. + */ + void UninitializeProviderL(); + + /** + * Updates iState if view finder is active. + */ + void UpdateState(); + + /** + * Checks if initialization or provider switch is pending. + * @return ETrue if either one is pending + */ + TBool InitializingOrSwitching() const; + + /** + * Resets provider info index variables. + */ + void ResetIndices(); + + /** + * Sets active camera tracking. + * @param aProviderIndex current camera in use + * @return error code + */ + TInt SetCameraTrackingL( TInt& aProviderIndex ); + + /** + * Maps pubsub provided camera id to internal indexes. + * @param aCameraId id to map + * @return internally mapped id + */ + MVtEngMedia::TCameraId MapCameraInternally( TInt aCameraId ); + + /** + * Checks if desired camera is available. + * @param aType provider type to return + */ + void CameraAvailable( CVtEngLocalVideo::TVtEngProviderType &aType ); + + /** + * checks if given provider type is already waiting for initialization + * or switch. + * @param aType Provider type. + * @return ETrue if given provider type is in waiting state, EFalse + * otherwise. + */ + TBool IsProviderWaiting( TVtEngProviderType aType ) const; + + /** + * Returns highest provider type which is available for selection. + * Priority is following: + * KVtEngProviderCam1 << highest + * KVtEngProviderCam2 + * KVtEngProviderImage + * KVtEngProviderNone + * If eg. cam2 is designated as preferred, possible returns values are + * Cam2, Image and None. + * + * @param aType in/out argument. In => preferred provider which + * caller of the method wishes to select + * Out => highest available provider + * @return ETrue if preferred == highest i.e. aPreferred is intact + * + */ + TBool GetHighestSelectableProvider( TVtEngProviderType& aPreferred ) const; + + /** + * checks if given provider type is acitven + * @param aType Provider type. + * @return ETrue if given provider is already active, EFalse + * otherwise. + */ + TBool IsActiveProvider( TVtEngProviderType aType ) const; + + + private: // From CActive. + + /** + * Handles sync operations as async. + * @see CActive::RunL + */ + virtual void RunL(); + + /** + * @see CActive::DoCancel() + */ + virtual void DoCancel(); + + private: + + // Local video flags + enum TVtEngLocalVideoFlags + { + // Camera 1 is available (inwards) + EFlagCamera1Available = 0x00000001, + // Camera 2 is available (outwards) + EFlagCamera2Available = 0x00000002, + // video call ongoing + EFlagInitialized = 0x00000004, + // view finder enabled from UI + EFlagVFEnabled = 0x00000008, + // Non-user orginated switch + EFlagAutomaticSwitchCallback = 0x00000010, + // Audio muted + EFlagAudioMuted = 0x00000020, + // Only initialize a provider (no switch when initialized) + EFlagInitializeOnly = 0x00000040, + // Signal observer when switch is complete + EFlagSignalSourceSelection = 0x00000080, + // Provider event received while switch ongoing. + // When this is set and switch completes it + // is checked if revert to previous is needed. + EFlagCheckRevertToPrevious = 0x00000100, + // Avoid calculating the step count by using flag. + EFlagZoomStepCountNeedsMapping = 0x00000200, + // VT application foreground state + EFlagUIForeground = 0x00000400, + // VT application background state ( notification purpose) + EFlagUIBackground = 0x00000800, + // Provider is frozen + EFlagFrozen = 0x00001000 + }; + + /** + * Sets a flag on. + * @param aFlag flag to set + */ + void SetFlag( const TInt aFlag ); + + /** + * Removes a flag. + * @param aFlag flag to remove + */ + void ClearFlag( const TInt aFlag ); + + /** + * Checks if a flag has been set. + * @param aFlag flag to check + * @return ETsrue if set + */ + TBool IsFlag( const TInt aFlag ) const; + + private: // Data + + // Options for window server rendering. + TOptions iOptions; + + // Options for DSA rendering. + TDsaOptions iDsaOptions; + + // Video source controller. + CVSController* iSourceController; + + // Video source. + CVSDataSource* iSource; + + // Audio source. + MVTAudioSource* iAudioSource; + + // Video providers (cameras and still image). + CArrayFixFlat* iVideoProviders; + + // Currently active provider. + TProviderItem* iActiveProvider; + + // Provider item we're switching away from. + TProviderItem* iFadingProvider; + + // Provider that is selected as next one and + // is initializing or switching. + TProviderItem* iSelectedProvider; + + // DSA or window server. + TRenderingMethod iRenderingMethod; + + // Local video status. + TState iState; + + // View finder state. + TViewFinderState iViewFinderState; + + // Callback interface to Media Handler. + CVtEngMediaHandler& iObserver; + + // Still image file name. + TFileName iStillImage; + + // Local video state flags. + TInt iFlags; + + // Friend declaration provides extended access. + friend class TProviderItem; + + // Member variables to use in referencing to + // provider information + TInt iProviderInfoIndexCam1; + TInt iProviderInfoIndexCam2; + TInt iProviderInfoIndexStill; + + // Used for default camera notifications. + CVtEngPubSubsListener* iCameraListener; + + // Camera received from pubsub. + MVtEngMedia::TCameraId iCurrentCamera; + + // Contains logics for image sharing. + CVtEngShareImage* iShareImage; + + // Pointer to camera preferences extension + CVtEngCameraPreferences* iCameraPref; + + // Logics for delayed provider selection + TVtEngDelayedSelect iDelayedSelect; + + // Active provider's info + TVSDataProviderInfo iProviderInfo; + + // ETrue if prepare camera has been handled in media handler + TBool iPrepareCameraCalled; + + // Layout change handler + TVtEngLayoutChangeHandler iLayoutChangeHandler; + + // ASync callback + CAsyncCallBack* iAsyncCallBack; + + // Result + TInt iResult; + + // Pointer to provider item that is being initialized + TProviderItem* iInitializingProvider; + + // Number of cameras in the device + TInt iNumSupportedCameras; + + CVtEngVFBitmapNGARender *iNGARender; + RWindow *iWindow; + RWsSession *iWs; + }; + +#endif // CVTENGLOCALVIDEO_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/CVtEngMediaHandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/CVtEngMediaHandler.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,1299 @@ +/* +* Copyright (c) 2004-2007 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 session interface. +* +*/ + + + +#ifndef CVTENGMEDIAHANDLER_H +#define CVTENGMEDIAHANDLER_H + +// INCLUDES +#include +#include +#include "MVtEngMedia.h" +#include "vtengcommands.h" +#include "CVtEngLocalVideo.h" +#include "MVtEngSettingObserver.h" + +// FORWARD DECLARATIONS +class CVtEngLocalVideo; +class CVtEngRemoteVideo; +class MVtEngFrameObserver; +class CVtEngOperation; +class CVtEngExtensionBase; + +// CLASS DECLARATION + +/** +* Media control. +* +* @lib videoteleng.lib +* @since Series 60 2.6 +*/ +NONSHARABLE_CLASS( CVtEngMediaHandler ) : + public CBase, + public MVtEngMedia, + public MVtEngSettingObserver, + public MVtProtocolHandler + { + public: // Constructor and destructor. + + /** + * Symbian two-phase constructor. + * @return media handler instance + */ + static CVtEngMediaHandler* NewL(); + + /** + * Destructor. + */ + ~CVtEngMediaHandler(); + + public: // From MVtEngMedia. + + /** + * @see MVtEngMedia + */ + virtual TInt GetMediaState( + const TMediaDirection aMediaDirection, + TInt& aActiveMedia ) const; + + /** + * @see MVtEngMedia + */ + virtual TBool RenderingStarted( + const TMediaDirection + aDirection ) const; + + /** + * @see MVtEngMedia + */ + virtual TInt GetSource( TMediaSource& aSource ) const; + + /** + * @see MVtEngMedia + */ + virtual TInt GetSourcesCaps( TInt& aCaps ) const; + + /** + * @see MVtEngMedia + */ + virtual TInt GetCurrentCameraId( TCameraId& aId ) const; + + /** + * @see MVtEngMedia + */ + virtual TInt GetCameraInfo( + const TCameraId aId, + TCameraInfo& aInfo ) const; + + /** + * @see MVtEngMedia + */ + virtual TInt GetCurrentZoomStep( TInt& aCurrentStep ); + + /** + * @see MVtEngMedia + */ + virtual TInt GetMaxZoomStep( TInt& aMaxZoomStep ); + + /** + * @see MVtEngMedia + */ + virtual TInt GetMajorZoomStepCount( TInt& aCount ); + + /** + * @see MVtEngMedia + */ + virtual void GetMajorZoomStep( TInt aIndex, TInt& aStep ); + + /** + * @see MVtEngMedia + */ + virtual TInt GetFreezeSupported( TBool& aFreezeSupported ) const; + + /** + * @see MVtEngMedia + */ + virtual TInt GetFreezeState( TBool& aFrozen ) const; + + /** + * @see MVtEngMedia + */ + virtual TInt GetDsaState( + const TMediaDirection aMediaDirection, + TBool& aActive ) const; + + /** + * @see MVtEngMedia + */ + virtual TBool VideoCallConnected () const; + + /** + * @see MVtEngMedia + */ + virtual void GetVideoQuality( TVideoQuality& aVideoQuality ) const; + + /** + * @see MVtEngMedia + */ + virtual void GetObjectSharingState( + TShareObjectState& aObjectSharingState ) const; + + /** + * @ see MVtEngMedia + */ + virtual void GetCameraOrientations( + TCameraOrientation& aPrimaryCameraOrientation, + TCameraOrientation& aSecondaryCameraOrientation ) const; + +public: // New functions. + + /** + * Tells if the Protocol initialization has completed. + * @return ETrue if initialized + */ + TBool ProtoInitialized() const; + + /** + * Performs an operation in the handler. + * @param operation to be performed on the handler + */ + virtual void HandleL( CVtEngOperation& aOperation ); + + /** + * Returns if command can be performed by media handler. + * @return KErrNone if a command can be perfomed + * KErrNotReady if not in appropriate state + * KErrNotSupported if command is not for media handler + */ + TInt ValidateCommand( const TVtEngCommandId aCommand ) const; + + /** + * Returns ETrue if video channel is closed. + */ + TBool IsVideoChannelClosed() const; + + /** + * Request update last remote video frame through MVtEngFrameObserver::vtSetFrame + */ + void RequestLastRemoteFrame(); + + public: // from MVtProtocolHandler + + /** + * Handles callback from protocol. + * @param aResponse response + */ + virtual void HandleSessionCommandEventL(const TVtCommandResponse& aResponse); + + public: // From MVtProtocolHandler. + + /** + * Handles callback from protocol audiocontroller. + * @param aId which command + * @param aCmd which audio command + * @param aContextData any additional data + * @param aStatus how did it end up with + */ + virtual void HandleAudioOutputControlCommandComplete(TInt aId, + TVtAudioOutputControlCommand aCmd, + TAny *aContextData, + TInt aStatus); + + public: // From MVtProtocolHandler. + + /** + * Handles event from protocol. + * @param aEvent event + */ + virtual void HandleSessionInformationalEventL( + const TVtIndicationEvent& aEvent); + + public: // from MVtProtocolHandler + + /** + * Handles error event from protocol. + * @param aEvent error event + */ + virtual void HandleSessionErrorEventL(const TVtErrorEvent& aEvent); + + public: // from MVtEngSettingObserver + + /** + * Handles shared data setting change. + * @param aId setting id + * @param aValue setting value + */ + virtual void HandleSettingChangedL( + CVtEngSettings::TSettingId aId, + const TDesC& aValue ); + + public: // From MVtProtocolHandler. + + /** + * @see MVtProtocolHandler. + */ + void HandleVideoEncoderCommandCompletedL( + const TVtCommandResponse& aResponse ); + + /** + * @see MVtProtocolHandler. + */ + void HandleVideoEncoderInformationalEventL( + const TVtIndicationEvent& aEvent); + + public: // From MVtProtocolHandler + + /** + * @see MVtProtocolHandler. + * @since 3.1 + */ + void HandleH324MConfigCommandCompletedL( const TVtCommandResponse& aResponse ); + + /** + * @see MVtProtocolHandler. + * @since 3.1 + */ + void HandleH324MConfigInformationalEventL( + const TVtIndicationEvent& aEvent ); + + public: // New functions. + + /** + * Initializes media handler. + * @param aStatus signaling handle + */ + void InitializeL( TRequestStatus& aStatus ); + + /** + * Cancels media handler initialization. + */ + void CancelInitialize(); + + /** + * Initializes default blank provider. + * @param aStatus signaling handle + */ + void InitializeProviderL( TRequestStatus& aStatus ); + + /** + * Cancel Image sharing initialization. + */ + void CancelInitializeShareImage(); + + /** + * Sets protocol interface. + * aProto2Way protocol interface + */ + void SetSessionCommand( MVtSessionCommand* aProto2Way ); + + /** + * Unitializes media handler. + * @param aStatus request semaphore to complete + * when uninitialization is complete + */ + void Uninitialize( TRequestStatus& aStatus ); + + /** + * Goes to next step of uninitialization process, it can + * be one of following + * - Cancel all Protocol commands + * - Protocol disconnect + * - Protocol reset + * - Switch blank provider. + */ + void UninitializeNextStep(); + + /** + * Sets selected camera ID. + * @param aId camera ID (primary or secondary) + * @param aUpdateRequired if ETrue switch could not be performed + * Switch will be done when engine has been initialized. + */ + void SetSelectedCameraId( + const TCameraId aId, + TBool aUpdateRequired = EFalse ); + + /** + * Handles source initialization or switch. + * @param aResult Symbian OS error code + */ + void HandleLocalVideoOperationCompleteL( const TInt aResult ); + + /** + * SDK init info. + * @return Protocol initialization info + */ + TVtInitInfo& SdkInitInfo(); + + /** + * Returns protocol state maintained by VTEngine, not by Protocol. + * @return state + */ + MVtProtocolCommand::TVtProtocolState ProtoState(); + + /** + * Sets up video connection to remote terminal. + * @return Symbian OS error code + */ + TInt Connect(); + + /** + * Disconnects session. + * @return Symbian OS error code + */ + TInt Disconnect(); + + /** + * Adds video data source to protocol engine. + * @param Video channel logical channel ID number. + * @return Symbian OS error code + */ + TInt AddVideoSource( TUint aChannelId ); + + /** + * Adds audio data source to protocol engine. + * @param Audio channel logical channel ID number. + * @return Symbian OS error code + */ + TInt AddAudioSource( TUint aChannelId ); + + /** + * Adds video sink. + * @param Video channel logical channel ID number. + * @return Symbian OS error code + */ + TInt AddVideoSink( TUint aChannelId ); + + /** + * Adds audio sink. + * @param Audio channel logical channel ID number. + * @return Symbian OS error code + */ + TInt AddAudioSink( TUint aChannelId ); + + /** + * Sets the output volume for Protocol. + * @param aVolume the level of the volume + * @return Symbian OS error code + */ + TInt SetVolume( const TInt aVolume, + CVtEngOperation* aOperation = NULL ); + + /** + * Enables video when primary camera becomes available. + * @param aEnable do we enable or disable + * @return Symbian OS error code + */ + TInt AutoEnableVideo( TBool aEnable = ETrue ); + + /** + * Deletes protocol instance and associated Protocol interfaces. + */ + void FinalizeUninitialization(); + + /** + * Creates extension according to API Uid. + * @since S60 v3.2 + * @param aUid extension API Uid. + * @return Extension pointer + * @exeption Leaves if creation fails + * + */ + CVtEngExtensionBase* CreateExtensionsL( const TUid& aUid ); + + /** + * Checks if there is already an operation pending. + * @return KVtEngCommandNone if no operation is pending or Command identifier + */ + TVtEngCommandId GetPendingCommand(); + + private: // new functions + + /** + * Sends a sync message to Protocol after provider switch. + */ + void RequestFrame( ); + + /** + * Sets video quality + */ + void SetVideoQualityL( + const TVideoQuality aVideoQuality, + const TBool aSetPeerVideoQuality ); + + /** + * Sets peer video quality + */ + void SetPeerVideoQuality( const TVideoQuality aVideoQuality ); + + /** + * Check's flag's validity. If not valid, panic's in debug mode. + * @param aFlag flag to check. + */ + void AssertFlag( const TInt aFlag ) const; + + /** + * Gets the version information from SysUtil + * and sets it into Protocol. + */ + void SetVersionInfoL(); + + /** + * Sets supported resolutions to Protocol. + */ + void SetSupportedResolutions(); + + /** + * Sets used call setup enhancement parameters. + */ + void SetFastCsupOptions(); + + /** + * Does Protocol reset. + */ + void ResetProtoL(); + + /** + * Does the actual disconnecting with Protocol. + */ + void DisconnectProtoL(); + + /** + * Sets the defaults for volumes. + */ + void InitializeVolume(); + + /** + * Checks if a flag in iProtoInitFlags is set. + * @return ETrue if flag is set + */ + TBool IsFlag( const TInt aFlag ) const; + + /** + * Sets a flag in iProtoInitFlags. + * @param aFlag flag to set + */ + inline void SetFlag( const TInt aFlag ); + + /** + * Clears a flag in iProtoInitFlags. + * @param aFlag flag to clear + */ + inline void ClearFlag( const TInt aFlag ); + + /** + * Requests the volume controller. + * @return ETrue if retrieved ok + */ + TBool RequestAudioControllerL(); + + /** + * Spatial trade off indication handling method. Indication is + * sent by the peer every time when its spatial trade off is updated. + * @param aLogicalChannelId Indication's logical channel Id. + * @param aTradeOff Indication trade off value. + */ + void HandleSpatialTradeoffIndication( + const TUint16 aLogicalChannelId, const TUint8 aTradeOff ); + + /** + * Spatial trade off command handling method. Spatial trade off + * command is sent by the peer whenever peer wants to adjust our + * video quality. + * @param aLogicalChannelId Command's logical channel Id. + * @param aTradeOff New trade off value. + */ + void HandleSpatialTradeoffCommandL( + const TUint16 aLogicalChannelId, const TUint8 aTradeOff ); + + private: // constructor and destructor + + /** + * C++ default constructor. + */ + CVtEngMediaHandler(); + + /** + * Symbian constructor that may leave. + */ + void ConstructL(); + + private: + /** + * Operation values + */ + enum TOperation + { + /** + * No-op. + * 0 + */ + ENone, + + /** + * Add video source to protocol. + * 1 + */ + EAddVideoSource, + + /** + * Add video source to protocol. + * 2 + */ + EAddVideoSink, + + /** + * Add audio source to protocol. + * 3 + */ + EAddAudioSource, + + /** + * Add audio source to protocol. + * 4 + */ + EAddAudioSink, + + /** + * Connect protocol. + * 5 + */ + EConnectProto, + + /** + * Mute audio. + * 6 + */ + EMuteAudio, + + /** + * Resume audio sending. + * 7 + */ + EUnmuteAudio, + + /** + * Enable video for peer. + * 8 + */ + EEnableVideo, + + /** + * Disable video for peer. + * 9 + */ + EDisableVideo, + + /** + * Cancel ongoing request to Protocol + * as part of uninitiazation process. + * 10 + */ + EUninitializeCancelAllProto, + + /** + * Disconnect protocol. + * 11 + */ + EDisconnectProto, + + /** + * Destructs local/remote video and VS instances. + * 12 + */ + EDestructInternals, + + /** + * Terminates H.324 session. + * 13 + */ + ETerminateSession, + + /** + * Removing sinks and sources. + * 14 + */ + ERemovingSinksAndSources, + + /** + * Request 324 control interface from protocol. + * 15 + */ + EGet324CtrlInterface, + + /** + * Set volume. + * 16 + */ + ESetAudioVolume, + + /** + * Gets the maximum volume for Protocol. + * 17 + */ + EGetAudioGetMaxVolume, + + /** + * Reset protocol. + * 18 + */ + EDestructProtoPhaseDisconnect, + + /** + * Destruct switch blank. + * 19 + */ + EDestructSwitchBlank, + + /** + * Reset protocol. + * 20 + */ + EDestructProtoPhaseReset, + + /** + * Check Protocol state. + * 21 + */ + ECheckProtoState, + + /** + * Enables video internally (not originated by UI). + * 22 + */ + EEnableVideoInternal, + + /** + * Disables video internally (not originated by UI). + * 23 + */ + EDisableVideoInternal, + + /** + * Request H263Enc interface from protocol. + * 24 + */ + EGetH263EncInterface, + + /** + * Requests an intra frame. + * 25 + */ + ESendIntraframe, + + /** + * Set supported resolutions. + * 26 + */ + ESetSupportedResolutions, + + /** + * Set video quality (by changing framerate) + * 27 + */ + ESetVideoQuality, + + /** + * Remove H324 interface + * 28 + */ + ERemove324CtrlInterface, + + /** + * Remove video encoder interface + * 29 + */ + ERemoveH263EncInterface, + + /** + * Sends Video Temporal-spatial trade off command + * 30 + */ + ESendVTSTO, + + /** + * Sets fast call setup options + * 31 + */ + ESetFastCsupOptions, + + /** + * Sets vendor id + * 32 + */ + ESetVendorId, + + /** + * Set interval when I-frames are sent + * 33 + */ + ESetIFrameInterval + }; + + /** + * Operation and related command id. + */ + struct TCmdOpPair + { + // Operation + TOperation iOp; + // Command id returned by proto2way asynch request + TInt iProtoCmdId; + }; + + /** + * Enables/Disables video sending. + * @param aEnable ETrue if video is to be enabled + * @param aOp operation to be added + * NOTE. Valid only for enabling video, not when disabled. + * @see void AutoEnableVideo + * @return started operation or ENone + */ + TOperation EnableVideoL( + const TBool aEnable, + const TOperation aOp = EEnableVideo ); + + /** + * Calls Protocol pausing and acts according to the result. + * @return operation id for performed operation + */ + TOperation DoPauseVideo(); + + /** + * Continues to next step of uninitialization. + * @param aOp operation to perform + * @return command id + */ + void ContinueUninitializeL( const TOperation aOp ); + + /** + * Cancels all the running commands within Protocol. + * @param operation to be returned + * EUninitializeCancelAllProto if cancellation is ongoing + * (either because was already or just started) + * ENone if cancellation is not ongoing + * @return error code + * KErrNotReady if engine not in suitable state + * KErrAlreadyExists if cancel was already pending + * KErrNone if cancellation request succeeded + * other Symbian OS error code if cancellation fails + */ + TInt CancelAllProtoCommands( TOperation &aOp ); + + /** + * Stops view finder and remote video rendering. + */ + void StopRendering(); + + /** + * Updates volume to Protocol (if possible). + */ + void UpdateVolume(); + + /** + * Initiates protocol engine reset. + */ + void ResetProto2WayL(); + + /** + * Removes operation from pending operations array. + * @param aOp TOperation + * @return ETrue if operation was found (and hence removed) + */ + template + TBool RemoveOperation( const T& aOp ); + + /** + * Adds operation pending for callback. + * @param aOp operation value + * @param aCmdId protocol commd id or 0 if not Protocol cmd + * @param aResetExisting if ETrue removes existing operations + * from array + * @return index of the operation in array (i.e. >= 0 ) + */ + TInt AddOperation( + const TOperation aOp, + TInt aCmdId, + const TBool aResetExisting = EFalse ); + + /** + * Checks if an operation is pending. + * @param aOp operation + * @return index if operation is pending or KErrNotFound + */ + TInt IsPending( const TOperation aOp ) const; + + /** + * Checks if an operation is pending. + * @param aCmdId command id + * @return index if operation is pending or KErrNotFound + */ + TInt IsPending( const TInt aCmdId ) const; + + /** + * Completes asynchronous operation. + * @param aResult + * @return KErrNotFound if no operation else KErrNone + */ + TInt CompleteOp( const TInt aResult ); + + /** + * Completes asynchronous operation asynchronously. + * @param aResult + * @return KErrNotFound if no operation else KErrNone + */ + void AsyncCompleteOp( const TInt aResult = KErrNone ); + + /** + * Checks if specific operation matches to response from protocol. + * @param aProtoCmdId command id returned by protocol + * @param aOperation operation to search for in pending commands + * @param aIndex index in iPendingOps array if found + * @return ETrue if there's corrensponding entry in pending ops + */ + TBool MatchResponseToPendingOps( + const TInt aProtoCmdId, + const TOperation aOperation, + TInt* aIndex = NULL ); + + /** + * Starts "self-destruction" timer. + */ + void StartDisconnectTimerL(); + + /** + * Assigns new pending operation. Only one can be pending at a time + * so if there already is pending operation it is completed with error. + * @param aOperation operation to assign as pending + * @param aReplaceError error code to complete penging operation if + * one exists. If KErrNone is passed, replacement is not done. + * @return KErrNone if assignment done successfully i.e. there was + not pending operation that was completed. + * KErrCancel if some other operation was pending and was + * completed with aReplaceError. Operation is + * still assigned successfully. + * KErrGeneral if operation was not assigned. + */ + TInt AssignPendingOp( + CVtEngOperation& aOperation, + TInt aReplaceError = KErrCancel ); + + /** + * Callback function that completes ongoing operation. + * @param aAny pointer to an instance of the class. + * @return always KErrNone. + */ + static TInt DoCompleteOp( TAny* aAny ); + + /** + * Implementation of self-destruction timer activity. + * Causes a panic. + * @param aAny pointer to an instance of the class + * Not used. + * @return KErrNone; + */ + static TInt TimerCallback( TAny* aAny ); + + /** + * Creates and enques async callback for uninitialization. + * @see iNextStepCallback + */ + void NextUninitStepCallbackL(); + + /** + * Callback method for async uninitialization step. + * @seeiNextStepCallback + * @return KErrNone; + */ + static TInt UninitCallback( TAny* aAny ); + + /** + * Query 2-way's additional interfaces, encoder and H324 + * @return KErrNone; + */ + void QueryProtoInterfacesL(); + + /** + * Release 2-way's additional interfaces, encoder and H324 + * @return KErrNone; + */ + void ReleaseProtoInterfacesL(); + + /** + * Check for pending Protocol extension interface commands. + * @return ETrue if one or more extension command is pending + */ + TBool ExtensionCommandsPending() const; + + /** + * Checks is it possible to add sink / source from session + * state point of view. + * @return ETrue if adding is allowed. + */ + TBool MediaAddingValidity() const; + + /** + * Provider initialization state + */ + enum TInitState + { + /** + * Initialization not ongoing. + */ + EInitStateNone, + + /** + * Initialize still image. + */ + EStateInitStillImage, + + /** + * Initilize default blank provider. + */ + EStateInitProvider, + + /** + * Provider is set to none. + */ + EStateWaitingProviderChangeForUninit, + + /** + * Initialization has been cancelled. + */ + EStateInitCanceled + }; + + /** + * State flags. + */ + enum + { + // Protocol state flags + // Sink/source added + EProtoAudioSourceAdded = 0x000001, + EProtoVideoSourceAdded = 0x000002, + EProtoAudioSinkAdded = 0x000004, + EProtoVideoSinkAdded = 0x000008, + // Track paused + EProtoAudioTrackPaused = 0x000040, + EProtoVideoTrackPaused = 0x000080, + + // Pause/resume related flags. + ETwoStageOperation = 0x000100, + ESourceUpdateNeeded = 0x000200, + EProtoPauseVideoRequested= 0x000400, + EProtoPauseVideoBlankProv= 0x000800, + EProtoContVideoBlankProv = 0x001000, + EProtoContVideoBlankInit = 0x002000, + + // Must send intra + EProtoSendIntraFrame = 0x004000, + + // 324 interface acquired + EProto324IFAcquired = 0x008000, + + // Cancel all command is called on Protocol + // or there's nothing to cancel + EProtoCancelProtoCmdsOk = 0x010000, + + // NON Protocol related flags + + EVideoQualitySetByPeer= 0x020000, + + // Outgoing video channel closed (after being open) + // Used for preventing video pause/resume when + // the channel is not open + EOutVideoChannelClosed = 0x040000, + + // Outgoing audio channel closed (after being open) + // Used for preventing audio pause/resume + // the channel is not open + EOutAudioChannelClosed = 0x080000 + }; + + + /** + * Defines actions that can be taken when sharing started + * and/or stopped + */ + enum TVideoEngAction + { + EVideoActionNone, + EVideoActionEnable, + EVideoActionDisable + }; + + /** + * Helper class for handling video quality manipulation. + */ + class TVtEngVideoQuality + { + + public: + + // Forward for inner class + class TVQSParams; + + public: + + /** + * Constructor. + */ + TVtEngVideoQuality(); + + /** + * Destructor. + */ + ~TVtEngVideoQuality(); + + /** + * Sets new local video quality setting. + * @param aId Operation id. + * @param aSetPeer ETrue if peer video quality needs to be set, + * EFalse otherwise. + */ + void SettingVideoQuality( TInt aId, const TVideoQuality aValue, + TBool aSetPeer ); + + /** + * Get current local video quality setting. + * @return Current local video quality setting. + */ + TVideoQuality VideoQuality() const; + + /** + * Setting video quality succeeded. + * @return ETrue if record with given id was found, EFalse other + * wise. + */ + TBool SettingSucceeded( TInt aId, TVQSParams& aParams ); + + /** + * Setting video quality failed. + */ + void SettingFailed( TInt aId ); + + /** + * Called when video quality indication is received from peer. + */ + void UpdateVideoQuality( const TVideoQuality aVideoQuality ); + + /** + * Converts given trade off value to video quality enum. + */ + TVideoQuality FromTradeOff( const TInt aTradeOff ) const; + + /** + * Converts given video quality enum to trade off value. + */ + TInt ToFrameRate( const TVideoQuality aVideoQuality ) const; + + /** + * Converts given video quality value to frame rate. + */ + TUint8 ToTradeOff( const TVideoQuality aVideoQuality ) const; + + /** + * Finds id of setting param and returns index to it. + */ + TInt FindVQSParam( TInt aId ) const; + + public: + + /** + * Video quality parameters. + */ + struct TVQSParams + { + + public: + + // Default constructor + TVQSParams(); + + // Constructor with initializing parameters + TVQSParams( TInt aId, const TVideoQuality aValue, + TBool aSetPeer ); + + public: // data + + // Operation id + TInt iId; + + // VideoQuality value to be set + TVideoQuality iValue; + + // Defines whether peer video quality needs to be set or not + TBool iSetPeer; + + }; + + private: + + // Current local video quality + TVideoQuality iCurrent; + + // Qued params + RArray< TVQSParams > iParamList; + }; + + // Class for handling different kind of H.245 logical + // channels and their state in different MONA call setup + // scenarios + class TLogicalChannel + { + public: + + // H.245 logical channel ID to be established or + // already active + TUint iLogicalChannelId; + + // H.245 logical channel ID that is currently closing. + TUint iLogicalChannelIdClosing; + + // Variable to tell is same type (video or audio, incoming or outgoing) + // channel already started to close but not closed yet. If closing is pending + // same type channel cannot be opened until closing has finished or sink/source + // addition has failed for some reason. + TBool iSameTypeClosingPending; + + // Variable to tell is same type (video or audio, incoming or outgoing) + // channel ready to be opened. + TBool iSameTypeChannelReadyToOpen; + + }; + + private: // Data members. + + // Protocol engine pointer. + MVtSessionCommand* iSessionCommand; + + // Local video configuration. + CVtEngLocalVideo* iLocalVideo; + + // Remote video configuration. + CVtEngRemoteVideo* iRemoteVideo; + + // Pending internal operations. + TInt iCmdId; + CArrayFixFlat* iPendingOps; + + // Video Source initialization state. + TInitState iVSInitState; + + // Flags used to determine if audio and video sink/source + // is added to protocol and media state. + TInt iProtoStateFlags; + + // protocol state. + MVtProtocolCommand::TVtProtocolState iProtoState; + + // Initialization flag. + TBool iInitialized; + + // Remote media state. + TInt iRemoteMediaState; + + // Pending operation from client. + CVtEngOperation* iPendingOp; + + // Protocol initialization information. + TVtInitInfo iSdkInitInfo; + + + // Request status for (un)initialization. + TRequestStatus* iRequestStatus; + + // Audio controller handle. + MVtAudioConfigCommand* iAudioCtrl; + + // Timer to detect failure in disconnection. + CPeriodic* iTimer; + + // Protocol max volume. + TInt iProtoMaxVolume; + + // Selected camera is not necessary activated also. + TCameraId iSelectedCameraId; + + // ETrue when it is allowed to update volume. + TBool iUpdateVolumeAllowed; + + // ETrue when it is needed to update volume. + TBool iUpdateVolumeRequired; + + // Owned asynch callback. + CIdle* iAsyncCallback; + + // Pending volume operation. + CVtEngOperation* iPendingVolumeOp; + + // Used for various connection related operations. + TInt iConnectionStates; + + // Used while pausing and resuming video. + CVtEngLocalVideo::TVtEngProviderType iTempProviderInfo; + + // Used for setting the vendor info. + MVtH324ConfigCommand* iH324Config; + + + // Used H263 interface. + MVtVideoConfigCommand* iH263Encoder; + + // Video quality + TVtEngVideoQuality iVideoQuality; + + // Sharing object while video is disable will set this flag + TVideoEngAction iVideoAction; + + // Logical channel structure for outgoing video channel(s). + TLogicalChannel iVideoOutgoingLogicalChannel; + + // Logical channel structure for outgoing audio channel(s). + TLogicalChannel iAudioOutgoingLogicalChannel; + + // Logical channel structure for incoming video channel(s). + TLogicalChannel iVideoIncomingLogicalChannel; + + // Logical channel structure for incoming audio channel(s). + TLogicalChannel iAudioIncomingLogicalChannel; + + /* For proceeding to next uninit step asynchronously. + * Needed because Proto extension interface cannot be released within + * callback + */ + CAsyncCallBack* iNextStepCallback; + + + /* Do not complete operation on pause command. This flag + * is used when image sharing is stopped and video was disabled + * when sharing was initially started to prevent black frame sending + * during blank switch. + */ + TBool iPauseNoCompleteOp; + + /** + * Result for asynchronous operation completion. + */ + TInt iAsyncCompleteOpResult; + }; + +#endif // CVTENGMEDIAHANDLER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/CVtEngRemoteVideo.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/CVtEngRemoteVideo.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,441 @@ +/* +* 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: Remote video handling class. +* +*/ + + + +#ifndef CVTENGREMOTEVIDEO_H +#define CVTENGREMOTEVIDEO_H + +// INCLUDES +#include +#include +#include "MVtEngImageScaler.h" +#include "MVtEngDraw.h" +#include "TVtEngRendering.h" +#include "TVtEngRenderConfig.h" +#include +#include + +// FORWARD DECLARATIONS +class CDirectScreenAccess; +class CFbsBitmap; +class CVtEngStateManager; +class MVtEngScalerObserver; + +class TVtEngRenderingOptionsDSA; +class TVtEngRenderingOptionsDP; +class TVtEngRenderingOptionsNGA; + +// Define image sizes. +// QCIF. +const TInt KVtEngResolutionQCIFWidth = 176; +const TInt KVtEngResolutionQCIFHeight = 144; + +// SQCIF. +const TInt KVtEngResolutionSQCIFWidth = 128; +const TInt KVtEngResolutionSQCIFHeight = 96; + +// Default video screen width. +const TInt KVtEngRemoteVideoDefaultWidth = 176; + +// Default video screen height. +const TInt KVtEngRemoteVideoDefaultHeight = 144; + +// Watcher checks point time-out 400 ms. +const TInt KVtEngWatcherTimeout = 400000; + +// When the watcher has timed out 15 times without new frame, send event to UI. +const TInt KVtEngWatcherThreshold = 15; + +// CLASS DECLARATION + +/** +* Class handling remote video. +* +* @lib videoteleng.lib +* @since Series 60 2.6 +*/ +NONSHARABLE_CLASS( CVtEngRemoteVideo ) : + public CBase, + public MDisplaySinkObserver + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + * @param aPv2Way a reference to PV instance. + * @param aStateManager reference to VT state manager + * @return instance of CVtEngRemoteVideo + */ + static CVtEngRemoteVideo* NewL( + MVtSessionCommand& aSessionCommand, + CVtEngStateManager& aStateManager ); + + /** + * Destructor. + */ + virtual ~CVtEngRemoteVideo(); + + public: // From MDisplaySinkObserver + + /** + * @see MDisplaySinkObserver + */ + void VideoFrameSizeChangedL( const TSize& aFrom, + const TSize& aTo ); + + public: // New functions + + /** + * Sets parameters used when rendering remote video. + */ + void SetRenderingParametersL( + const TVtEngRenderingOptionsNGA& aParams ); + + /** + * Sets parameters used when rendering remote video. + * @param aParams direct screen access parameters + */ + void SetRenderingParametersL( + const TVtEngRenderingOptionsDSA& aParams ); + + /** + * Sets parameters used when rendering remote video. + * @param aParams direct screen access parameters + */ + void SetRenderingParametersL( + const TVtEngRenderingOptionsDP& aParams ); + + /** + * Starts remote video rendering. + */ + void StartVideoL(); + + /** + * Stops remote video rendering. + */ + void StopVideoRendering(); + + /** + * Pauses remote video rendering. + * @return command id from PV + */ + TInt PauseVideoL(); + + /** + * Adds Display sink into PV. + * @param Video channel logical channel ID number. + * @return PV command ID + */ + TInt AddVideoSinkL( TInt aChannelId ); + + /** + * Adds Audio sink into PV. + * @param Audio channel logical channel ID number. + * @return PV command ID + */ + TInt AddAudioSinkL( TInt aChannelId ); + + /** + * Returns state of Direct Screen Access. + * @return state of Direct Screen Access + */ + TBool GetDsaState() const; + + /** + * Returns the audiosink of nested CVtEngDraw class. + * @return the audiosink of nested CVtEngDraw class + */ + MVTAudioSink* AudioSink(); + + /** + * Sets UI foreground state (i.e. is the Application + * current active application or not). + * @param aForeground ETrue if the VT application is + * in foreground, EFalse otherwise. + * @exception May leave with KErrNotReady. + */ + void SetUIForegroundL( TBool aForeground ); + + /** + * Request update last remote video frame through MVtEngFrameObserver::vtSetFrame + */ + void RequestLastFrame(); + + private: + + /** + * C++ constructor. + * @param aPv2Way a reference to PV instance + * @param aStateManager reference to VT state manager + */ + CVtEngRemoteVideo( + MVtSessionCommand& aSessionCommand, + CVtEngStateManager& aStateManager ); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + + public: + + /** + * Base rendering class + */ + NONSHARABLE_CLASS( CVtEngDraw ) : + public CActive, + public MVtEngDraw, + public MDirectScreenAccess + { + + protected: // new methods + /** + * C++ constructor as private. + * @param aObserver callback interface for Display Sink + */ + CVtEngDraw( MDisplaySinkObserver* aObserver ); + + /** + * Destructor + */ + ~CVtEngDraw(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + /** + * If not active, set iStatus to KRequestPending and calls + * SetActive(); + */ + void Activate(); + + /** + * Creates DSA instance. + */ + void CreateAndStartDSAL(); + + public: // from MDirectScreenAccess + + /** + * From MDirectScreenAccess, this function is called by the + * window server when direct screen access must stop. + * @see MDirectScreenAccess::AbortNow + */ + virtual void AbortNow( + RDirectScreenAccess::TTerminationReasons aReason ); + + /** + * From MDirectScreenAccess, this method is called by the direct + * screen access instance as soon as direct screen access can + * resume. + * @see MDirectScreenAccess::Restart + */ + virtual void Restart( + RDirectScreenAccess::TTerminationReasons aReason ); + + public: // new functions + + /** + * Configuration was updated. + */ + void ConfigUpdatedL(); + + /** + * Display Sink pointer. + * @return instance of MDisplaySink + */ + MDisplaySink* DisplaySink(); + + /** + * Returns state of Direct Screen Access. + * @return true if rendering + */ + TBool GetDsaState() const; + + /** + * Checks frame watcher expiration. + * @param aAny pointer to CVtEngDrawDSA + * @return Symbian OS error code + */ + static TInt WatcherExpired( TAny* aAny ); + + /** + * Handles frame watcher expiration. + */ + void HandleWatcherExpired(); + + /** + * Sets certain flag on. + * @param aFlags flags to turn on. + */ + void SetFlag( TUint aFlags ); + + /** + * Clears certain flag. + * @param aFlags flags to clear. + */ + void ClearFlag( TUint aFlags ); + + /** + * Checks if certain flag is on. + * @param aFlags flags to check. + */ + TBool IsFlag( TUint aFlag ) const; + + /** + * Called by CVtEngRemoteVideo, when video sink is added + * to PV. + */ + void VideoSinkAdded(); + + private: // from CActive + + /** + * Handles active object cancellation. + * @see CActive::Cancel + */ + void DoCancel(); + + /** + * Handles active object execution errors. + * @see CActive::RunError + */ + TInt RunError( TInt aError ); + + protected: + + /** + * Defines if drawing can be done + * and if we have not received frames + * for some time and observer is notified + * (and no new frames since then). + */ + enum TFlags + { + // Start the rendering. + EStarted = ( 1 << 0 ), + // Ready by window server. + EReadyForeground = ( 1 << 1 ), + // Ready by internal state. + EReadyInternal = ( 1 << 2 ), + // Ready to draw. + EReady = EReadyInternal | EReadyForeground, + // Watcher expired because no frames received in time. + EFrameWatcherExpired= ( 1 << 3 ), + // First frame has been received. + EFirstFrameReceived = ( 1 << 4 ), + // Drawing ongoing flag + ERemoteVideoDrawing = ( 1 << 5 ), + // VT UI foreground status (if set, UI is foreground) + EFlagUIForeground = ( 1 << 6 ), + // Components have been initialized + EFlagInitialized = ( 1 << 7 ), + // VT UI has been sent to background + ESentToBackground = ( 1 << 8 ), + // Frame buffer contains data when this flag is set (DP,NGA) + EFrameBufferFilled = ( 1 << 9 ), + // BaseConstructL() call is pending (DP,NGA) + EBaseConstructCalled = ( 1 << 10 ), + // BaseSetConfigL() call is pending (DP,NGA) + EBaseSetConfigCalled = ( 1 << 11 ), + // BaseStartDrawL() call is pending (DP,NGA) + EBaseBaseStartDrawCalled = ( 1 << 12 ), + // UpdateSinkParamsL() needs to be called (DP,NGA) + ESinkParamUpdateRequired = ( 1 << 13 ), + // Sink().Resume() needs to be called (DP,NGA) + ESinkResumeRequired = ( 1 << 14 ), + // InitializePostingSurfaceL() call is pending (DP), CreateSurfaceL call is pending (NGA) + EInitializePostingSurfaceCalled = ( 1 << 15 ), + // New frame buffer is store, not coverted and scaled yet + EFrameBufferNeedsConvertAndScale = ( 1 << 16 ), + + // Bitmask for all pending calls (DP) + EDelayedCallsMask = EBaseConstructCalled | + EBaseSetConfigCalled | + EBaseBaseStartDrawCalled | + ESinkParamUpdateRequired | + EInitializePostingSurfaceCalled + }; + + protected : // data + + // Direct Screen Access. + CDirectScreenAccess* iDSA; + + // Display sink providing bitmaps. + MDisplaySink* iDisplaySink; + + // @see TFlags + TInt iFlags; + + // For checking if display sink stops feeding. + // drawer with bitmaps + CPeriodic* iWatcher; + + // to reduce watcher restarts do cancel it + // only every 15 frames + // Counter for frame expiration. + TInt iCheckpoint; + + // DisplaySink callback interface. + MDisplaySinkObserver* iObserver; + + // Frame watcher callback. + TCallBack iCallback; + + // Container class as a friend. + friend class CVtEngRemoteVideo; + + // Temporarily store image size when size changes on the fly. + TSize iSourceSize; + + // DisplaySink status boolean. + TBool iDSUpdated; + }; + + private: // Data + // Packet Video interface. + MVtSessionCommand& iSessionCommand; + + // State manager. + CVtEngStateManager& iStateManager; + + // Draws remote video with DSA. + CVtEngDraw* iDrawer; + + // Display sink. + MDisplaySink* iDisplaySink; + + // Audio sink interface. + MVTAudioSink* iAudioSink; + + // Information from PV regarding sink. + TInt iTrackId; + + // @see TFlags + TInt iStateFlags; + + TBool iEnableNGA; + }; + +#endif // CVTENGREMOTEVIDEO_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/MVtEngDraw.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/MVtEngDraw.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,141 @@ +/* +* Copyright (c) 2004-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: Remote video handling class. +* +*/ + + + +#ifndef MVTENGDRAW_H +#define MVTENGDRAW_H + +// INCLUDE + +#include + +// FORWARD + +class MDisplaySink; +class MDisplaySinkObserver; +class TVtEngRenderConfig; + +/** +* Drawer API. +* +* @lib videoteleng.lib +* @since Series 60 3.2 +*/ +NONSHARABLE_CLASS( MVtEngDraw ) + { + public: + + /** + * Base construction for derived classes. + */ + virtual void BaseConstructL() = 0; + + /** + * Instantiates display sink. + */ + virtual MDisplaySink* CreateSinkL() = 0; + + /** + * Refresh view. + */ + virtual void BaseRefreshL() = 0; + + /** + * Updates the target bitmaps and/or displaymode + * and/or the sizes of bitmaps + */ + virtual void BaseRefreshBitmapsL() = 0; + + /** + * DoCancel method for inherited classes. + */ + virtual void BaseDoCancel() = 0; + + /** + * Configuration verifying routine for derived classes. If + * new configuration is not supported, then may this method + * leaves with appropriate error code. + */ + virtual void BaseVerifyConfigL() = 0; + + /** + * Called when DSA calls Restart() to start drawing again. + */ + virtual void BaseRestartL() = 0; + + /** + * Called when DSA calls AbortNow() to stop drawing. + */ + virtual void BaseAbortNow() = 0; + + /** + * Starts rendering. + */ + virtual void BaseStartDrawL() = 0; + + /** + * Stops rendering. + */ + virtual void BaseStopDraw() = 0; + + /** + * Sets configuration. + */ + virtual void BaseSetConfigL( const TVtEngRenderConfig& aConfig ) = 0; + + /** + * Called when UI foreground status changes. + */ + virtual void BaseSetUIForegroundL( TBool aForeground ) = 0; + + /** + * Called when incoming video frame size changes. + */ + virtual void BaseVideoFrameSizeChangedL( const TSize& aTo ) = 0; + + /** + * Request update last remote video frame through MVtEngFrameObserver::vtSetFrame. + */ + virtual void BaseRequestLastFrame() = 0; + + protected: + + /** + * Returns current configuration settings. + */ + virtual TVtEngRenderConfig& Config() = 0; + + }; + +/** +* Remote drawer factory. +* +* @lib videoteleng.lib +* @since Series 60 3.2 +*/ +class VtEngDrawFactory + { + public: + /** + * Factory method for creating drawer + * @param aObserver a callback interface + */ + static MVtEngDraw* CreateDrawerL( MDisplaySinkObserver* aObserver, TBool ); + }; + +#endif // MVTENGDRAW_H \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/MVtEngFrameObserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/MVtEngFrameObserver.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,62 @@ +/* +* 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: Observer interface for video frames. +* +*/ + + + +#ifndef MVTENGFRAMEOBSERVER_H +#define MVTENGFRAMEOBSERVER_H + +// INCLUDES +#include + +// FORWARD DECLARATIONS +class CFbsBitmap; + +// CLASS DECLARATION + +/** +* Observer interface for video frames. +* +* @lib videoteleng +* @since 2.6 +*/ +class MVtEngFrameObserver + { + public: + + enum TFrameType + { + ELocalVideoFrame, + ERemoteVideoFrame + }; + + virtual void vtHandleFrameL( TFrameType aType, + CFbsBitmap* aBitmap ) = 0; + + /** + * Sets last drawn frame. This frame will be stored by UI + * and will be drawn when DSA is temporarily disabled (e.g. + * when a menu is opened) + */ + virtual void vtSetFrame( TFrameType aType, + CFbsBitmap* aBitmap ) = 0; + + }; + +#endif // MVTENGFRAMEOBSERVER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/MVtEngImageScaler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/MVtEngImageScaler.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,109 @@ +/* +* Copyright (c) 2004-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: Interface used for scaling images to certain size. +* +*/ + + + +#ifndef VTENGIMAGESCALER_H +#define VTENGIMAGESCALER_H + +// INCLUDES +#include + +// FORWARD DECLARATIONS +class CFbsBitmap; + +/** +* Image scaler observer. +* +* @lib videoteleng.lib +* @since Series 60 2.8 +*/ +class MVtEngScalerObserver + { + public: + + /** + * Called when scaling is ready. + * @param aBitmap a scaled bitmap + * @param aError Symbian OS error code + */ + virtual void ScalingCompleted( + CFbsBitmap* aBitmap, + TInt aError ) = 0; + }; + +/** +* Image scaler. +* +* @lib videoteleng +* @since 2.6 +*/ +class MVtEngImageScaler + { + public: // new functions + + /** + * Used to start the scaling of an image. + * @param aSourceIndex the index of the source to use. + */ + virtual void ScaleL( + TInt aSourceIndex ) = 0; + + /** + * Configures the scaler. + * @param aDisplayMode which kind of display + * @param aSize the width and height of the display + * @return ETrue if previous scaling was cancelled + */ + virtual TBool ConfigureL( + TDisplayMode aDisplayMode, + TSize aSize, + TInt aSourceHandle1, + TInt aSourceHandle2 ) = 0; + + /** + * Deletes the scaling object. + */ + virtual void Release() = 0; + + /** + * Possibility to cancel the scaling. + * @return error code of canceling. + */ + virtual TInt Cancel() = 0; + }; + +/** +* Image scaler factory. +* +* @lib videoteleng.lib +* @since Series 60 2.8 +*/ +class VtEngScalerFactory + { + public: + /** + * Factory method for creating scaler + * @param aObserver a callback interface + */ + static MVtEngImageScaler* CreateScalerL( + MVtEngScalerObserver& aObserver ); + }; + +#endif // VTENGIMAGESCALER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/MVtEngMedia.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/MVtEngMedia.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,357 @@ +/* +* Copyright (c) 2004-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: Media interface +* +*/ + + + +#ifndef MVTENGMEDIA_H +#define MVTENGMEDIA_H + +// INCLUDES +#include + +// FORWARD DECLARATIONS +class MVtEngLocalVideoDisplay; +class CFbsBitmap; + +// CLASS DECLARATION + +/** +* Media interface for defining data types for media transport and +* presentation of it locally as well methods for obtaining current +* configuration. +* +* @lib videoteleng.lib +* @since Series 60 2.6 +*/ +class MVtEngMedia + { + public: // New functions. + + enum TMediaType + { + EMediaAudio = (1 << 0 ), + EMediaVideo = ( 1 << 1 ), + EMediaAudioPreparing = ( 1 << 2 ), + EMediaVideoPreparing = ( 1 << 3 ), + // Status of audio channel, applicable only for outgoing audio. + EMediaAudioChannelOpen = ( 1 << 4 ), + // Status of video channel, applicable only for outgoing video. + EMediaVideoChannelOpen = ( 1 << 5 ) + }; + + /** + * ESourceCapsPrimaryCamera + * primary camera can be selected. + * ESourceCapsSecondaryCamera + * secondary camera can be selected. + * ESourceCapsStillImage + * still image can be selected. + */ + enum TSourceCapsFlags + { + ESourceCapsPrimaryCamera = ( 1 << 0 ), + ESourceCapsSecondaryCamera = ( 1 << 1 ), + ESourceCapsStillImage = ( 1 << 2 ) + }; + + /** + * EMediaOutgoing + * outbound media + * EMediaIncoming + * inbound media + */ + enum TMediaDirection + { + EMediaOutgoing, + EMediaIncoming + }; + + /** + * EMediaNone + * No media source selected. + * EMediaCamera + * Camera selected + * EMediaCameraPri + * Primary camera selected. + * Camera is inwards + * EMediaCameraSec + * Secondary camera selected. + * Camera is outwards + * EMediaStillImage + * Still image as source. + * EMediaVideoStream + * Video stream selected. + */ + enum TMediaSource + { + EMediaNone, + EMediaCamera, + EMediaCameraPri, + EMediaCameraSec, + EMediaStillImage, + EMediaVideoStream, + EMediaShare + }; + + /** + * EPrimaryCamera + * Primary camera is inwards faced. + * ESecondaryCamera + * Camera is facing outwards. + */ + enum TCameraId + { + EPrimaryCamera, + ESecondaryCamera + }; + + /** + * Camera information (zoom mainly). + */ + struct TCameraInfo + { + TInt iMinZoom; + TInt iMaxZoom; + TInt iMaxDigitalZoom; + TInt iMajorZoomStepCount; + }; + + /** + * + * Video quality enumeration. + * + * EVideoQualityUndefined video quality has not been set + * yet. + * EVideoQualityDetail means slow frame rate, good image + * quality.. + * EVideoQualityNormal smoother video with somewhat lower + * image quality than EVideoQualityDetail. + * EVideoQualityMotion the smoothest video with the worst + * image quality. + */ + enum TVideoQuality + { + EVideoQualityUndefined, + EVideoQualityDetail, + EVideoQualityNormal, + EVideoQualityMotion + }; + + /** + * Enumerates object sharing state. + * + * ENotAbleToShare Is not able to share any objects (engine in wrong + * state) + * ENotSharing Is not sharing anything + * EInitializingShareImage Initializing still image sharing. + * ESharingImage Is sharing image + * ESharingVideoClip Is sharing video clip + */ + enum TShareObjectState + { + ENotAbleToShare, + ENotSharing, + EInitializingShareImage, + EInitializingShareVideoClip, + ESharingImage, + ESharingVideoClip + }; + + /** + * Defines layout (screen orientation) used by + * Video Telephone application per active camera. + * Each camera has one of the following values: + * + * EOrientationLandscape Layout is always landscape. + * EOrientationPortrait Layout is always portrait. + * EOrientationObeyLayoutSwitch Obey layout in specific device mode. + */ + enum TCameraOrientation + { + EOrientationLandscape, + EOrientationPortrait, + EOrientationObeyLayoutSwitch + }; + + /** + * Command parameters for Image sharing. + */ + typedef TFileName TShareObjectImageParameters; + + /** + * Command parameters for Video Clip sharing. + */ + typedef TFileName TShareObjectVideoClipParameters; + + /** + * Parameters for Prepare Camera. + */ + struct TPrepareCameraParams + { + TMediaSource iMediaSource; + TBool iInitialize; + }; + + /** + * Returns state of transmission local video/audio to remote end. + * + * @param aMediaDirection + * @param aActiveMedia returns active media as bitmap (see TMediaType). + * @return Symbian OS error code. + */ + virtual TInt GetMediaState( + const TMediaDirection aMediaDirection, + TInt& aActiveMedia ) const = 0; + + /** + * Returns active source for video transmission and + * local display. + * @param aSource source in return + * @return Symbian OS error code + */ + virtual TInt GetSource( TMediaSource& aSource ) const = 0; + + /** + * Returns source capabilities. + * @param combination of capability flags + * @return Symbian OS error code + */ + virtual TInt GetSourcesCaps( TInt& aCaps ) const = 0; + + /** + * Returns currently active camera. + * @param returns current camera id. + * @return Symbian OS error code. + * KErrNotReady if the engine is not ready or it's in wrong state, + * KErrInUse if camera is used by other application. + * Camera must be initialized, by async KVtEngPrepareCamera command or + * KVtEngSetSource command with camera parameter, in order to get + * KErrInUse indication. + */ + virtual TInt GetCurrentCameraId( TCameraId& aId ) const = 0; + + /** + * Returns camera information. + * @param aId camera to query information for. + * @param aInfo returns camera information + * @return Symbian OS error code. If camera is not + * available returns KErrNotFound. + */ + virtual TInt GetCameraInfo( + const TCameraId aId, + TCameraInfo& aInfo ) const = 0; + + /** + * Gets current zoom step + * @param aCurrentStep current zoom step + * @return Symbian OS error code. + */ + virtual TInt GetCurrentZoomStep( TInt& aCurrentStep ) = 0; + + /** + * Gets maximum zoom value that may be passed to camera. + * @param aMaxZoomStep maximum zoom step. + * @return Symbian OS error code. + */ + virtual TInt GetMaxZoomStep( TInt& aMaxZoomStep ) = 0; + + /** + * Gets number of major zoom level leaps. + * Less than or equal to maximum digital zoom steps. + * @param aCount number of leaps + * @return Symbian OS error code. + */ + virtual TInt GetMajorZoomStepCount( TInt& aCount ) = 0; + + /** + * Maps major zoom leap step to corresponding step index. + * @param aIndex major zoom step. + * @param aStep zoom step + */ + virtual void GetMajorZoomStep( TInt aIndex, TInt& aStep ) = 0; + + /** + * Gets freeze support status. + * @param aFreezeSupported ETrue if freeze is supported, EFalse otherwise. + * @return KErrNotReady if provider is not ready yet. + * @since S60 3.1 + */ + virtual TInt GetFreezeSupported( TBool& aFreezeSupported ) const = 0; + + /** + * Gets freeze current status. + * @param aFreezeSupported ETrue if active provider is frozen, EFalse otherwise. + * @return KErrNotReady if provider is not ready yet. + * @since S60 3.1 + */ + virtual TInt GetFreezeState( TBool& aFrozen ) const = 0; + + /** + * Returns state of DSA drawing, whether is active or not. + * @param aMediaDirection in or out direction + * @param aState returns state of Direct Screen Access + * @return Symbian OS error code + */ + virtual TInt GetDsaState( + const TMediaDirection aMediaDirection, + TBool& aActive ) const = 0; + + /** + * Returns state of VideoCall, whether is connected or not. + * @return state + */ + virtual TBool VideoCallConnected () const = 0; + + /** + * Returns ETrue if rendering has been started. + * + * @param aDirection specifies the rendering direction to check + * @return ETrue if rendering has been started. + */ + virtual TBool RenderingStarted( const TMediaDirection + aDirection ) const = 0; + + /** + * Gets current local video quality setting. + * @param aVideoQuality Current local video quality settings. + * @since S60 3.1 + */ + virtual void GetVideoQuality( TVideoQuality& aVideoQuality ) const = 0; + + /** + * Gets current object sharing state. + * @param aObjectSharingState On return contains current object sharing + * state. @see MVtEngMedia::TShareObjectState. + * @since S60 3.1 + */ + virtual void GetObjectSharingState( + TShareObjectState& aObjectSharingState ) const = 0; + + /** + * Gets camera orientations for primary and secondary camera. + * @see MVtEngMedia::TCameraOrientation + * @param aPrimaryCameraOrientation priamry camera orientation. + * @param aSecondaryCameraOrientation secondary camera orientation. + */ + virtual void GetCameraOrientations( + TCameraOrientation& aPrimaryCameraOrientation, + TCameraOrientation& aSecondaryCameraOrientation ) const = 0; + }; + +#endif // MVTENGMEDIA_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/TVtEngRenderConfig.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/TVtEngRenderConfig.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,77 @@ +/* +* 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: Local and remote video rendering configuration. +* +*/ + + + +#ifndef TVTENGRENDERCONFIG_H +#define TVTENGRENDERCONFIG_H + +// INCLUDES +#include + +// FORWARD DECLARATIONS + +class MVtEngFrameObserver; +class RWsSession; +class CWsScreenDevice; +class RWindowBase; +class RWindow; + + +// CLASS DECLARATION + +/** +* Configuration for representation of local or remote video. +* Used only internally. +* +* @lib videoteleng +* @since 2.6 +*/ +struct TVtEngRenderConfig + { + public: // enumerations + + /** + * Indication of type of rendering specified by configuration. + * EWsRender fields applicable for window server are valid + * EDsaRender fields applicable for DSA are valid + */ + enum TRenderType + { + EWsRender, + EDsaRender, + EDpRender, + ENgaRender + }; + + public: // data + RWindow* iRemoteWindow; + + RWsSession* iWsSession; + CWsScreenDevice* iWsSreenDevice; + RWindowBase* iWindow; + + MVtEngFrameObserver* iObserver; + TRect iRect; + TRect iClipRect; + TPoint iOffset; + TRenderType iType; + }; + +#endif // TVTENGRENDERCONFIG_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/TVtEngRenderConfigDP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/TVtEngRenderConfigDP.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,64 @@ +/* +* 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: Local and remote video rendering configuration. +* +*/ + + + +#ifndef TVTENGRENDERCONFIGDP_H +#define TVTENGRENDERCONFIGDP_H + +// INCLUDES +#include "TVtEngRenderConfig.h" +#include "TVtEngRenderingDP.h" +#include + +// FORWARD DECLARATIONS + +class MVtEngFrameObserver; +class RWsSession; +class CWsScreenDevice; +class RWindowBase; + +// CLASS DECLARATION + +/** +* Configuration for representation of local or remote video. +* Used only internally. +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( TVtEngRenderConfigDP ) : public TVtEngRenderConfig + { +public: // new functions + + TVtEngRenderConfigDP(); + + TVtEngRenderConfigDP( const TVtEngRenderingOptionsDP& aOptions ); + + TVtEngRenderConfigDP& operator=( const TVtEngRenderConfig& aConfig ); + +public: // data + // Background color value. This color is filled to areas that are not + // covered by the image. + TUint iBackGround; + }; + +#include "TVtEngRenderConfigDP.inl" + +#endif // TVTENGRENDERCONFIGDP_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/TVtEngRenderConfigDP.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/TVtEngRenderConfigDP.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,71 @@ +/* +* 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: Local and remote video rendering configuration. +* +*/ + + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// TVtEngRenderConfigDP::TVtEngRenderConfigDP +// C++ constructor +// ----------------------------------------------------------------------------- +// +inline TVtEngRenderConfigDP::TVtEngRenderConfigDP() + { + Mem::FillZ( this, sizeof( TVtEngRenderConfigDP ) ); + iType = EDpRender; + } + +// ----------------------------------------------------------------------------- +// TVtEngRenderConfigDP::TVtEngRenderConfigDP +// C++ constructor +// ----------------------------------------------------------------------------- +// +inline TVtEngRenderConfigDP::TVtEngRenderConfigDP( + const TVtEngRenderingOptionsDP& aOptions ) + { + iType = EDpRender; + iWsSession = &aOptions.iWs; + iWsSreenDevice = &aOptions.iWsSD; + iWindow = &aOptions.iWindow; + iObserver = aOptions.iObserver; + iRect = aOptions.iRect; + iClipRect = aOptions.iClipRect; + iOffset = aOptions.iOffset; + iBackGround = 0; + } + +// ----------------------------------------------------------------------------- +// TVtEngRenderConfigDP::operator= +// +// ----------------------------------------------------------------------------- +// +inline TVtEngRenderConfigDP& TVtEngRenderConfigDP::operator=( + const TVtEngRenderConfig& aConfig ) + { + iWsSession = aConfig.iWsSession; + iWsSreenDevice = aConfig.iWsSreenDevice; + iWindow = aConfig.iWindow; + iObserver = aConfig.iObserver; + iRect = aConfig.iRect; + iClipRect = aConfig.iClipRect; + iOffset = aConfig.iOffset; + iType = aConfig.iType; + return *this; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/TVtEngRenderConfigDSA.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/TVtEngRenderConfigDSA.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,61 @@ +/* +* 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: Local and remote video rendering configuration. +* +*/ + + + +#ifndef TVTENGRENDERCONFIGDSA_H +#define TVTENGRENDERCONFIGDSA_H + +// INCLUDES +#include +#include "TVtEngRenderConfig.h" +#include "TVtEngRenderingDSA.h" + +// FORWARD DECLARATIONS + +class MVtEngFrameObserver; +class RWsSession; +class CWsScreenDevice; +class RWindowBase; + +// CLASS DECLARATION + +/** +* Configuration for representation of local or remote video. +* Used only internally. +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( TVtEngRenderConfigDSA ) : public TVtEngRenderConfig + { +public: // new functions + + TVtEngRenderConfigDSA(); + + TVtEngRenderConfigDSA( const TVtEngRenderingOptionsDSA& aOptions ); + + TVtEngRenderConfigDSA& operator=( const TVtEngRenderConfig& aConfig ); + +public: // data + }; + +#include "TVtEngRenderConfigDSA.inl" + +#endif // TVTENGRENDERCONFIGDSA_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/TVtEngRenderConfigDSA.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/TVtEngRenderConfigDSA.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,70 @@ +/* +* 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: Local and remote video rendering configuration. +* +*/ + + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// TVtEngRenderConfigDSA::TVtEngRenderConfigDSA +// C++ constructor +// ----------------------------------------------------------------------------- +// +inline TVtEngRenderConfigDSA::TVtEngRenderConfigDSA() + { + Mem::FillZ( this, sizeof( TVtEngRenderConfigDSA ) ); + iType = EDsaRender; + } + +// ----------------------------------------------------------------------------- +// TVtEngRenderConfigDSA::TVtEngRenderConfigDSA +// C++ constructor +// ----------------------------------------------------------------------------- +// +inline TVtEngRenderConfigDSA::TVtEngRenderConfigDSA( + const TVtEngRenderingOptionsDSA& aOptions ) + { + iType = EDsaRender; + iWsSession = &aOptions.iWs; + iWsSreenDevice = &aOptions.iWsSD; + iWindow = &aOptions.iWindow; + iObserver = aOptions.iObserver; + iRect = aOptions.iRect; + iClipRect = aOptions.iClipRect; + } + + +// ----------------------------------------------------------------------------- +// TVtEngRenderConfigDSA::operator= +// C++ constructor +// ----------------------------------------------------------------------------- +// +inline TVtEngRenderConfigDSA& TVtEngRenderConfigDSA::operator=( + const TVtEngRenderConfig& aConfig ) + { + iWsSession = aConfig.iWsSession; + iWsSreenDevice = aConfig.iWsSreenDevice; + iWindow = aConfig.iWindow; + iObserver = aConfig.iObserver; + iRect = aConfig.iRect; + iClipRect = aConfig.iClipRect; + iOffset = aConfig.iOffset; + iType = aConfig.iType; + return *this; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/TVtEngRenderConfigNGA.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/TVtEngRenderConfigNGA.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,59 @@ +/* +* Copyright (c) 2004-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: Class for NGA render configuration. +* +*/ + + +#ifndef TVTENGRENDERCONFIGNGA_H +#define TVTENGRENDERCONFIGNGA_H + +// INCLUDES +#include "TVtEngRenderConfig.h" +#include "TVtEngRenderingNGA.h" + +// FORWARD DECLARATIONS + +class MVtEngFrameObserver; +class RWsSession; +class CWsScreenDevice; +class RWindowBase; + +// CLASS DECLARATION + +/** +* Configuration for representation of local or remote video. +* Used only internally. +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( TVtEngRenderConfigNGA ) : public TVtEngRenderConfig + { +public: // new functions + + TVtEngRenderConfigNGA(); + + TVtEngRenderConfigNGA( const TVtEngRenderingOptionsNGA& aOptions ); + + TVtEngRenderConfigNGA& operator=( const TVtEngRenderConfig& aConfig ); + +public: // data + }; + +#include "TVtEngRenderConfigNGA.inl" + +#endif // TVTENGRENDERCONFIGNGA_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/TVtEngRenderConfigNGA.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/TVtEngRenderConfigNGA.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,71 @@ +/* +* Copyright (c) 2004-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: Inline implementation for TVtEngRenderConfigNGA. +* +*/ + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// TVtEngRenderConfigNGA::TVtEngRenderConfigNGA +// C++ constructor +// ----------------------------------------------------------------------------- +// +inline TVtEngRenderConfigNGA::TVtEngRenderConfigNGA() + { + Mem::FillZ( this, sizeof( TVtEngRenderConfigNGA ) ); + iType = ENgaRender; + } + +// ----------------------------------------------------------------------------- +// TVtEngRenderConfigDP::TVtEngRenderConfigNGA +// C++ constructor +// ----------------------------------------------------------------------------- +// +inline TVtEngRenderConfigNGA::TVtEngRenderConfigNGA( + const TVtEngRenderingOptionsNGA& aOptions ) + { + iType = ENgaRender; + iWsSession = &aOptions.iWs; + //iWsSreenDevice = &aOptions.iWsSD; + //iWindow = &aOptions.iWindow; + //iObserver = aOptions.iObserver; + //iRect = aOptions.iRect; + //iClipRect = aOptions.iClipRect; + //iOffset = aOptions.iOffset; + iRemoteWindow = &aOptions.iWindow; + } + +// ----------------------------------------------------------------------------- +// TVtEngRenderConfigDP::operator= +// +// ----------------------------------------------------------------------------- +// +inline TVtEngRenderConfigNGA& TVtEngRenderConfigNGA::operator=( + const TVtEngRenderConfig& aConfig ) + { + iWsSession = aConfig.iWsSession; + // iWsSreenDevice = aConfig.iWsSreenDevice; + // iWindow = aConfig.iWindow; + iObserver = aConfig.iObserver; + // iRect = aConfig.iRect; + //iClipRect = aConfig.iClipRect; + // iOffset = aConfig.iOffset; + iType = aConfig.iType; + iRemoteWindow = aConfig.iRemoteWindow; + return *this; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/TVtEngRendering.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/TVtEngRendering.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,73 @@ +/* +* 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: Local and remote video rendering configuration. +* +*/ + + + +#ifndef TVTENGRENDERING_H +#define TVTENGRENDERING_H + +// INCLUDES +#include + +// FORWARD DECLARATIONS + +class MVtEngFrameObserver; +class RWsSession; +class CWsScreenDevice; +class RWindowBase; + +// CLASS DECLARATION + +/** +* Configuration for representation of local or remote video +* via window server. +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( TVtEngRenderingOptions ) + { + public: // constructor + + /** + * C++ constructor + */ + inline TVtEngRenderingOptions( + MVtEngFrameObserver& aObserver, + TSize aRect ); + + /** + * copy constructor + */ + inline TVtEngRenderingOptions( const TVtEngRenderingOptions& aOptions ); + + private: + TVtEngRenderingOptions& operator=( const TVtEngRenderingOptions& ); + + public: + // Frame observer + MVtEngFrameObserver* iObserver; + + // Bitmap size + TSize iSize; + }; + +#include + +#endif // TVTENGRENDERING_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/TVtEngRendering.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/TVtEngRendering.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,47 @@ +/* +* 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: Local and remote video rendering configuration. +* +*/ + + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// TVtEngRenderingOptions::TVtEngRenderingOptions +// C++ constructor +// ----------------------------------------------------------------------------- +// +inline TVtEngRenderingOptions::TVtEngRenderingOptions( + MVtEngFrameObserver& aObserver, + TSize aSize ) : + iObserver( &aObserver ), + iSize( aSize) + { + } + +// ----------------------------------------------------------------------------- +// TVtEngRenderingOptions::TVtEngRenderingOptions +// C++ copy constructor +// ----------------------------------------------------------------------------- +// +inline TVtEngRenderingOptions::TVtEngRenderingOptions( + const TVtEngRenderingOptions& aOptions ) : + iObserver( aOptions.iObserver ), + iSize( aOptions.iSize ) + { + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/TVtEngRenderingDP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/TVtEngRenderingDP.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,84 @@ +/* +* 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: Local and remote video rendering configuration. +* +*/ + + + +#ifndef TVTENGRENDERINGDP_H +#define TVTENGRENDERINGDP_H + +// INCLUDES +#include + +// FORWARD DECLARATIONS + +class MVtEngFrameObserver; +class RWsSession; +class CWsScreenDevice; +class RWindowBase; + +// CLASS DECLARATION + +/** +* Display posting access rendering definitions. +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( TVtEngRenderingOptionsDP ) + { + public: // constructor + + /** + * C++ constructor + */ + inline TVtEngRenderingOptionsDP( + MVtEngFrameObserver& aObserver, + RWsSession& aWs, + CWsScreenDevice& aScreenDevice, + RWindowBase& aWindow, + const TRect& aScreenRect, + const TRect& aClipRect, + const TPoint& aOffset ); + + /** + * C++ copy constructor. + * @param aOptions options to be copied to this instance. + */ + inline TVtEngRenderingOptionsDP( + const TVtEngRenderingOptionsDP& aOptions ); + + private: + TVtEngRenderingOptionsDP& operator=( + const TVtEngRenderingOptionsDP& ); + + public: // data members + RWsSession& iWs; + CWsScreenDevice& iWsSD; + RWindowBase& iWindow; + TRect iRect; + TRect iClipRect; + TPoint iOffset; + + // Frame observer + MVtEngFrameObserver* iObserver; + }; + +#include + +#endif // TVTENGRENDERINGDP_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/TVtEngRenderingDP.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/TVtEngRenderingDP.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,62 @@ +/* +* 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: Local and remote video rendering configuration. +* +*/ + + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// TVtEngRenderingOptionsDP::TVtEngRenderingOptionsDP +// C++ constructor +// ----------------------------------------------------------------------------- +// +inline TVtEngRenderingOptionsDP::TVtEngRenderingOptionsDP( + MVtEngFrameObserver& aObserver, + RWsSession& aWs, + CWsScreenDevice& aScreenDevice, + RWindowBase& aWindow, + const TRect& aScreenRect, + const TRect& aClipRect, + const TPoint& aOffset ) : + iWs( aWs ), + iWsSD( aScreenDevice ), + iWindow( aWindow ), + iRect( aScreenRect ), + iClipRect( aClipRect ), + iOffset( aOffset ), + iObserver( &aObserver ) + { + } + +// ----------------------------------------------------------------------------- +// TVtEngRenderingOptionsDSA::TVtEngRenderingOptionsDP +// C++ copy constructor +// ----------------------------------------------------------------------------- +// +inline TVtEngRenderingOptionsDP::TVtEngRenderingOptionsDP( + const TVtEngRenderingOptionsDP& aOptions ) + : iWs( aOptions.iWs ), + iWsSD( aOptions.iWsSD ), + iWindow( aOptions.iWindow ), + iRect( aOptions.iRect ), + iClipRect( aOptions.iClipRect ), + iOffset( aOptions.iOffset ), + iObserver( aOptions.iObserver ) + { + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/TVtEngRenderingDSA.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/TVtEngRenderingDSA.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,81 @@ +/* +* 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: Local and remote video rendering configuration. +* +*/ + + +#ifndef TVTENGRENDERINGDSA_H +#define TVTENGRENDERINGDSA_H + +// INCLUDES +#include + +// FORWARD DECLARATIONS + +class MVtEngFrameObserver; +class RWsSession; +class CWsScreenDevice; +class RWindowBase; + +// CLASS DECLARATION + +/** +* Direct screen access rendering definitions. +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( TVtEngRenderingOptionsDSA ) + { + public: // constructor + + /** + * C++ constructor + */ + inline TVtEngRenderingOptionsDSA( + MVtEngFrameObserver& aObserver, + RWsSession& aWs, + CWsScreenDevice& aScreenDevice, + RWindowBase& aWindow, + const TRect& aScreenRect, + const TRect& aClipRect ); + + /** + * C++ copy constructor. + * @param aOptions options to be copied to this instance. + */ + inline TVtEngRenderingOptionsDSA( + const TVtEngRenderingOptionsDSA& aOptions ); + + private: + TVtEngRenderingOptionsDSA& operator=( + const TVtEngRenderingOptionsDSA& ); + + public: // data members + RWsSession& iWs; + CWsScreenDevice& iWsSD; + RWindowBase& iWindow; + TRect iRect; + TRect iClipRect; + + // Frame observer + MVtEngFrameObserver* iObserver; + }; + +#include + +#endif // TVTENGRENDERINGDSA_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/TVtEngRenderingDSA.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/TVtEngRenderingDSA.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,59 @@ +/* +* 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: Local and remote video rendering configuration. +* +*/ + + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// TVtEngRenderingOptionsDSA::TVtEngRenderingOptionsDSA +// C++ constructor +// ----------------------------------------------------------------------------- +// +inline TVtEngRenderingOptionsDSA::TVtEngRenderingOptionsDSA( + MVtEngFrameObserver& aObserver, + RWsSession& aWs, + CWsScreenDevice& aScreenDevice, + RWindowBase& aWindow, + const TRect& aScreenRect, + const TRect& aClipRect ) : + iWs( aWs ), + iWsSD( aScreenDevice ), + iWindow( aWindow ), + iRect( aScreenRect ), + iClipRect( aClipRect ), + iObserver( &aObserver ) + { + } + +// ----------------------------------------------------------------------------- +// TVtEngRenderingOptionsDSA::TVtEngRenderingOptionsDSA +// C++ copy constructor +// ----------------------------------------------------------------------------- +// +inline TVtEngRenderingOptionsDSA::TVtEngRenderingOptionsDSA( + const TVtEngRenderingOptionsDSA& aOptions ) + : iWs( aOptions.iWs ), + iWsSD( aOptions.iWsSD ), + iWindow( aOptions.iWindow ), + iRect( aOptions.iRect ), + iClipRect( aOptions.iClipRect ), + iObserver( aOptions.iObserver ) + { + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/TVtEngRenderingNGA.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/TVtEngRenderingNGA.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,68 @@ +/* +* Copyright (c) 2004-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: Class for NGA Rendering. +* +*/ + +#ifndef TVTENGRENDERINGNGA_H +#define TVTENGRENDERINGNGA_H + +// INCLUDES +#include + +// FORWARD DECLARATIONS + +class MVtEngFrameObserver; +class RWindow; +class RWsSession; +// CLASS DECLARATION + +/** +* Direct screen access rendering definitions. +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( TVtEngRenderingOptionsNGA ) + { + public: // constructor + + /** + * C++ constructor + */ + inline TVtEngRenderingOptionsNGA( + RWindow& aWindow, RWsSession& aWs ); + + /** + * C++ copy constructor. + * @param aOptions options to be copied to this instance. + */ + inline TVtEngRenderingOptionsNGA( + const TVtEngRenderingOptionsNGA& aOptions ); + + private: + TVtEngRenderingOptionsNGA& operator=( + const TVtEngRenderingOptionsNGA& ); + + public: // data members + RWindow& iWindow; + + RWsSession& iWs; + }; + +#include + +#endif // TVTENGRENDERINGNGA_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Media/TVtEngRenderingNGA.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Media/TVtEngRenderingNGA.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,44 @@ +/* +* Copyright (c) 2004-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: Inline implementation for TVtEngRenderingOptionsNGA +* +*/ + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// TVtEngRenderingOptionsNGA::TVtEngRenderingOptionsNGA +// C++ constructor +// ----------------------------------------------------------------------------- +// +inline TVtEngRenderingOptionsNGA::TVtEngRenderingOptionsNGA( + RWindow& aWindow, RWsSession& aWs) : + iWindow( aWindow ), + iWs( aWs ) + { + } + +// ----------------------------------------------------------------------------- +// TVtEngRenderingOptionsNGA::TVtEngRenderingOptionsNGA +// C++ copy constructor +// ----------------------------------------------------------------------------- +// +inline TVtEngRenderingOptionsNGA::TVtEngRenderingOptionsNGA( + const TVtEngRenderingOptionsNGA& aOptions ) + : iWindow( aOptions.iWindow ), + iWs( aOptions.iWs) + { + } +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Session/CVtEngSessionHandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Session/CVtEngSessionHandler.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,142 @@ +/* +* 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 session interface. +* +*/ + + + +#ifndef CVTENGSESSIONHANDLER_H +#define CVTENGSESSIONHANDLER_H + +// INCLUDES +#include +#include "MVtEngSessionInfo.h" +#include "MVtCtlEventObserver.h" +#include "MVtCtlCallControl.h" +// CONSTANTS + +// MACROS + +// DATA TYPES + +// FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS +class CVtEngStateManager; +class CVtCtlFactory; +class CVtEngOperation; +class CVtEngIncomingCallMonitor; +// CLASS DECLARATION + +/** +* Abstraction for video telephony session with remote end. +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtEngSessionHandler ) : + public CActive, + public MVtEngSessionInfo, + public MVtCtlEventObserver + { + public: // constructor and destructors + + static CVtEngSessionHandler* NewL( ); + + virtual ~CVtEngSessionHandler(); + + public: // New functions + + /** + * Performs on operation in the handler. + * @param operation to be performed on the handler + */ + void HandleL( CVtEngOperation& aOperation ); + + public: // from MVtEngSessionInfo + + /** + * Gets session state. + * @return + */ + virtual TSessionState State( TBool aForcedRefresh ) const; + + /** + * Gets session direction. + * @return + */ + virtual TInt GetDirection( TDirection& aDirection ) const; + + /** + * Gets session duration. + * @param + * @param + */ + virtual TInt GetDuration( + TDuration& aDuration, + TBool& aEnabled ) const; + + /* + * @see MVtEngSessionInfo::aCLI + */ + virtual TInt GetCLI( TCLI& aCLI ) const; + + public: // From MVtCtlEventObserver + virtual void HandleVtSessionEventL( + TVtCtlEvent aEvent, + TAny* aParams ); + + public: // new functions + /** + * Initializes session handler. + */ + void InitializeL(); + + /** + * Frees resources used by session handler. + */ + void Uninitialize(); + + MVtCtlCallControl::TVtCtlState RealState() const; + + /** + * Starts Incoming call PS key monitoring + */ + void StartIncomingCallMonitorL(); + + private: // constructors + + void ConstructL(); + + CVtEngSessionHandler( ); + + private: // from CActive + void RunL(); + + void DoCancel(); + + private: // Member data + MVtCtlCallControl* iSessionControl; + CVtCtlFactory* iFactory; + + RLibrary iLib; + + CVtEngIncomingCallMonitor* iIncomingCallMonitor; + }; + + +#endif // CVTENGSESSIONHANDLER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Session/MVtEngDtmfHandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Session/MVtEngDtmfHandler.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,110 @@ +/* +* Copyright (c) 2004 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: DTMF handler interface for DTMF states and media +* handler to use. +* +*/ + + + +#ifndef MVTENGDTMFHANDLER_H +#define MVTENGDTMFHANDLER_H + +// INCLUDES +#include + +// DATA TYPES + +// FORWARD DECLARATIONS +class CVtEngOperation; +class TVtEngDtmfTone; +class MVTUserInput; +class CVtEngDtmfState; + +// CLASS DECLARATION + +/** +* Base class for data types +* +* @lib videoteleng +* @since 2.6 +*/ +class MVtEngDtmfHandler + { + public: // + /** + * Dtmf states + */ + enum TVtEngDtmfState + { + // Not sending DTMF + EVtDtmfStateIdle = 0, + // Sending DTMF + EVtDtmfStateSending, + // Sending DTMF, another waiting in buffer + EVtDtmfStateBuffered + }; + + public: + + /** + * Handles a DTMF command. + * @param + */ + virtual void HandleL( CVtEngOperation& aOp ) = 0; + + /** + * Activates a DTMF state. + * @param aNewState state index + * @return activated state + */ + virtual CVtEngDtmfState& ActivateState( + MVtEngDtmfHandler::TVtEngDtmfState aNewState ) = 0; + + /** + * Handles completion of DTMF sending, non-leavable method. + * @param aError Symbian OS error code + */ + virtual void SendComplete( TInt aError ) = 0; + + /** + * Returns new instance used for sending DTMF tone to protocol + * @param aTone tone to send + * @return protocol DTMF tone. + */ + virtual MVTUserInput& ReserveProtoDtmfL( + const TVtEngDtmfTone& aTone ) = 0; + + /** + * Releses protocol DTMF instance. + */ + virtual void ReleaseProtoDtmf() = 0; + + /** + * Compares last issued DTMF command ID to given command ID. + * @param aCheckCommandId command ID to be compared against + * @return ETrue if IDs are same, otherwise EFalse + */ + virtual TBool CheckCommandId( TInt aCheckCommandId ) const = 0 ; + + /** + * Stores command ID, used in CheckCommandID. + * @param aStoreCommandId command ID to be stored. + */ + virtual void StoreCommandId( TInt aStoreCommandId ) = 0; + }; + +#endif MVTENGDTMFHANDLER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Session/MVtEngSessionInfo.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Session/MVtEngSessionInfo.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,141 @@ +/* +* 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 session interface. +* +*/ + + + +#ifndef MVTENGSESSIONINFO_H +#define MVTENGSESSIONINFO_H + +// INCLUDES +#include + +// CONSTANTS + +// MACROS + +// DATA TYPES + +// FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS + +// CLASS DECLARATION + +/** +* Abstraction for video telephony session with remote end. +* +* @lib videoteleng +* @since 2.6 +*/ +class MVtEngSessionInfo + { + public: // + + /** + * Session state + * EIdle Session not established. + * EInitializing Initializing MO session + * ERemoteAlerting Remote end is alerting + * EReceiving Incoming session request from network + * EConnected Connection to peer is established. + * ENegotiating Handshaking with peer. + * EOpen Session active and media channels are open. + * EClearing Clearing connection. + */ + enum TSessionState + { + EUnknown = -1, + EIdle, + EInitializing, + ERemoteAlerting, + EReceiving, + EConnected, + ENegotiating, + EOpen, + EClearing + }; + + typedef TTimeIntervalSeconds TDuration; + + /** + * Session direction + * EDirectionNone In idle there's no direction . + * EDirectionMO Mobile originated sesison + * EDirectionMT Mobile terminated session + */ + enum TDirection + { + EDirectionNone, + EDirectionMO, + EDirectionMT + }; + + enum { KCallNameLength = 50 }; + enum { KCallNumberLength = 50 }; + + typedef TBuf TCallName; + + typedef TBuf TCallNumber; + + /** + * CLI data related to a call + */ + struct TCLI { + // call id of the call + TInt iCallId; + + // caller name + TCallName iName; + + // indicates if voice call can be made to peer + TBool iVoiceCallPossible; + + TCallNumber iCallNumber; + }; + + /** + * Returns session state + * @aForcedRefresh if ETrue current state is forced to update. + * Should be EFalse when called in frequently because forced + * refresh is more time consuming (requires context switch) + * @return + */ + virtual TSessionState State( TBool aForcedRefresh ) const = 0; + + /** + * + * @return direction + */ + virtual TInt GetDirection( TDirection& aDirection ) const = 0; + + /** + * + * @param + * @param aEnabled + */ + virtual TInt GetDuration( + TDuration& aDuration, + TBool& aEnabled ) const = 0; + + + virtual TInt GetCLI( TCLI& aCLI ) const = 0; + }; + + +#endif // TVTENGSESSIONINFO_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Session/TVtEngDtmfTone.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Session/TVtEngDtmfTone.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,53 @@ +/* +* Copyright (c) 2004 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: Local and remote video rendering configuration. +* +*/ + + + +#ifndef TVTENGDTMFTONE_H +#define TVTENGDTMFTONE_H + +// INCLUDES +#include "TVtEngType.h" + +// FORWARD DECLARATIONS + +// CLASS DECLARATION + +/** +* Abstraction for DTMF tone +* +* @lib videoteleng +* @since 2.6 +*/ +class TVtEngDtmfTone : public TVtEngtType + { + public: // constructor + + /** + * C++ constructor + */ + TVtEngDtmfTone( const TChar& aTone ); + + public: + // Tone + TChar iTone; + }; +#include "TVtEngDtmfTone.inl" + +#endif // TVTENGDTMFTONE_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/Session/TVtEngDtmfTone.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/Session/TVtEngDtmfTone.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,23 @@ +/* +* Copyright (c) 2004 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: Inline methods for TVtEngDtmfTone +* +*/ + + + +inline TVtEngDtmfTone::TVtEngDtmfTone( const TChar& aTone ) +: TVtEngtType( EVtEngTypeDtmf ) { iTone = aTone; } + +// End of File \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/State/CVtEngDtmfState.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/State/CVtEngDtmfState.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,246 @@ +/* +* 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: DTMF state classes. +* +*/ + + + +#ifndef CVTENGDTMFSTATE_H +#define CVTENGDTMFSTATE_H + +// INCLUDES +#include +#include +#include "TVtEngDtmfTone.h" +#include "MVtEngDtmfHandler.h" + + + +// CLASS DECLARATION + +/** +* Base class for DTMF states. +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtEngDtmfState ) : public CBase + { + public: + /** + * C++ constructor. + * @param aDtmfHandler + * @param aH324Config H324 configure interface + */ + CVtEngDtmfState( + MVtEngDtmfHandler& aDtmfHandler, + MVtH324ConfigCommand& aH324Config ); + + public: // new methods + + /** + * Sends a DTMF tone. Derived classes implement this + * and each vary in behavior. + * @param aTone tone to send + */ + virtual void SendDtmfL( const TVtEngDtmfTone& aTone ) = 0; + + /** + * Handles callback about DTMF sending. Releases pv2way dtmf instance. + * @param aError Symbian OS error code + */ + virtual void DtmfSendCompleteL( TInt aError ); + + protected: // new methods + /** + * Sends tone and changes state + * @param aDtmf tone to send + * @param aNewState new DTMF state + */ + void DoSendAndActivateStateL( + const TVtEngDtmfTone& aDtmf, + MVtEngDtmfHandler::TVtEngDtmfState aNewState ); + + protected: // member data + + // DTMF handler + MVtEngDtmfHandler& iDtmfHandler; + + // H324 configure interface + MVtH324ConfigCommand& iH324Config; + }; + +/** +* Idle DTMF state class +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtEngDtmfIdle ) : public CVtEngDtmfState + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + * @param aDtmfHandler + * @param aH324Config H324 configure interface + */ + static CVtEngDtmfState* NewL( + MVtEngDtmfHandler& aDtmfHandler, + MVtH324ConfigCommand& aH324Config ); + + /** + * Destructor. + */ + virtual ~CVtEngDtmfIdle(); + + public: // From CVtEngStateBase + + /** + * Sends DTMF tone and changes state to "sending". + * @param aTone tone to send + */ + virtual void SendDtmfL( const TVtEngDtmfTone& aTone ); + + /** + * @see CVtEngDtmfState + */ + virtual void DtmfSendCompleteL( TInt aError ); + + private: // constructors + + /** + * C++ constructor. + * @param aDtmfHandler + * @param aH324Config H324 configure interface + */ + CVtEngDtmfIdle( + MVtEngDtmfHandler& aDtmfHandler, + MVtH324ConfigCommand& aH324Config ); + }; + +/** +* Sending DTMF state class +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtEngDtmfSending ) : public CVtEngDtmfState + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + * @param aDtmfHandler + * @param aH324Config H324 configure interface + */ + static CVtEngDtmfState* NewL( + MVtEngDtmfHandler& aDtmfHandler, + MVtH324ConfigCommand& aH324Config ); + + /** + * Destructor. + */ + virtual ~CVtEngDtmfSending(); + + public: // From CVtEngStateBase + + /** + * Changes state to "buffered". + * @param aTone tone to send + */ + virtual void SendDtmfL( const TVtEngDtmfTone& aTone ); + + /** + * @see CVtEngDtmfState + */ + virtual void DtmfSendCompleteL( TInt aError ); + + private: // constructor + + /** + * C++ constructor. + * @param aDtmfHandler + * @param aH324Config + */ + CVtEngDtmfSending( + MVtEngDtmfHandler& aDtmfHandler, + MVtH324ConfigCommand& aH324Config ); + + }; + +/** +* Buffered DTMF state class +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtEngDtmfBuffered ) : public CVtEngDtmfState + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + * @param aDtmfHandler + * @param aH324Config H324 configure interface + */ + static CVtEngDtmfState* NewL( + MVtEngDtmfHandler& aDtmfHandler, + MVtH324ConfigCommand& aH324Config ); + + /** + * Destructor. + */ + virtual ~CVtEngDtmfBuffered(); + + public: // From CVtEngStateBase + + /** + * Buffers DTMF tone that is sent when previous + * tones in buffer are sent. + * @param aTone tone that is added to the buffer + */ + virtual void SendDtmfL( const TVtEngDtmfTone& aTone ); + + /** + * @see CVtEngDtmfState + */ + virtual void DtmfSendCompleteL( TInt aError ); + + private: // constructors + + /** + * C++ constructor. + * @param aDtmfHandler + * @param aH324Config + */ + CVtEngDtmfBuffered( + MVtEngDtmfHandler& aDtmfHandler, + MVtH324ConfigCommand& aH324Config ); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + private: // Member data + + // Buffered DTMF tones. + CArrayFixFlat* iTones; + }; + +#endif // CVTENGDTMFSTATE_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/State/CVtEngStateAlerting.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/State/CVtEngStateAlerting.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,104 @@ +/* +* 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: Base class for states +* +*/ + + + +#ifndef CVTENGSTATEALERTING_H +#define CVTENGSTATEALERTING_H + +// INCLUDES +#include "CVtEngStateBase.h" +//#include + +// CONSTANTS +//const ?type ?constant_var = ?constant; + +// MACROS +//#define ?macro ?macro_def + +// DATA TYPES +//enum ?declaration +//typedef ?declaration +//extern ?data_type; + +// FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS +class CVtEngStateManager; + +// CLASS DECLARATION + +/** +* Alerting state class +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtEngStateAlerting ) : public CVtEngStateBase + { + public: // Constructors and destructor + + /** + * C++ constructor. + */ + CVtEngStateAlerting( + CVtEngStateManager& aStateManager, + CVtEngEventManager& aEventManager ); + + + /** + * Destructor. + */ + virtual ~CVtEngStateAlerting(); + + public: // From CVtEngStateBase + + /** + * Updates state. May result to state transition + */ + virtual void UpdateL(); + + /** + * Validates a command. + */ + virtual TBool ValidateCommand( + const TVtEngCommandId aCommandId ); + + /** + * @see CVtEngStateBase + */ + virtual MVtEngSessionInfo::TSessionState State() const; + + /** + * + */ + virtual TBool HandleL( CVtEngOperation& aOp ); + + private: + + /** + * Handles state transition to alerting. + */ + void DoOpenL(); + + + + }; + +#endif // CVTENGSTATEALERTING_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/State/CVtEngStateBase.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/State/CVtEngStateBase.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,190 @@ +/* +* 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: Base class for states +* +*/ + + + +#ifndef CVTENGSTATEBASE_H +#define CVTENGSTATEBASE_H + +// INCLUDES +#include +#include "vtengcommands.h" +#include "CVtEngStateManager.h" +#include "CVtEngEventManager.h" +#include "CVtEngMediaHandler.h" +#include "CVtEngSessionHandler.h" +#include "CVtEngOperation.h" +#include "CVtEngSettings.h" +#include "VtEngUtils.h" + +// FORWARD DECLARATIONS +class CVtEngSessionHandler; +class CVtEngMediaHandler; +class CVtEngAudioHandler; + +// CLASS DECLARATION + +/** +* State base class + +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtEngStateBase ) : public CBase + { + public: // Constructors and destructor + + /** + * Destructor. + */ + virtual ~CVtEngStateBase(); + + public: // New functions + + /** + * Updates state. May result to state transition + */ + virtual void UpdateL() = 0; + + /** + * Checks if a command is valid in current state. + * @param aCommandId command to be validated + * @return ETrue if command is valid. + */ + virtual TBool ValidateCommand( + const TVtEngCommandId aCommandId ); + + /** + * Handles an operation. Base class method is empty + * and derived classes may handle the operation if applicable. + * @param aOp operation to be handled + * @return ETrue if handled + */ + virtual TBool HandleL( CVtEngOperation& aOp ); + + /** + * Returns session handler. + * @return reference to session handler + */ + CVtEngSessionHandler& SessionHandler(); + + /** + * Returns media handler. + * @return reference to media handler + */ + CVtEngMediaHandler& MediaHandler(); + + /** + * Returns audio handler. + * @return reference to audio handler + */ + CVtEngAudioHandler& AudioHandler(); + + /** + * Creates new state if needed. + * @return new state or NULL + */ + CVtEngStateBase* NewStateL( + const MVtEngSessionInfo::TSessionState aState ); + + virtual MVtEngSessionInfo::TSessionState State() const = 0; + + public: // New functions + + /** + * Sets new current state. + * @param aOldState old state. + */ + void OpenL( CVtEngStateBase* aOldState ); + + /** + * For derived classes to handle state change + */ + virtual void DoOpenL( ) = 0; + + + /** + * State uninitialization. + */ + virtual void Close(); + + protected: // new functions + + /** + * Saves configuration to settings for later + * usage. + */ + void SaveToSettingsL( CVtEngOperation& aOp ); + + /** + * Notifies state change to event manager. + * @param aNewState new session state. + */ + void NotifyStateChange( MVtEngSessionInfo::TSessionState aNewState ); + + /** + * Saves video state to settings. Used e.g. when video can not be + * started in current state. + * @param aEnabled video is enabled + */ + void SetVideoEnabled( TBool aEnabled ); + + /** + * Goes to disconnecting or idle state if needed. + * @return state object if transition is required. + */ + //CVtEngStateBase* DisconnectingOrIdleStateL(); + + /** + * Creates negotiating state if bearer state is connected + * and pv state is ESetup, and UI has indicated state changte + * is permitted. + * @return negotiating state object or NULL + */ + CVtEngStateBase* NegotiatingOrConnectedStateL( + TBool aAcceptOnlyNegotiating = EFalse ); + + + /** + * Saves video state to settings. Used e.g. when video can not be + * started in current state. + * @param aEnabled video is enabled + */ + void TerminateSessionL( CVtEngOperation& aOp ); + + protected: + + /** + * C++ constructor. + */ + CVtEngStateBase( + CVtEngStateManager& aStateManager, + CVtEngEventManager& aEventManager ); + + protected: // Data + // State manager + CVtEngStateManager& iStateManager; + + // Event manager + CVtEngEventManager& iEventManager; + + private: + }; + +#endif // CVTENGSTATEBASE_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/State/CVtEngStateClearing.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/State/CVtEngStateClearing.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,84 @@ +/* +* 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: Clearing state +* +*/ + + + +#ifndef CVTENGSTATECLEARING_H +#define CVTENGSTATECLEARING_H + +// INCLUDES + +#include "CVtEngStateBase.h" + +/** +* Clearing state class +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtEngStateClearing ) : public CVtEngStateBase + { + public: // Constructors and destructor + + /** + * C++ constructor. + */ + CVtEngStateClearing( + CVtEngStateManager& aStateManager, + CVtEngEventManager& aEventManager ); + + + /** + * Destructor. + */ + virtual ~CVtEngStateClearing(); + + public: // From CVtEngStateBase + + /** + * Updates state. May result to state transition + */ + virtual void UpdateL(); + + /** + * Validates a command. + */ + TBool ValidateCommand( + const TVtEngCommandId aCommandId ); + + /** + * @see CVtEngStateBase + */ + virtual MVtEngSessionInfo::TSessionState State() const; + + /** + * @see CVtEngStateBase::HandleL + */ + TBool HandleL( CVtEngOperation& aOp ); + + private: + + /** + * Handles state transition to clearing. + */ + void DoOpenL(); + + }; + +#endif // CVTENGSTATECLEARING_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/State/CVtEngStateConnected.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/State/CVtEngStateConnected.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,95 @@ +/* +* 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: Base class for states +* +*/ + + + +#ifndef CVTENGSTATECONNECTED_H +#define CVTENGSTATECONNECTED_H + +// INCLUDES +#include "CVtEngStateBase.h" + +// CONSTANTS + +// MACROS + +// DATA TYPES + +// FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS + +// CLASS DECLARATION + +/** +* Clearing state class +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtEngStateConnected ) : public CVtEngStateBase + { + public: // Constructors and destructor + + /** + * C++ constructor. + */ + CVtEngStateConnected( + CVtEngStateManager& aStateManager, + CVtEngEventManager& aEventManager ); + + + /** + * Destructor. + */ + virtual ~CVtEngStateConnected(); + + public: // From CVtEngStateBase + + /** + * Updates state. May result to state transition + */ + virtual void UpdateL(); + + /** + * Validates a command. + */ + TBool ValidateCommand( + const TVtEngCommandId aCommandId ); + + /** + * @see CVtEngStateBase + */ + virtual MVtEngSessionInfo::TSessionState State() const; + + /** + * @see CVtEngStateBase::HandleL + */ + TBool HandleL( CVtEngOperation& aOp ); + + private: + + /** + * Handles state transition to connected. + */ + void DoOpenL(); + + }; + +#endif // CVTENGSTATECONNECTED_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/State/CVtEngStateIdle.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/State/CVtEngStateIdle.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,91 @@ +/* +* 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: Idle state +* +*/ + + + +#ifndef CVTENGSTATEIDLE_H +#define CVTENGSTATEIDLE_H + +// INCLUDES +#include "CVtEngStateBase.h" + +// CONSTANTS + +// MACROS + +// DATA TYPES + +// FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS +class CVtEngStateManager; + +// CLASS DECLARATION + +/** +* Idle state class +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtEngStateIdle ) : public CVtEngStateBase + { + public: // Constructors and destructor + + /** + * C++ constructor. + */ + CVtEngStateIdle( + CVtEngStateManager& aStateManager, + CVtEngEventManager& aEventManager ); + + + /** + * Destructor. + */ + virtual ~CVtEngStateIdle(); + + public: // From CVtEngStateBase + + /** + * Updates state. May result to state transition + */ + virtual void UpdateL(); + + /** + * Validates a command. + */ + TBool ValidateCommand( + const TVtEngCommandId aCommandId ); + + /** + * @see CVtEngStateBase + */ + virtual MVtEngSessionInfo::TSessionState State() const; + + private: + + /** + * Handles state transition to idle. + */ + void DoOpenL(); + + }; + +#endif // CVTENGSTATEIDLE_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/State/CVtEngStateInitializing.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/State/CVtEngStateInitializing.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,95 @@ +/* +* 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: Initializing state +* +*/ + + + +#ifndef CVTENGSTATEINITIALIZING_H +#define CVTENGSTATEINITIALIZING_H + +// INCLUDES +#include "CVtEngStateBase.h" + +// CONSTANTS + +// MACROS + +// DATA TYPES + +// FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS +class CVtEngStateManager; + +// CLASS DECLARATION + +/** +* Initializing state class +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtEngStateInitializing ): public CVtEngStateBase + { + public: // Constructors and destructor + + /** + * C++ constructor. + */ + CVtEngStateInitializing( + CVtEngStateManager& aStateManager, + CVtEngEventManager& aEventManager ); + + + /** + * Destructor. + */ + virtual ~CVtEngStateInitializing(); + + public: // From CVtEngStateBase + + /** + * Updates state. May result to state transition + */ + virtual void UpdateL(); + + /** + * Validates a command. + */ + TBool ValidateCommand( + const TVtEngCommandId aCommandId ); + + /** + * @see CVtEngStateBase + */ + virtual MVtEngSessionInfo::TSessionState State() const; + + /** + * @see CVtEngStateBase::HandleL + */ + TBool HandleL( CVtEngOperation& aOp ); + + private: + + /** + * Handles state transition to initializing. + */ + void DoOpenL(); + }; + +#endif // CVTENGSTATEINITIALIZING_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/State/CVtEngStateManager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/State/CVtEngStateManager.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,143 @@ +/* +* 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: State manager for session and audio routing states. +* +*/ + + + +#ifndef CVTENGSTATEMANAGER_H +#define CVTENGSTATEMANAGER_H + +// INCLUDES +#include +#include "vtengcommands.h" +#include "MVtEngSessionInfo.h" +// FORWARD DECLARATIONS +class CVtEngStateBase; +class CVtEngHandlerContainer; +class CVtEngEventManager; +class CVtEngOperation; + +// CLASS DECLARATION + +/** +* Owner of engine states. Delegates update request +* to active state when requested. Provides method +* to enquire command availability in current state. +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtEngStateManager ): public CBase + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CVtEngStateManager* NewL( + CVtEngHandlerContainer& aHandlers, + CVtEngEventManager& aEventManager ); + + /** + * Destructor. + */ + virtual ~CVtEngStateManager(); + + public: // New functions + + /** + * Requests updates for current state. + */ + void Update( ); + + /** + * Checks if a command is possible in current state + * @param aCommandId command to check + * @return ETrue if command can be performed + */ + TBool IsCommandPossible( + const TVtEngCommandId aCommandId ) const; + + /** + * Sets new session state. + * @param aNewState new session state + */ + void SetState( CVtEngStateBase& aNewState ); + + /** + * Passes an operation to current state for + * handling. + * @param aOp operation to be handled + * @return ETrue if operation handled + */ + TBool HandleOperationL( CVtEngOperation& aOp ); + + /** + * Previous session state. + */ + MVtEngSessionInfo::TSessionState PreviousSessionState() const; + + /** + * Current session state. + */ + MVtEngSessionInfo::TSessionState SessionState() const; + + /** + * Returns handler container. + * @return handler container + */ + inline CVtEngHandlerContainer& Handlers(); + + /** + * Returns event manager. + * @return event manager + */ + inline CVtEngEventManager& EventManager(); + + private: + + /** + * C++ constructor. + */ + CVtEngStateManager( + CVtEngHandlerContainer& aHandlers, + CVtEngEventManager& aEventManager ); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + private: // Data + // Previous session state + MVtEngSessionInfo::TSessionState iPreviousSessionState; + + // Current session state + CVtEngStateBase* iSessionState; + + // Handler container + CVtEngHandlerContainer& iHandlers; + + // Event manager + CVtEngEventManager& iEventManager; + + }; + +#include "CVtEngStateManager.inl" + +#endif // CVTENGSTATEMANAGER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/State/CVtEngStateManager.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/State/CVtEngStateManager.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,40 @@ +/* +* 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: State manager inline methods. +* +*/ + + +// MEMBER FUNCTIONS + + +// ----------------------------------------------------------------------------- +// CVtEngStateManager::Handlers +// Return handler container. +// +// ----------------------------------------------------------------------------- +// +inline CVtEngHandlerContainer& CVtEngStateManager::Handlers() + { return iHandlers; } + +// ----------------------------------------------------------------------------- +// CVtEngStateManager::EventManager +// Return event manager. +// +// ----------------------------------------------------------------------------- +// +inline CVtEngEventManager& CVtEngStateManager::EventManager() + { return iEventManager; } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/State/CVtEngStateNegotiating.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/State/CVtEngStateNegotiating.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,88 @@ +/* +* 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: Negotiating state +* +*/ + + + +#ifndef CVTENGSTATENEGOTIATING_H +#define CVTENGSTATENEGOTIATING_H + +// INCLUDES +#include "CVtEngStateBase.h" + +// FORWARD DECLARATIONS +class CVtEngStateManager; + +// CLASS DECLARATION + +/** +* Negotiatimg state class +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtEngStateNegotiating ) : public CVtEngStateBase + { + public: // Constructors and destructor + + /** + * C++ constructor. + */ + CVtEngStateNegotiating( + CVtEngStateManager& aStateManager, + CVtEngEventManager& aEventManager ); + + + /** + * Destructor. + */ + virtual ~CVtEngStateNegotiating(); + + public: // From CVtEngStateBase + + /** + * Updates state. May result to state transition + */ + virtual void UpdateL(); + + /** + * Validates a command. + */ + TBool ValidateCommand( + const TVtEngCommandId aCommandId ); + + /** + * @see CVtEngStateBase + */ + virtual MVtEngSessionInfo::TSessionState State() const; + + /** + * @see CVtEngStateBase + */ + virtual TBool HandleL( CVtEngOperation& aOp ); + + private: + + /** + * Handles state transition to negotiating. + */ + void DoOpenL(); + + }; + +#endif // CVTENGSTATENEGOTIATING_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/State/CVtEngStateOpen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/State/CVtEngStateOpen.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,106 @@ +/* +* 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: Open state +* +*/ + + + +#ifndef CVTENGSTATEOPEN_H +#define CVTENGSTATEOPEN_H + +// INCLUDES +#include "CVtEngStateBase.h" + +// FORWARD DECLARATIONS +class CVtEngStateManager; + +// CLASS DECLARATION + +/** +* Open state class +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtEngStateOpen ) : public CVtEngStateBase + { + public: // Constructors and destructor + + /** + * C++ constructor. + */ + CVtEngStateOpen( + CVtEngStateManager& aStateManager, + CVtEngEventManager& aEventManager ); + + + /** + * Destructor. + */ + virtual ~CVtEngStateOpen(); + + public: // From CVtEngStateBase + + /** + * Updates state. May result to state transition + */ + virtual void UpdateL(); + + /** + * Validates a command. + */ + TBool ValidateCommand( + const TVtEngCommandId aCommandId ); + + /** + * @see CVtEngStateBase + */ + virtual MVtEngSessionInfo::TSessionState State() const; + + /** + * @see CVtEngStateBase::HandleL + */ + TBool HandleL( CVtEngOperation& aOp ); + + private: + + /** + * Changes audio routing + * @param aOp audio routing or null if value should + * be read from settings + */ + void RouteAudioL( + CVtEngOperation* aOp ); + + /** + * Uses extension framework to complete + * from operation. + * @since S60 v3.2 + * @param aOp audio routing or null + */ + void CallExtensionL( CVtEngOperation* aOp ); + + private: + + /** + * Handles state transition to open. + */ + void DoOpenL(); + + }; + +#endif // CVTENGSTATEOPEN_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Inc/State/CVtEngStateRinging.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Inc/State/CVtEngStateRinging.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,91 @@ +/* +* 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: Ringing state +* +*/ + + + +#ifndef CVTENGSTATERINGING_H +#define CVTENGSTATERINGING_H + +// INCLUDES +#include "CVtEngStateBase.h" + +// CONSTANTS + +// MACROS + +// DATA TYPES + +// FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS +class CVtEngStateManager; + +// CLASS DECLARATION + +/** +* Ringing state class +* +* @lib videoteleng +* @since 2.6 +*/ +NONSHARABLE_CLASS( CVtEngStateRinging ) : public CVtEngStateBase + { + public: // Constructors and destructor + + /** + * C++ constructor. + */ + CVtEngStateRinging( + CVtEngStateManager& aStateManager, + CVtEngEventManager& aEventManager ); + + + /** + * Destructor. + */ + virtual ~CVtEngStateRinging(); + + public: // From CVtEngStateBase + + /** + * Updates state. May result to state transition + */ + virtual void UpdateL(); + + /** + * Validates a command. + */ + TBool ValidateCommand( + const TVtEngCommandId aCommandId ); + + /** + * @see CVtEngStateBase + */ + virtual MVtEngSessionInfo::TSessionState State() const; + + private: + + /** + * Handles state transition to ringing. + */ + void DoOpenL(); + + }; + +#endif // CVTENGSTATERINGING_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Logger/Bmarm/VTLOGGERU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Logger/Bmarm/VTLOGGERU.DEF Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,8 @@ +EXPORTS + Initialize__9CVtLogger @ 1 NONAME R3UNUSED ; CVtLogger::Initialize(void) + Print__9CVtLoggeriG7TPtrC16 @ 2 NONAME ; CVtLogger::Print(int, TPtrC16) + Print__9CVtLoggeriG7TPtrC16i @ 3 NONAME ; CVtLogger::Print(int, TPtrC16, int) + Print__9CVtLoggeriG7TPtrC16ii @ 4 NONAME ; CVtLogger::Print(int, TPtrC16, int, int) + Uninitialize__9CVtLogger @ 5 NONAME R3UNUSED ; CVtLogger::Uninitialize(void) + Flags__9CVtLogger @ 6 NONAME R3UNUSED ; CVtLogger::Flags(void) + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Logger/Bwins/VTLOGGERU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Logger/Bwins/VTLOGGERU.DEF Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,9 @@ +EXPORTS + ?Initialize@CVtLogger@@SAXXZ @ 1 NONAME ; public: static void __cdecl CVtLogger::Initialize(void) + ?Print@CVtLogger@@SAXHVTPtrC16@@@Z @ 2 NONAME ; public: static void __cdecl CVtLogger::Print(int,class TPtrC16) + ?Print@CVtLogger@@SAXHVTPtrC16@@H@Z @ 3 NONAME ; public: static void __cdecl CVtLogger::Print(int,class TPtrC16,int) + ?Print@CVtLogger@@SAXHVTPtrC16@@HH@Z @ 4 NONAME ; public: static void __cdecl CVtLogger::Print(int,class TPtrC16,int,int) + ?Uninitialize@CVtLogger@@SAXXZ @ 5 NONAME ; public: static void __cdecl CVtLogger::Uninitialize(void) + ?Flags@CVtLogger@@SAHXZ @ 6 NONAME ; public: static int __cdecl CVtLogger::Flags(void) + ?Print@CVtLogger@@SAXHHVTPtrC16@@H@Z @ 7 NONAME ; void CVtLogger::Print(int, int, class TPtrC16, int) + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Logger/EABI/vtloggerU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Logger/EABI/vtloggerU.DEF Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,11 @@ +EXPORTS + _ZN9CVtLogger10InitializeEv @ 1 NONAME + _ZN9CVtLogger12UninitializeEv @ 2 NONAME + _ZN9CVtLogger5FlagsEv @ 3 NONAME + _ZN9CVtLogger5PrintEi7TPtrC16 @ 4 NONAME + _ZN9CVtLogger5PrintEi7TPtrC16i @ 5 NONAME + _ZN9CVtLogger5PrintEi7TPtrC16ii @ 6 NONAME + _ZTI9CVtLogger @ 7 NONAME ; ## + _ZTV9CVtLogger @ 8 NONAME ; ## + _ZN9CVtLogger5PrintEii7TPtrC16i @ 9 NONAME + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Logger/Group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Logger/Group/bld.inf Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,31 @@ +/* +* Copyright (c) 2004 - 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 Telephony logger build information file. +* +*/ + + +#include + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS +../inc/cvtlogger.h |../../../inc/cvtlogger.h +../inc/vtlogger.hrh |../../../inc/vtlogger.hrh + +PRJ_MMPFILES +../Group/vtlogger.mmp + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Logger/Group/vtlogger.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Logger/Group/vtlogger.mmp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,45 @@ +/* +* Copyright (c) 2004 - 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: This is project specification file video telephony logger. +* +*/ + +#include + +// default vendor id +VENDORID VID_DEFAULT + +// Capability assignment. +CAPABILITY CAP_GENERAL_DLL + +TARGET vtlogger.dll +TARGETTYPE dll +UID 0x1000008d 0x101F8699 + +SOURCEPATH ../Src + +SOURCE CVtLogger.cpp + +DOCUMENT ../Group/bld.inf + +USERINCLUDE ../Inc + +APP_LAYER_SYSTEMINCLUDE + +LIBRARY euser.lib +LIBRARY efsrv.lib +LIBRARY flogger.lib + + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Logger/Inc/cvtlogger.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Logger/Inc/cvtlogger.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,378 @@ +/* +* Copyright (c) 2004 - 2005 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 telephony engine debugging support. +* +*/ + + + +#ifndef CVTLOGGER_H +#define CVTLOGGER_H + +// INCLUDES +#include +#include +#include +#include "vtlogger.hrh" + +// CONSTANTS +const TInt KVtDebugBufferSize = 100; +const TInt KVtDebugReturnValNotApplicable = -1; + +// MACROS + +#define DEBUG_CONSTRUCT CVtLogger::ELogConstruction +#define DEBUG_DESTRUCT CVtLogger::ELogDestruction +#define DEBUG_MEDIA CVtLogger::ELogMedia +#define DEBUG_AUDIO CVtLogger::ELogAudio +#define DEBUG_SESSION CVtLogger::ELogSession +#define DEBUG_DETAIL CVtLogger::ELogDetails +#define DEBUG_ALL CVtLogger::ELogLogEverything +#define DEBUG_GEN CVtLogger::ELogGeneric +#define DEBUG_RETURN CVtLogger::ELogReturn + +#define DEBUG_FLAG1 CVtLogger::ELogApp1 +#define DEBUG_FLAG2 CVtLogger::ELogApp2 +#define DEBUG_FLAG3 CVtLogger::ELogApp3 +#define DEBUG_FLAG4 CVtLogger::ELogApp4 + +#if defined(VTDEBUG) && defined(__CS_VIDEO_TELEPHONY) +/** +* Write a text buffer to log. +*/ +#define __VTPRINT(level,x) CVtLogger::Print(level, _L(x)); + +/** +* Write a text buffer and integer value to log. +*/ +#define __VTPRINT2(level,x,y) CVtLogger::Print(level, _L(x), y); + +/** +* Write a text buffer and two integer values to log. +*/ +#define __VTPRINT3(level,x,y,z) CVtLogger::Print(level, _L(x), y, z); + +#define __VTPRINTENTER(x) CVtLogger::Print( CVtLogger::ELogGeneric, ETrue, _L(x)); + +#define __VTPRINTEXIT(x) CVtLogger::Print( CVtLogger::ELogGeneric, EFalse, _L(x) ); + +#define __VTPRINTEXITR(x,y) CVtLogger::Print( CVtLogger::ELogGeneric, EFalse, _L(x), y ); + +/** +* Initialize VT logging, must be called before any __VTPRINT's are called. +*/ +#define VTLOGINIT CVtLogger::Initialize(); + +/** +* Uninitializes VT logging, must be called client using logging is deleted. +*/ +#define VTLOGUNINIT CVtLogger::Uninitialize(); + +/** +* Returns logging and configuration flags +*/ +#define VTFLAGS CVtLogger::Flags(); + +/** +* check if baseband loopback is enabled +*/ +#define DEBUG_CFG_BB_LOOPBACK ( CVtLogger::Flags() & CVtLogger::ECfgBBLoopbackEnabled ) + +/** +* check if PV engine loopback is enabled +*/ +#define DEBUG_CFG_PV_LOOPBACK ( CVtLogger::Flags() & CVtLogger::ECfgPVLoopbackEnabled ) + +/** +* Disables passing of audio source to PV +*/ +#define DEBUG_CFG_NO_AUDIO_SOURCE ( CVtLogger::Flags() & CVtLogger::ECfgNoAudioSource ) + +/** +* Disables passing of audio source to PV +*/ +#define DEBUG_CFG_NO_AUDIO_SINK ( CVtLogger::Flags() & CVtLogger::ECfgNoAudioSink ) + +/** +* Disables passing of video sink to PV +*/ +#define DEBUG_CFG_NO_VIDEO_SINK ( CVtLogger::Flags() & CVtLogger::ECfgNoVideoSink ) + +/** +* Disables passing of video source to PV +*/ +#define DEBUG_CFG_NO_VIDEO_SOURCE ( CVtLogger::Flags() & CVtLogger::ECfgNoVideoSource ) + +#else + +/** +* Disables VT Debug mode if __CS_VIDEO_TELEPHONY is undefined +*/ +#undef VTDEBUG + +#define __VTPRINT(level,x) +#define __VTPRINT2(level,x,y) +#define __VTPRINT3(level,x,y,z) +#define __VTPRINTENTER(x) +#define __VTPRINTEXIT(x) +#define __VTPRINTEXITR(x,y) +#define VTLOGINIT +#define VTLOGUNINIT +#define VTFLAGS 0 +#define DEBUG_CFG_BB_LOOPBACK 0 +#define DEBUG_CFG_PV_LOOPBACK 0 +#define DEBUG_CFG_NO_AUDIO_SINK 0 +#define DEBUG_CFG_NO_AUDIO_SOURCE 0 +#define DEBUG_CFG_NO_VIDEO_SINK 0 +#define DEBUG_CFG_NO_VIDEO_SOURCE 0 + +#endif // VTDEBUG + +// FORWARD DECLARATIONS + + +// CLASS DECLARATION + +/** +* Debbuging support. +* To enable logging (either with RDebug or RFileLogger) follow steps below: +* 1. Create folder c:\Logs\VT +* 2. Create file VTLOGCONF.txt +* 3. Open the file and define logging level by hexadecimal digit, +* see TLogLevel in class declaration below. Example: 2007 means that +* constructors (0x1), destructors (0x2 ) in media subsystem (0x4) are +* logged to file (0x2000), i.e. the values are bitwise or'ed. Log file +* name is ".txt" where is name of the thread +* where logging takes places. +* +* @lib videoteleng +* @since 2.6 +*/ +class CVtLogger : public CActive + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CVtLogger* NewL(); + + /** + * Destructor. + */ + virtual ~CVtLogger(); + + public: // New functions + + /** + * Writes to log file or RDebug. + * @param aDes text output + */ + virtual void Print( TDesC& aDes ); + + /** + * Log level defining logging behavior. + */ + enum TLogLevel { + // Constructors are logged + ELogConstruction = 0x00000001, + // Destructors are logged + ELogDestruction = 0x00000002, + // Media subsystem methods are logged + ELogMedia = 0x00000004, + // Session subsystem methods are logged + ELogSession = 0x00000008, + // Audio subsystem methods are logged + ELogAudio = 0x00000010, + // Details in methods are logged + ELogDetails = 0x00000020, + // Generic framework methods are logged + ELogGeneric = 0x00000040, + // Log return from function + ELogReturn = 0x00000080, + // Everything is logged, as if all above were set. + ELogLogEverything = 0x0000007F, + // Insert time at the beginning of each log entry + // For file logging time is always written because + // it is automatically done by RFileLogger. + ELogTime = 0x00001000, + // Log to file instead of using RDebug + ELogToFile = 0x00002000, + // Application specific flag 1 + ELogApp1 = 0x00004000, + // Application specific flag 2 + ELogApp2 = 0x00008000, + // Application specific flag 3 + ELogApp3 = 0x00010000, + // Application specific flag 4 + ELogApp4 = 0x00020000, + + // Configuration flags + + /** Loopback configuration (set only + * one of the following flags + */ + // Baseband loopback enabled + ECfgBBLoopbackEnabled = 0x00100000, + // PV Engine loopback enabled + ECfgPVLoopbackEnabled = 0x00200000, + + // Disable passing of audio source + ECfgNoAudioSink = 0x00400000, + + // Disable passing of audio sink + ECfgNoAudioSource = 0x00800000, + + // Disable passing of video source + ECfgNoVideoSource = 0x01000000, + + // Disable passing of video sink + ECfgNoVideoSink = 0x02000000 + }; + + /** + * Writes buffer to log. + * @param aLevel combination of TLogLevel values + * @param aBuffer buffer to log + */ + IMPORT_C static void Print( + TInt aLevel, + TPtrC aBuffer ); + + /** + * Writes buffer to log. + * @param aLevel combination of TLogLevel values + * @param aBuffer buffer to log + * @param aValue value appended to buffer + */ + IMPORT_C static void Print( + TInt aLevel, + TPtrC aBuffer, + TInt aValue ); + + /** + * Writes buffer to log. + * @param aLevel combination of TLogLevel values + * @param aBuffer buffer to log + * @param aValue1 first value appended to buffer + * @param aValue2 second value appended to buffer + */ + IMPORT_C static void Print( + TInt aLevel, + TPtrC aBuffer, + TInt aValue1, + TInt aValue2 ); + + /** + * Writes buffer to log. This overloaded method is used + * for printing entry or exit from a function. + * @since Series60 2.8 + * @param aLevel combination of TLogLevel values + * @param aEntry if ETrue "<" is appended to end of string + * if EFalse ">" is appended to end of string + * @param aBuffer buffer to log + * @param aRetVal return value of the function. If this value + * is present (i.e. other than KVtDebugReturnValNotApplicable + * is passed) then aBuffer should include format tag '%d' where + * aRetValue should be placed. + */ + IMPORT_C static void Print( + TInt aLevel, + const TBool aEntry, + TPtrC aBuffer, + TInt aRetVal = KVtDebugReturnValNotApplicable ); + + /** + * Initializes logging. This must be called before + * any use of __VTPRINT macros. + */ + IMPORT_C static void Initialize(); + + /** + * Uninitializes logging. This must be called when + * client of logging service is deleted. + */ + IMPORT_C static void Uninitialize(); + + /** + * Returns flags in configuration file + * @return flags + */ + IMPORT_C static TInt Flags(); + + private: + + /** + * Returns logger. + * @return logger + */ + static CVtLogger* Logger(); + + /** + * Returns if certain log levels are set. + * @param aLevels bitmap of TLogLevel values + * @return ETrue if all aLevels are set. + */ + TBool CheckLevels( TInt aLevels ) const; + + /** + * Reads configuration file and starts + * monitoring changes on it. + */ + void ReadCongigFile(); + + private: // from CActive + + /** + * Handles file change notification + */ + void RunL(); + + /** + * Cancels monitoring file change + */ + void DoCancel(); + + private: + + /** + * C++ default constructor. + */ + CVtLogger(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL( ); + + private: // Data + + // Buffer size for printed lines + enum + { + ETempBufLength = 80 + }; + + TFileName iFileName; + RFs iFs; + TInt iLogLevel; + TInt iAccessCount; + TBuf iBuffer; + TBuf iTempBuf; + }; + + +#endif // CVTLOGGER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Logger/Inc/vtlogger.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Logger/Inc/vtlogger.hrh Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,35 @@ +/* +* Copyright (c) 2004 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: Defines when logger is enabled. +* +*/ + + +#ifndef VTLOGGER_HRH +#define VTLOGGER_HRH + +// DATA TYPES +// MACROS + +#if defined(_DEBUG) +/** +* Debugging enabled always in debug builds +*/ +#define VTDEBUG + +#endif + +#endif // VTLOGGER_HRH + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Logger/Src/CVtLogger.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Logger/Src/CVtLogger.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,374 @@ +/* +* Copyright (c) 2004 - 2005 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 telephony logger +* +*/ + + +#pragma CTC SKIP +// INCLUDE FILES +#include "cvtlogger.h" + + +// LOCAL CONSTANTS +_LIT( KVtEngLogConfig, "c:\\Logs\\VT\\VTLOGCONF.txt" ); +_LIT( KVtEngLogFolder, "c:\\Logs\\VT" ); +_LIT( KVtEngLogFolderLogger, "VT" ); +_LIT( KVtEngLogPrefix, "VT: " ); +_LIT( KVtEngLogExtension, ".txt" ); +_LIT( KVtLoggerEnterFunc, "<" ); +_LIT( KVtLoggerExitFunc, ">" ); + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtLogger::CVtLogger +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtLogger::CVtLogger() : CActive( CActive::EPriorityStandard - 1 ), + iLogLevel( ELogLogEverything ) + { + } + +// ----------------------------------------------------------------------------- +// CVtLogger::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVtLogger::ConstructL( ) + { + User::LeaveIfError( iFs.Connect() ); + TFindFile find( iFs ); + TUint logLevel( 0 ); + TInt ret = iFs.Att(KVtEngLogFolder, logLevel ); + if ( ret == KErrNone ) + { + if ( find.FindByPath( KVtEngLogConfig, NULL ) == KErrNone ) + { + CActiveScheduler::Add( this ); + ReadCongigFile(); + } + if ( iLogLevel & ELogToFile ) + { + RThread thread; + iFileName.Copy( thread.Name() ); + iFileName.Append( KVtEngLogExtension ); + } + } + Dll::SetTls( this ); + } + +// ----------------------------------------------------------------------------- +// CVtLogger::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtLogger* CVtLogger::NewL( ) + { + CVtLogger* self = new( ELeave ) CVtLogger; + + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop(); + + return self; + } + +// ----------------------------------------------------------------------------- +// CVtLogger::~CVtLogger +// Destructor +// ----------------------------------------------------------------------------- +// +CVtLogger::~CVtLogger() + { + Cancel(); + iFs.Close(); + Dll::SetTls( NULL ); + } + +// ----------------------------------------------------------------------------- +// CVtLogger::Print +// Writes to log. +// ----------------------------------------------------------------------------- +// +void CVtLogger::Print( TDesC& aDes ) + { + if ( iLogLevel & ELogTime && !(iLogLevel & ELogToFile) ) + { + TTime time; + time.HomeTime(); + const TDateTime dt= time.DateTime(); + + iTempBuf.Zero(); + iTempBuf.AppendNum( dt.Minute() ); + iTempBuf.Append(':'); + iTempBuf.AppendNum( dt.Second() ); + iTempBuf.Append(':'); + iTempBuf.AppendNum( dt.MicroSecond() ); + iTempBuf.Append(' '); + + const TInt currentLength( iTempBuf.Length() ); + + iTempBuf.Append( aDes.Left( Min( iTempBuf.MaxLength() - currentLength, aDes.Length() ) ) ); + RDebug::Print( iTempBuf ); + } + else + { + if ( iLogLevel & ELogToFile ) + { + RFileLogger::Write( + KVtEngLogFolderLogger, + iFileName, + EFileLoggingModeAppend, + aDes ); + } + else + { + RDebug::Print( aDes ); + } + } + } + +// ----------------------------------------------------------------------------- +// CVtLogger::Print +// Writes to log. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CVtLogger::Print( + TInt aLevel, + TPtrC aBuffer ) + { + CVtLogger* logger = CVtLogger::Logger(); + if ( logger && logger->CheckLevels( aLevel ) ) + { + logger->iBuffer.Copy( KVtEngLogPrefix ); + logger->iBuffer.Append( aBuffer); + logger->Print( logger->iBuffer ); + } + } + +// ----------------------------------------------------------------------------- +// CVtLogger::Print +// Writes to log. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CVtLogger::Print( + TInt aLevel, + TPtrC aBuffer, + TInt aValue ) + { + CVtLogger* logger = CVtLogger::Logger(); + if ( logger && logger->CheckLevels( aLevel ) ) + { + logger->iBuffer.Zero(); + logger->iBuffer.AppendNum( aValue ); + logger->iBuffer.Format( aBuffer, aValue ); + logger->iBuffer.Insert( 0, KVtEngLogPrefix ); + logger->Print( logger->iBuffer ); + } + } + +// ----------------------------------------------------------------------------- +// CVtLogger::Print +// Writes to log. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CVtLogger::Print( + TInt aLevel, + TPtrC aBuffer, + TInt aValue1, + TInt aValue2 ) + { + CVtLogger* logger = CVtLogger::Logger(); + if ( logger && logger->CheckLevels( aLevel ) ) + { + logger->iBuffer.Format( aBuffer, aValue1, aValue2 ); + logger->iBuffer.Insert( 0, KVtEngLogPrefix ); + logger->Print( logger->iBuffer ); + } + } + +// ----------------------------------------------------------------------------- +// CVtLogger::Print +// Writes to log. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CVtLogger::Print( + TInt aLevel, + const TBool aEntry, + TPtrC aBuffer, + TInt aRetVal ) + { + CVtLogger* logger = CVtLogger::Logger(); + if ( logger && logger->CheckLevels( aLevel ) ) + { + logger->iBuffer.Copy( KVtEngLogPrefix ); + if ( aEntry ) + { + logger->iBuffer.Append( aBuffer ); + logger->iBuffer.Append( KVtLoggerEnterFunc ); + } + else + { + if ( aRetVal != KVtDebugReturnValNotApplicable ) + { + logger->iTempBuf.Format( aBuffer, aRetVal ); + logger->iBuffer.Append( logger->iTempBuf ); + } + else + { + logger->iBuffer.Append( aBuffer ); + } + logger->iBuffer.Append( KVtLoggerExitFunc ); + } + logger->Print( logger->iBuffer ); + } + } + +// ----------------------------------------------------------------------------- +// CVtLogger::Logger +// Returns logger. +// ----------------------------------------------------------------------------- +// +CVtLogger* CVtLogger::Logger() + { + TAny* tls = Dll::Tls(); + if ( tls ) + { + return reinterpret_cast( tls ); + } + return NULL; + } + +// ----------------------------------------------------------------------------- +// CVtLogger::Initialize +// Initialize logger. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CVtLogger::Initialize() + { + CVtLogger* logger = NULL; + if ( Dll::Tls() == NULL ) + { + TRAPD( err, logger = CVtLogger::NewL() ); + if ( err == KErrNone ) + { + Dll::SetTls( logger ); + } + } + else + { + logger = CVtLogger::Logger(); + } + if ( logger ) + { + (logger->iAccessCount)++; + } + + } + +// ----------------------------------------------------------------------------- +// CVtLogger::Uninitialize +// Uninitialize logger. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CVtLogger::Uninitialize() + { + TAny* tls = Dll::Tls(); + if ( tls ) + { + CVtLogger* logger = CVtLogger::Logger(); + if( logger ) + { + TInt count( --(logger->iAccessCount) ); + if ( !count ) + { + delete reinterpret_cast( tls ); + Dll::SetTls( NULL ); + } + } + } + + } + +void CVtLogger::ReadCongigFile() + { +#ifdef _DEBUG + RDebug::Print(_L(" VT: ReadConfigFile" ) ); +#endif + RFile config; + if ( config.Open( iFs, KVtEngLogConfig, EFileShareAny ) == KErrNone ) + { + TBuf8<16> buf; + if ( config.Read( buf ) == KErrNone ) + { + TLex8 lex( buf ); + TUint logLevel( 0 ); + if ( lex.Val( logLevel, EHex ) == KErrNone ) + { + iLogLevel = logLevel; + } + } + config.Close(); + } + iFs.NotifyChange( ENotifyEntry, iStatus, KVtEngLogConfig() ); + SetActive(); + } + +void CVtLogger::RunL() + { + if ( iStatus == KErrNone ) + { + ReadCongigFile(); + } + } + +void CVtLogger::DoCancel() + { + iFs.NotifyChangeCancel(); + } + +// ----------------------------------------------------------------------------- +// CVtLogger::Flags +// Returns flags. +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CVtLogger::Flags() + { + CVtLogger* logger = CVtLogger::Logger(); + if ( logger ) + { + return logger->iLogLevel; + } + return KErrGeneral; + } + +// ----------------------------------------------------------------------------- +// CVtLogger::CheckLevels +// Check debug level. +// ----------------------------------------------------------------------------- +// +TBool CVtLogger::CheckLevels( TInt aLevels ) const + { + if ( aLevels & iLogLevel ) + { + return ETrue; + } + return EFalse; + } +#pragma CTC ENDSKIP +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Logger/Src/CVtLoggerStub.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Logger/Src/CVtLoggerStub.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,126 @@ +/* +* Copyright (c) 2004 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 telephony logger stub +* +*/ + + + +// INCLUDE FILES +#include "CVtLogger.h" +#include + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtLogger::CVtLogger +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtLogger::CVtLogger() + { + } + +// ----------------------------------------------------------------------------- +// CVtLogger::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVtLogger::ConstructL( ) + { + } + +// ----------------------------------------------------------------------------- +// CVtLogger::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtLogger* CVtLogger::NewL( ) + { + return NULL; + } + +// Destructor +CVtLogger::~CVtLogger() + { + } + +// ----------------------------------------------------------------------------- +// CVtLogger::Print +// Prints to log. +// +// ----------------------------------------------------------------------------- +// +void CVtLogger::Print( TDesC& ) + { + } + +// ----------------------------------------------------------------------------- +// CVtLogger::Print +// Prints to log. +// +// ----------------------------------------------------------------------------- +// +EXPORT_C void CVtLogger::Print( + TInt , + TDesC& ) + { + } + +// ----------------------------------------------------------------------------- +// CVtLogger::Print +// Prints to log. +// +// ----------------------------------------------------------------------------- +// +EXPORT_C void CVtLogger::Print( + TInt , + TDesC& , + TInt ) + { + } + +// ----------------------------------------------------------------------------- +// CVtLogger::Print +// Prints to log. +// +// ----------------------------------------------------------------------------- +// +EXPORT_C void CVtLogger::Print( + TInt , + TDesC& , + TInt , + TInt ) + { + } + +CVtLogger* CVtLogger::Logger() + { + return NULL; + } + +// ----------------------------------------------------------------------------- +// CVtLogger::CheckLevels +// Check debug level. +// +// ----------------------------------------------------------------------------- +// +TBool CVtLogger::CheckLevels( TInt aLevels ) const + { + return EFalse; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Rom/videoteleng.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Rom/videoteleng.iby Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,35 @@ +/* +* Copyright (c) 2004-2007 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: IBY file + * +*/ + + +#ifndef __VIDEOTELENG_IBY__ +#define __VIDEOTELENG_IBY__ + +REM Video telephony engine libraries + +#ifdef __CS_VIDEO_TELEPHONY +file=ABI_DIR\BUILD_DIR\videotelproto.dll SHARED_LIB_DIR\videotelproto.dll +file=ABI_DIR\BUILD_DIR\Videoteleng.dll SHARED_LIB_DIR\Videoteleng.dll +file=ABI_DIR\BUILD_DIR\cscallctrl.dll SHARED_LIB_DIR\cscallctrl.dll +file=ABI_DIR\BUILD_DIR\vtlogger.dll SHARED_LIB_DIR\vtlogger.dll + +// Enabler for eclipsing ROM binaries +data=ZSYSTEM\install\videoteleng_stub.sis system\install\videoteleng_stub.sis + +#endif + +#endif diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Audio/CVtEngAudioHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Audio/CVtEngAudioHandler.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,709 @@ +/* +* Copyright (c) 2004-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: Audio handler implementation. +* +*/ + + +// INCLUDE FILES +#include "CVtEngAudioHandler.h" +#include "CVtEngSettings.h" +#include "CVtEngEventManager.h" +#include "VtEngUtils.h" +#include +#include +#include +#include +#include "VtEngUtils.h" +#include "CVtEngStateManager.h" +#include "MVtEngSessionInfo.h" +#include "CVtEngHandlerContainer.h" + +// CONSTANTS + +// For DevSound initialization +//const TInt KVtEngUidControlHwDevice = 0x10206593; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngAudioHandler::CVtEngAudioHandler +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngAudioHandler::CVtEngAudioHandler() + { + __VTPRINT( DEBUG_CONSTRUCT | DEBUG_AUDIO, "AH.c++" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngAudioHandler::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVtEngAudioHandler::ConstructL() + { + __VTPRINT( DEBUG_CONSTRUCT | DEBUG_AUDIO, "AH.ConstructL<" ) + + iAccHandler = &CVtEngUtility::AccessoryHandler(); + iAccHandler->RegisterObserverL( this ); + iTelephonyAudioRouting = CTelephonyAudioRouting::NewL( *this ); + iCurrentAudioOutput = iTelephonyAudioRouting->Output(); + + // Fetch the mode. + User::LeaveIfError( iAccHandler->AccessoryMode( iAccMode ) ); + __VTPRINT2( DEBUG_AUDIO, "AH.iAccMode %d", ( TInt )iAccMode.iAccessoryMode ) + + UpdateCurrentVolume(); + __VTPRINT( DEBUG_CONSTRUCT | DEBUG_AUDIO, "AH.ConstructL>") + } + +// ----------------------------------------------------------------------------- +// CVtEngAudioHandler::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtEngAudioHandler* CVtEngAudioHandler::NewL() + { + CVtEngAudioHandler* self = new( ELeave ) CVtEngAudioHandler; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngAudioHandler::~CVtEngAudioHandler +// Destructor. +// ----------------------------------------------------------------------------- +// +CVtEngAudioHandler::~CVtEngAudioHandler() + { + __VTPRINT( DEBUG_AUDIO, "AH.~<" ) + delete iRoutingEnabler; + + delete iTelephonyAudioRouting; + if ( iAccHandler ) + { + iAccHandler->RemoveObserver( this ); + } + __VTPRINT( DEBUG_AUDIO, "AH.~>" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngAudioHandler::HandleL +// ----------------------------------------------------------------------------- +// +void CVtEngAudioHandler::HandleL( CVtEngOperation& aOperation ) + { + __VTPRINT2( DEBUG_AUDIO, "AH.HandleL op=%d", ( TInt )iOperation ) + if ( iOperation ) + { + // While operation is ongoing, another call should not be made. + User::Leave( KErrArgument ); + } + + MVtEngAudio::TVtEngRoutingSetting routeSetting; + TVtEngOpParamUtil::Set( + routeSetting, aOperation ); + + switch( routeSetting ) + { + case EActivateHandsfree: + SetLoudspeakerL( ETrue, ETrue ); + break; + + case EDeactivateHansfree: + SetLoudspeakerL( EFalse, ETrue ); + break; + + case EActivateBT: + SetBluetoothL( ETrue ); // asynchronous + break; + + case EDeactivateBT: + SetBluetoothL( EFalse ); + break; + } + + iOperation = &aOperation; + __VTPRINT( DEBUG_AUDIO | DEBUG_RETURN, "AH.HandleL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngAudioHandler::SetRoutingEnablerL +// ----------------------------------------------------------------------------- +// +void CVtEngAudioHandler::SetRoutingEnablerL( const TBool aEnable ) + { + __VTPRINTENTER( "AHRout.SetRoutingEnablerL" ) + + if ( aEnable && !iRoutingEnabler ) + { + // Before connected state audio routing can be changed by the user + // only in MO calls. Create temporary devsound only if call is such. + const CVtEngHandlerContainer& handlers = + CVtEngUtility::StateManager()->Handlers(); + const MVtEngSessionInfo& session = handlers.Session(); + MVtEngSessionInfo::TDirection direction = + MVtEngSessionInfo::EDirectionNone; // init to MO, if + const TInt err( session.GetDirection( direction ) ); + if ( err == KErrNone && direction == MVtEngSessionInfo::EDirectionMO ) + { + iRoutingEnabler = CRoutingEnabler::NewL(); + } + } + else if ( !aEnable ) + { + delete iRoutingEnabler; + iRoutingEnabler = NULL; + } + __VTPRINTEXIT( "AHRout.ReleaseRoutingEnablerL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngAudioHandler::IncreaseVolume +// ----------------------------------------------------------------------------- +// +TBool CVtEngAudioHandler::IncreaseVolume() + { + __VTPRINTENTER( "AH.IncreaseVolume" ) + TBool adjustOk( AdjustVolume( 1 ) ); + if ( !adjustOk ) + { + // only reason for AdjustVolume to fail is that volume is max already + CVtEngEventManager::NotifyEvent( KVtEngAudioVolumeMax ); + } + __VTPRINTEXITR( "AH.IncreaseVolume %d", adjustOk ) + return adjustOk; + } + +// ----------------------------------------------------------------------------- +// CVtEngAudioHandler::DecreaseVolume +// ----------------------------------------------------------------------------- +// +TBool CVtEngAudioHandler::DecreaseVolume() + { + __VTPRINTENTER( "AH.DecreaseVolume" ) + TBool adjustOk( AdjustVolume( -1 ) ); + if ( !adjustOk ) + { + // only reason for AdjustVolume to fail is that volume is min already + CVtEngEventManager::NotifyEvent( KVtEngAudioVolumeMin ); + } + __VTPRINTEXITR( "AH.DecreaseVolume %d", adjustOk ) + return adjustOk; + } + +// ----------------------------------------------------------------------------- +// CVtEngAudioHandler::AdjustVolume +// ----------------------------------------------------------------------------- +// +TBool CVtEngAudioHandler::AdjustVolume( const TInt aDelta ) + { + __VTPRINTENTER( "AH.AdjustVolume" ) + __VTPRINT2( DEBUG_AUDIO, "AH.AdjustVolume aDelta = %d", aDelta ) + TBool result( EFalse ); + CVtEngSettings& settings( CVtEngUtility::Settings() ); + TVtEngOutputVolume volume; + settings.GetVolume( volume.iHandsetVolume, EFalse, EFalse ); + settings.GetVolume( volume.iHandsfreeVolume, ETrue, EFalse ); + TAudioRoutingState routingState; + GetRoutingState( routingState ); + TInt& value( ( routingState == EAudioLoudspeaker ) ? + volume.iHandsfreeVolume : volume.iHandsetVolume ); + value += aDelta; + TInt validValue( settings.ValidVolume( value ) ); + if ( validValue == value ) + { + settings.SetVolume( + volume.iHandsetVolume, + volume.iHandsfreeVolume, + ETrue ); + settings.SetVolume( + volume.iHandsetVolume, + volume.iHandsfreeVolume, + EFalse ); + result = ETrue; + } + __VTPRINTEXITR( "AH.AdjustVolume %d", result ) + return result; + } + +// ----------------------------------------------------------------------------- +// CVtEngAudioHandler::GetRoutingState +// ----------------------------------------------------------------------------- +// +TInt CVtEngAudioHandler::GetRoutingState( + TAudioRoutingState& aAudioRoutingState ) + { + switch ( iCurrentAudioOutput ) + { + // Wired headset has the highest priority. + case CTelephonyAudioRouting::EWiredAudioAccessory: + __VTPRINT( DEBUG_CONSTRUCT | DEBUG_AUDIO, "AH.GRS.wired" ) + aAudioRoutingState = EAudioWiredHeadset; + break; + + // Then bluetooth handsfree. + case CTelephonyAudioRouting::EBTAudioAccessory: + __VTPRINT( DEBUG_CONSTRUCT | DEBUG_AUDIO, "AH.GRS.bt" ) + aAudioRoutingState = EAudioBT; + break; + + // Loudspeaker. + case CTelephonyAudioRouting::ELoudspeaker: + __VTPRINT( DEBUG_CONSTRUCT | DEBUG_AUDIO, "AH.GRS.IHF" ) + aAudioRoutingState = EAudioLoudspeaker; + break; + + // Handset as fallback. + default: + __VTPRINT( DEBUG_CONSTRUCT | DEBUG_AUDIO, "AH.GRS.Handset" ) + aAudioRoutingState = EAudioHandset; + break; + } + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngAudioHandler::GetRoutingAvailability +// ----------------------------------------------------------------------------- +// +TInt CVtEngAudioHandler::GetRoutingAvailability( + const TAudioRoutingState aAudioRoutingState, + TBool& aAvailable ) + { + TAudioRoutingState currentRouting; + GetRoutingState( currentRouting ); // always succeeds + + if ( currentRouting == aAudioRoutingState ) + { + // It is possible to route to itself, although it does not make + // much sense. + aAvailable = ETrue; + } + else if ( currentRouting == EAudioWiredHeadset ) + { + // For wired headset, audio routings are not possible. + aAvailable = EFalse; + } + else + { + switch ( aAudioRoutingState ) + { + case EAudioHandset: + case EAudioLoudspeaker: + // Handset & loudspeaker are always available. + aAvailable = ETrue; + break; + + case EAudioBT: + aAvailable = IsOutputAvailable( CTelephonyAudioRouting::EBTAudioAccessory ); + break; + + case EAudioWiredHeadset: + // Wired headset can not be routed to. When headset is + // attached, routing happens automatically. + aAvailable = EFalse; + break; + } + } + + __VTPRINT3( DEBUG_AUDIO, "AH.GRA state %d availability=%d", + aAudioRoutingState, aAvailable ) + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngAudioHandler::GetHeadsetType +// ----------------------------------------------------------------------------- +// +TInt CVtEngAudioHandler::GetHeadsetType( + TWiredHeadsetType& aHeadsetType ) + { + switch ( iAccMode.iAccessoryMode ) + { + case EAccModeWiredHeadset: + case EAccModeWiredCarKit: + case EAccModeMusicStand: + aHeadsetType = EWiredHeadset; + break; + + case EAccModeLoopset: + aHeadsetType = EWiredLoopset; + break; + + case EAccModeTextDevice: + aHeadsetType = EWiredTty; + break; + + case EAccModeHandPortable: + case EAccModeWirelessHeadset: + case EAccModeWirelessCarKit: + default: + // Not wired headset. + aHeadsetType = EWiredNone; + break; + } + + __VTPRINT2( DEBUG_AUDIO, "AH.HeadsetType=%d", aHeadsetType ) + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngAudioHandler::OutputVolume +// ----------------------------------------------------------------------------- +// +TInt CVtEngAudioHandler::OutputVolume( + const TBool aHandsetVolume ) const + { + __VTPRINT2( DEBUG_AUDIO, "AH.OutputVolume isHandset=%d", aHandsetVolume ) + TInt vol = 0; + CVtEngSettings& setting = CVtEngUtility::Settings(); + TInt err( setting.GetVolume( vol, !aHandsetVolume, EFalse ) ); + if ( err != KErrNone ) + { + vol = err; + } + __VTPRINT2( DEBUG_AUDIO, "AH.OutputVolume vol=%d",vol ) + return vol; + } + +// ----------------------------------------------------------------------------- +// CVtEngAudioHandler::SetLoudspeakerL +// ----------------------------------------------------------------------------- +// +void CVtEngAudioHandler::SetLoudspeakerL( TBool aTurnOn, TBool /*aShowNote*/ ) + { + __VTPRINTENTER( "AH.SetLoudspeakerL" ) + __VTPRINT2( DEBUG_AUDIO, "AH.SetLoudspeakerL %d", aTurnOn ) + TBool available( EFalse ); + GetRoutingAvailability( EAudioLoudspeaker, available ); + if ( !available ) + { + User::Leave( KErrNotSupported ); + } + // Set shownote flag up in telephony audiorouting, before calling SetOutputL. + User::LeaveIfError( iTelephonyAudioRouting->SetShowNote( ETrue ) ); + + if( aTurnOn ) + { + iTelephonyAudioRouting->SetOutputL( CTelephonyAudioRouting::ELoudspeaker ); + } + else + { + iTelephonyAudioRouting->SetOutputL( CTelephonyAudioRouting::EHandset ); + } + __VTPRINTEXIT( "AH.SetLoudspeakerL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngAudioHandler::SetBluetoothL +// ----------------------------------------------------------------------------- +// +void CVtEngAudioHandler::SetBluetoothL( TBool aTurnOn ) + { + __VTPRINTENTER( "AH.SetBluetoothL" ) + TBool available( EFalse ); + GetRoutingAvailability( EAudioBT, available ); + if ( !available ) + { + User::Leave( KErrNotSupported ); + } + // Set shownote flag up in telephony audiorouting, before calling SetOutputL. + User::LeaveIfError( iTelephonyAudioRouting->SetShowNote( ETrue ) ); + + if( aTurnOn ) + { + iTelephonyAudioRouting->SetOutputL( CTelephonyAudioRouting::EBTAudioAccessory ); + } + else + { + iTelephonyAudioRouting->SetOutputL( CTelephonyAudioRouting::EHandset ); + } + __VTPRINTEXIT( "AH.SetBluetoothL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngAudioHandler::AvailableOutputsChanged +// ----------------------------------------------------------------------------- +// +void CVtEngAudioHandler::AvailableOutputsChanged( + CTelephonyAudioRouting& /*aTelephonyAudioRouting*/ ) + { + __VTPRINTENTER( "AH.AvailableOutputsChanged" ) + CVtEngEventManager::NotifyEvent( KVtEngAudioRoutingAvailabilityChanged ); + __VTPRINTEXIT( "AH.AvailableOutputsChanged" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngAudioHandler::OutputChanged +// ----------------------------------------------------------------------------- +// +void CVtEngAudioHandler::OutputChanged( + CTelephonyAudioRouting& aTelephonyAudioRouting ) + { + __VTPRINTENTER( "AH.OutputChanged" ) + CTelephonyAudioRouting::TAudioOutput + previousAudioOutput( iCurrentAudioOutput ); + iCurrentAudioOutput = aTelephonyAudioRouting.Output(); + CVtEngEventManager::NotifyEvent( KVtEngAudioRoutingChanged ); + // HandSet -> IHF + if( ( previousAudioOutput == CTelephonyAudioRouting::EHandset ) && + ( iCurrentAudioOutput == CTelephonyAudioRouting::ELoudspeaker ) ) + { + __VTPRINT( DEBUG_AUDIO, "AH.OutputChanged signalling HandSet to IHF" ) + } + // IHF -> HandSet + else if( ( previousAudioOutput == CTelephonyAudioRouting::ELoudspeaker ) && + ( iCurrentAudioOutput == CTelephonyAudioRouting::EHandset ) ) + { + __VTPRINT( DEBUG_AUDIO, "AH.OutputChanged signalling IHF to HandSet" ) + } + UpdateCurrentVolume(); + __VTPRINTEXITR( "AH.OutputChanged %d", iCurrentAudioOutput ) + } + +// ----------------------------------------------------------------------------- +// CVtEngAudioHandler::SetOutputComplete +// ----------------------------------------------------------------------------- +// +void CVtEngAudioHandler::SetOutputComplete( + CTelephonyAudioRouting& aTelephonyAudioRouting, + TInt aError ) + { + __VTPRINTENTER( "AH.SetOutputComplete" ) + if ( aError == KErrNone ) + { + OutputChanged( aTelephonyAudioRouting ); + } + CompleteOperation( aError ); + __VTPRINTEXIT( "AH.SetOutputComplete" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngAudioHandler::CompleteOperation +// ----------------------------------------------------------------------------- +// +void CVtEngAudioHandler::CompleteOperation( TInt aResult ) + { + __VTPRINT3( DEBUG_AUDIO, "AH.CompleteOperation op=%d,res=%d" , + ( TInt )iOperation, aResult ) + if ( iOperation ) + { + iOperation->HandleOpComplete( aResult ); + iOperation = NULL; + } + } + +// ----------------------------------------------------------------------------- +// CVtEngAudioHandler::UpdateCurrentVolume +// ----------------------------------------------------------------------------- +// +void CVtEngAudioHandler::UpdateCurrentVolume() + { + __VTPRINTENTER( "AH.UpdateCurrentVolume" ) + TAudioRoutingState currentRouting = EAudioHandset; + GetRoutingState( currentRouting ); + + const TBool currentVolume = ( currentRouting == EAudioLoudspeaker ); + CVtEngSettings& setting = CVtEngUtility::Settings(); + setting.SetCurrentVolume( currentVolume ); + + __VTPRINTEXITR( "AH.UpdateCurrentVolume output is IHF=%d", currentVolume ) + } + +// ----------------------------------------------------------------------------- +// CVtEngAudioHandler::AccessoryModeChanged +// ----------------------------------------------------------------------------- +// +void CVtEngAudioHandler::AccessoryModeChanged( + const TAccMode& aMode, const TBool /* aActivated */ ) + { + iAccMode.iAccessoryMode = aMode; + } + + +// ----------------------------------------------------------------------------- +// CVtEngAudioHandler::IsOutputAvailable +// ----------------------------------------------------------------------------- +// +TBool CVtEngAudioHandler::IsOutputAvailable( + const CTelephonyAudioRouting::TAudioOutput aOutput ) + { + const TArray< CTelephonyAudioRouting::TAudioOutput > outputs = + iTelephonyAudioRouting->AvailableOutputs(); + + for ( TInt i = 0; i < outputs.Count(); i++ ) + { + if ( outputs[ i ] == aOutput ) + { + return ETrue; + } + } + return EFalse; + } +// ----------------------------------------------------------------------------- +// CRoutingEnabler::NewL +// ----------------------------------------------------------------------------- +// +CRoutingEnabler* CRoutingEnabler::NewL() + { + CRoutingEnabler* enabler = + new ( ELeave ) CRoutingEnabler(); + CleanupStack::PushL( enabler ); + enabler->StartL(); + CleanupStack::Pop( enabler ); + return enabler; + } + +// Destructor +CRoutingEnabler::~CRoutingEnabler() + { + if ( iDevSound ) + { + // If initialization ahs been successfull, Devsound Play has started + // and need to be stopped. + if( !iDevsoundInitializeFailure ) + { + __VTPRINT( DEBUG_MEDIA, "AHRout.~ Stopping audio" ) + iDevSound->Stop(); + } + delete iDevSound; + iDevSound = NULL; + } + } + +// c++ constructor +CRoutingEnabler::CRoutingEnabler() + { + } + +// ----------------------------------------------------------------------------- +// CRoutingEnabler::StartL +// ----------------------------------------------------------------------------- +// +void CRoutingEnabler::StartL() + { + __VTPRINTENTER( "AHRout.StartL" ) + iDevSound = CMMFDevSound::NewL(); + + iDevSound->InitializeL( + *( this ), + EMMFStatePlaying ); + __VTPRINTEXIT( "AHRout.StartL" ) + } + +// ----------------------------------------------------------------------------- +// CRoutingEnabler::InitializeComplete +// ----------------------------------------------------------------------------- +// +void CRoutingEnabler::InitializeComplete( TInt aError ) + { + __VTPRINTENTER( "AHRout.InitializeComplete" ) + if ( aError == KErrNone ) + { + TMMFPrioritySettings prioritySettings; + prioritySettings.iPriority = KAudioPriorityCSCallDownlink; + prioritySettings.iPref = + ( TMdaPriorityPreference ) KAudioPrefCSCallDownlink; + prioritySettings.iState = EMMFStatePlaying; + if ( iDevSound ) + { + iDevSound->SetPrioritySettings( prioritySettings ); + + TRAPD( err, iDevSound->PlayInitL() ); + if ( err != KErrNone ) + { + __VTPRINT2( DEBUG_AUDIO, "AHRout.InitializeComplete PlayInitL err=%d", err ) + + // Devsound PlayInitL leave error happened. + iDevsoundInitializeFailure = ETrue; + } + } + } + else + { + __VTPRINT2( DEBUG_AUDIO, "AHRout.InitializeComplete err=%d", aError ) + + // Devsound initialization failed + iDevsoundInitializeFailure = ETrue; + } + __VTPRINTEXIT( "AHRout.InitializeComplete" ) + } + +// ----------------------------------------------------------------------------- +// CRoutingEnabler::ToneFinished +// ----------------------------------------------------------------------------- +// +void CRoutingEnabler::ToneFinished( TInt /*aError*/) + { + } + +// ----------------------------------------------------------------------------- +// CRoutingEnabler::BufferToBeFilled +// ----------------------------------------------------------------------------- +// +void CRoutingEnabler::BufferToBeFilled( + CMMFBuffer* /*aBuffer*/) + { + } + +// ----------------------------------------------------------------------------- +// CRoutingEnabler::PlayError +// ----------------------------------------------------------------------------- +// +void CRoutingEnabler::PlayError( TInt /*aError*/) + { + } + +// ----------------------------------------------------------------------------- +// CRoutingEnabler::BufferToBeEmptied +// ----------------------------------------------------------------------------- +// +void CRoutingEnabler::BufferToBeEmptied( + CMMFBuffer* /*aBuffer*/ ) + { + } + +// ----------------------------------------------------------------------------- +// CRoutingEnabler::RecordError +// ----------------------------------------------------------------------------- +// +void CRoutingEnabler::RecordError( + TInt /*aError*/ ) + { + } + +// ----------------------------------------------------------------------------- +// CRoutingEnabler::ConvertError +// ----------------------------------------------------------------------------- +// +void CRoutingEnabler::ConvertError( TInt /*aError*/ ) + { + } + +// ----------------------------------------------------------------------------- +// CRoutingEnabler::DeviceMessage +// ----------------------------------------------------------------------------- +// +void CRoutingEnabler::DeviceMessage( + TUid /*aMessageType*/, const TDesC8& /*aMsg*/ ) + { + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Base/CVtEngAccessoryHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Base/CVtEngAccessoryHandler.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,207 @@ +/* +* Copyright (c) 2004-2005 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: Accessory listener. +* +*/ + + + +// INCLUDE FILES +#include "CVtEngAccessoryHandler.h" +#include "MVtEngAccessoryObserver.h" +#include + +// CONSTANTS +const TInt KVtEngAccObserverGranularity = 1; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngAccessoryHandler::CVtEngAccessoryHandler +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngAccessoryHandler::CVtEngAccessoryHandler() : + CActive( CActive::EPriorityStandard ), + iAccessoryObservers( KVtEngAccObserverGranularity ) + { + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CVtEngAccessoryHandler::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVtEngAccessoryHandler::ConstructL() + { + User::LeaveIfError( iAccessoryServer.Connect() ); + User::LeaveIfError( iAccessoryMode.CreateSubSession( iAccessoryServer ) ); + StartListening(); + } + +// ----------------------------------------------------------------------------- +// CVtEngAccessoryHandler::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtEngAccessoryHandler* CVtEngAccessoryHandler::NewL( ) + { + __VTPRINTENTER( "AccHdr.NewL" ) + CVtEngAccessoryHandler* self = new( ELeave ) CVtEngAccessoryHandler; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + __VTPRINTEXIT( "AccHdr.NewL" ) + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngAccessoryHandler::~CVtEngAccessoryHandler +// Destructor. +// ----------------------------------------------------------------------------- +// +CVtEngAccessoryHandler::~CVtEngAccessoryHandler() + { + __VTPRINTENTER( "AccHdr.~" ) + Cancel(); + RemoveAllObservers(); + iAccessoryMode.CloseSubSession(); + iAccessoryServer.Disconnect(); + __VTPRINTEXIT( "AccHdr.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngAccessoryHandler::RemoveObserver +// Removes an accessory listener. +// ----------------------------------------------------------------------------- +// +void CVtEngAccessoryHandler::RemoveObserver( + MVtEngAccessoryObserver* aObserver ) + { + __VTPRINTENTER( "AccHdr.RemoveObserver" ) + TInt pos = iAccessoryObservers.Find( aObserver ); + if ( pos != KErrNotFound ) + { + iAccessoryObservers.Remove( pos ); + } + __VTPRINTEXIT( "AccHdr.RemoveObserver" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngAccessoryHandler::RegisterObserverL +// New accessory listener. +// ----------------------------------------------------------------------------- +// +void CVtEngAccessoryHandler:: + RegisterObserverL( MVtEngAccessoryObserver* aObserver ) + { + __VTPRINTENTER( "AccHdr.RegisterObserverL" ) + TInt pos = iAccessoryObservers.Find( aObserver ); + if ( pos == KErrNotFound ) + { + User::LeaveIfError( iAccessoryObservers.Append( aObserver ) ); + } + __VTPRINTEXIT( "AccHdr.RegisterObserverL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngAccessoryHandler::RemoveAllObservers +// All observers off they go +// +// ----------------------------------------------------------------------------- +// +void CVtEngAccessoryHandler::RemoveAllObservers() + { + iAccessoryObservers.ResetAndDestroy(); + iAccessoryObservers.Close(); + } + +// ----------------------------------------------------------------------------- +// CVtEngAccessoryHandler::StartListening +// ----------------------------------------------------------------------------- +// +void CVtEngAccessoryHandler::StartListening() + { + iAccessoryMode.NotifyAccessoryModeChanged( iStatus, iMode ); + SetActive(); + } + +// ----------------------------------------------------------------------------- +// CVtEngAccessoryHandler::RunL +// From CActive. +// ----------------------------------------------------------------------------- +// +void CVtEngAccessoryHandler::RunL() + { + __VTPRINTENTER( "AccHdr.RunL" ) + StartListening(); + NotifyObserversL(); + __VTPRINTEXIT( "AccHdr.RunL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngAccessoryHandler::DoCancel +// From CActive. +// ----------------------------------------------------------------------------- +// +void CVtEngAccessoryHandler::DoCancel() + { + __VTPRINTENTER( "AccHdr.DoCancel" ) + iAccessoryMode.CancelNotifyAccessoryModeChanged(); + __VTPRINTEXIT( "AccHdr.DoCancel" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngAccessoryHandler::RunError +// From CActive. +// ----------------------------------------------------------------------------- +// +TInt CVtEngAccessoryHandler::RunError( TInt /*aError*/ ) + { + __VTPRINTENTER( "AccHdr.RunError" ) + __VTPRINTEXIT( "AccHdr.RunError" ) + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngAccessoryHandler::NotifyObserversL. +// ----------------------------------------------------------------------------- +// +void CVtEngAccessoryHandler::NotifyObserversL() + { + const TInt obsCount( iAccessoryObservers.Count() ); + for ( TInt i = 0; i < obsCount; i++ ) + { + MVtEngAccessoryObserver* obs = iAccessoryObservers[ i ]; + if ( obs ) + { + obs->AccessoryModeChanged( + iMode.iAccessoryMode, iMode.iAudioOutputStatus ); + } + } + } + +// ----------------------------------------------------------------------------- +// CVtEngAccessoryHandler::CMonitor::AccessoryMode +// ----------------------------------------------------------------------------- +// +TInt CVtEngAccessoryHandler:: + AccessoryMode( TAccPolAccessoryMode& aAccessoryMode) const + { + return iAccessoryMode.GetAccessoryMode( aAccessoryMode ); + } + +// end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Base/CVtEngCRObserverItem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Base/CVtEngCRObserverItem.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,242 @@ +/* +* Copyright (c) 2004-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 call CR listener. +* +*/ + + + +// INCLUDE FILES +#include "CVtEngCRObserverItem.h" +#include +#include "MVtEngCRSettingObserver.h" +#include + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngCRObserverItem::CVtEngCRObserverItem +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngCRObserverItem::CVtEngCRObserverItem( + MVtEngCRSettingObserver* aObserver, + TUid aUid, TUint32 aKey, + CCenRepNotifyHandler::TCenRepKeyType aType ) : + iObserver( aObserver ), iUid( aUid ), iKey( aKey ), iType( aType ), + iNotifier( NULL ) + { + } + +// ----------------------------------------------------------------------------- +// CVtEngCRObserverItem::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtEngCRObserverItem* CVtEngCRObserverItem::NewL( + MVtEngCRSettingObserver* aObserver, + TUid aUid, TUint32 aKey, + CCenRepNotifyHandler::TCenRepKeyType aType ) + { + __VTPRINTENTER( "CRListener.NewL" ) + CVtEngCRObserverItem* self = + new( ELeave ) CVtEngCRObserverItem( aObserver, aUid, aKey, aType ); + __VTPRINTEXIT( "CRListener.NewL" ) + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRObserverItem::~CVtEngCRObserverItem +// Destructor. +// ----------------------------------------------------------------------------- +// +CVtEngCRObserverItem::~CVtEngCRObserverItem() + { + __VTPRINTENTER( "CRListener.~" ) + if ( iNotifier ) + { + iNotifier->StopListening(); + } + delete iNotifier; + __VTPRINTEXIT( "CRListener.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCRObserverItem::Offer +// Checks if uid and id match this observer's. +// ----------------------------------------------------------------------------- +// +TBool CVtEngCRObserverItem::Offer( const TUid aUid, const TUint32 aKey ) const + { + return aUid == iUid && iKey == aKey ? ETrue : EFalse; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRObserverItem::Offer +// Checks if uid matches this observer's. +// ----------------------------------------------------------------------------- +// +TBool CVtEngCRObserverItem::Offer( const TUid aUid ) const + { + return aUid == iUid ? ETrue : EFalse; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRObserverItem::Offer +// Checks if id matches this observer's. +// ----------------------------------------------------------------------------- +// +TBool CVtEngCRObserverItem::Offer( const TUint32 aKey ) const + { + return iKey == aKey ? ETrue : EFalse; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRObserverItem::SetCenRepNotifier +// Sets the actual change handler to this object. +// ----------------------------------------------------------------------------- +// +void CVtEngCRObserverItem::SetCenRepNotifier( CCenRepNotifyHandler* aNotifier ) + { + iNotifier = aNotifier; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRObserverItem::HandleNotifyInt +// Callback of changed int value. +// ----------------------------------------------------------------------------- +// +void CVtEngCRObserverItem::HandleNotifyInt( TUint32 aId, TInt aNewValue ) + { + __VTPRINTENTER( "CRListener.Int" ) + iObserver->HandleNotifyInt( iUid, aId, aNewValue ); + __VTPRINTEXIT( "CRListener.Int" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCRObserverItem::HandleNotifyReal +// Callback of changed real value. +// ----------------------------------------------------------------------------- +// +void CVtEngCRObserverItem::HandleNotifyReal( TUint32 aId, TReal aNewValue ) + { + __VTPRINTENTER( "CRListener.Real" ) + iObserver->HandleNotifyReal( iUid, aId, aNewValue ); + __VTPRINTEXIT( "CRListener.Real" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCRObserverItem::HandleNotifyString +// Callback of changed string value. +// ----------------------------------------------------------------------------- +// +void CVtEngCRObserverItem::HandleNotifyString( TUint32 aId, + const TDesC16& aNewValue ) + { + __VTPRINTENTER( "CRListener.String" ) + iObserver->HandleNotifyString( iUid, aId, aNewValue ); + __VTPRINTEXIT( "CRListener.String" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCRObserverItem::HandleNotifyBinary +// Callback of changed binary value. +// ----------------------------------------------------------------------------- +// +void CVtEngCRObserverItem::HandleNotifyBinary( TUint32 /* aId */, + const TDesC8& /* aNewValue */ ) + { + __VTPRINTENTER( "CRListener.Binary" ) + __VTPRINTEXIT( "CRListener.Binary" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCRObserverItem::HandleNotifyGeneric +// Callback of a change in central repository. +// ----------------------------------------------------------------------------- +// +void CVtEngCRObserverItem::HandleNotifyGeneric( TUint32 /* aId */ ) + { + __VTPRINTENTER( "CRListener.Generic" ) + __VTPRINTEXIT( "CRListener.Generic" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCRObserverItem::HandleNotifyError +// Callback of an error occurred. +// ----------------------------------------------------------------------------- +// +#ifdef VTDEBUG +void CVtEngCRObserverItem::HandleNotifyError( TUint32 aId, TInt aError, + CCenRepNotifyHandler* /* aHandler */ ) +#else +void CVtEngCRObserverItem::HandleNotifyError( + TUint32 /* aId */, TInt /* aError */, CCenRepNotifyHandler* /* aHandler */ ) +#endif // VTDEBUG + { + __VTPRINT3( DEBUG_GEN, "CRListener.error id=%d,err=%d ", aId, aError ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCRObserverItem::Uid +// Returns Uid for this observer. +// ----------------------------------------------------------------------------- +// +TUid CVtEngCRObserverItem::Uid() const + { + return iUid; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRObserverItem::Key +// Returns Key for this observer. +// ----------------------------------------------------------------------------- +// +TUint32 CVtEngCRObserverItem::Key() const + { + return iKey; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRObserverItem::Notifier +// Returns Notifier for this observer. +// ----------------------------------------------------------------------------- +// +CCenRepNotifyHandler* CVtEngCRObserverItem::Notifier() const + { + return iNotifier; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRObserverItem::Type +// Returns Type for this observer. +// ----------------------------------------------------------------------------- +// +CCenRepNotifyHandler::TCenRepKeyType CVtEngCRObserverItem::Type() const + { + return iType; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRObserverItem::Observer +// Returns true observer for this observer. +// ----------------------------------------------------------------------------- +// +MVtEngCRSettingObserver* CVtEngCRObserverItem::Observer() const + { + return iObserver; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Base/CVtEngCRProxy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Base/CVtEngCRProxy.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,441 @@ +/* +* Copyright (c) 2004-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: Central repository proxy. +* +*/ + + + +// INCLUDE FILES +#include "CVtEngCRObserverItem.h" +#include "CVtEngCRProxy.h" +#include "MVtEngCRSettingObserver.h" +#include + +// CONSTANTS + +const TInt KVtEngCRProxyObsGranularity = 5; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::CVtEngCRProxy +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngCRProxy::CVtEngCRProxy() : iObserverItems( KVtEngCRProxyObsGranularity ) + { + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtEngCRProxy* CVtEngCRProxy::NewL( ) + { + __VTPRINTENTER( "CRProxy.NewL" ) + CVtEngCRProxy* self = new( ELeave ) CVtEngCRProxy; + __VTPRINTEXIT( "CRProxy.NewL" ) + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::~CVtEngCRProxy +// Destructor. +// ----------------------------------------------------------------------------- +// +CVtEngCRProxy::~CVtEngCRProxy() + { + __VTPRINTENTER( "CRProxy.~" ) + RemoveAllObservers(); + RemoveSessions(); + __VTPRINTEXIT( "CRProxy.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::FindItem +// Finds observer item. +// ----------------------------------------------------------------------------- +// +CVtEngCRObserverItem* CVtEngCRProxy::FindItem( + const TUid& aUid, + const TUint32 aKey, + TInt& aIndex ) const + { + TInt count( iObserverItems.Count() ); + CVtEngCRObserverItem* item = NULL; + TBool found( EFalse ); + while ( count-- && !found ) + { + item = iObserverItems[ count ]; + if ( item->Offer( aUid, aKey ) ) + { + aIndex = count; + found = ETrue; + } + } + + // Just NULL the item if not found + if ( !found ) + { + item = NULL; + } + return item; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::FindItem +// Finds observer item. +// ----------------------------------------------------------------------------- +// +CVtEngCRObserverItem* CVtEngCRProxy::FindItem( + const TUint32 aKey, TInt& aIndex ) const + { + TInt count( iObserverItems.Count() ); + CVtEngCRObserverItem* item = NULL; + if ( aIndex < 0 ) + { + return NULL; + } + + for ( ; aIndex < count; aIndex++ ) + { + item = iObserverItems[ aIndex ]; + if ( item->Offer( aKey ) ) + { + break; + } + } + return item; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::RemoveInterested +// Removes a cent rep listener. +// ----------------------------------------------------------------------------- +// +void CVtEngCRProxy::RemoveInterested( CVtEngCRObserverItem& aObserver ) + { + __VTPRINTENTER( "CRProxy.RemoveInterested" ) + TInt index ( 0 ); + CVtEngCRObserverItem* item = FindItem( aObserver.Uid(), + aObserver.Key(), index ); + if ( !item ) + { + // Should not be possible. + __VTPRINTEXITR( "CRProxy.RemoveInterested %d", 0 ) + return; + } + + delete item; + iObserverItems.Remove( index ); + __VTPRINTEXITR( "CRProxy.RemoveInterested %d", 1 ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::NewCRSessionL +// New Central repository-uid pairing. +// ----------------------------------------------------------------------------- +// +CVtEngCRProxy::CCRSession* CVtEngCRProxy::NewCRSessionL( TUid aUid ) + { + __VTPRINTENTER( "CRProxy.NewCRSessionL" ) + CRepository* crSession = CRepository::NewL( aUid ); + CleanupStack::PushL( crSession ); + CCRSession* csSession = new ( ELeave ) CCRSession; + csSession->iSession = crSession; + csSession->iUid = aUid; + CleanupStack::Pop( crSession ); + __VTPRINTEXIT( "CRProxy.NewCRSessionL" ) + return csSession; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::RegisterInterested +// New Central repository listener. +// ----------------------------------------------------------------------------- +// +void CVtEngCRProxy::RegisterInterestedL( CVtEngCRObserverItem* aObserver ) + { + __VTPRINTENTER( "CRProxy.RegisterInterestedL" ) + CRepository* crSession = MapUidToCR( aObserver->Uid() ); + CCRSession* csSession = NULL; + if( !crSession ) + { + csSession = NewCRSessionL( aObserver->Uid() ); + CleanupStack::PushL( csSession ); + crSession = csSession->iSession; + iCRSessions.AppendL( csSession ); + CleanupStack::Pop( csSession ); + } + + CCenRepNotifyHandler* notifier = + CCenRepNotifyHandler::NewL( *aObserver, *crSession, + aObserver->Type(), aObserver->Key() ); + //notifier ownership transfered + aObserver->SetCenRepNotifier( notifier ); + notifier->StartListeningL(); + iObserverItems.AppendL ( aObserver ); + __VTPRINTEXIT( "CRProxy.RegisterInterestedL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::MapUidToCR +// Maps a given UID to a Central repository session. +// ----------------------------------------------------------------------------- +// +CRepository* CVtEngCRProxy::MapUidToCR( const TUid aUid ) + { + __VTPRINTENTER( "CRProxy.Map" ) + CCRSession* csSession = NULL; + TBool found( EFalse ); + TInt count( iCRSessions.Count() ); + for ( TInt i = 0 ; i < count; i++ ) + { + csSession = iCRSessions[ i ]; + if ( csSession->iUid == aUid ) + { + i = count; // break loop + found = ETrue; + } + } + CRepository* session = NULL; + // Only return something when found. + if ( found ) + { + session = csSession->iSession; + } + __VTPRINTEXITR( "CRProxy.Map %d", (TInt) session ) + return session; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::RemoveAllObservers +// All observers off they go. +// ----------------------------------------------------------------------------- +// +void CVtEngCRProxy::RemoveAllObservers() + { + __VTPRINTENTER( "CRProxy.RemoveAll" ) + iObserverItems.ResetAndDestroy(); + iObserverItems.Close(); + __VTPRINTEXIT( "CRProxy.RemoveAll" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::RemoveSessions +// Removes all Central repository sessions. +// ----------------------------------------------------------------------------- +// +void CVtEngCRProxy::RemoveSessions() + { + __VTPRINTENTER( "CRProxy.RemoveAllS" ) + iCRSessions.ResetAndDestroy(); + iCRSessions.Close(); + __VTPRINTEXIT( "CRProxy.RemoveAllS" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::GetSession +// Gets an existing or a new Central repository session for a UID. +// ----------------------------------------------------------------------------- +// +TInt CVtEngCRProxy::GetSessionL( const TUid aUid, CRepository*& crSession ) + { + TInt err( KErrNone ); + crSession = MapUidToCR( aUid ); + if ( !crSession ) + { + CCRSession* session = NULL; + session = NewCRSessionL( aUid ); + if ( session ) + { + CleanupStack::PushL( session ); + iCRSessions.AppendL( session ); + CleanupStack::Pop( session ); + crSession = session->iSession; + } + else + { + err = KErrNotFound; + } + } + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::Get +// Gets integer value. +// ----------------------------------------------------------------------------- +// +TInt CVtEngCRProxy::Get( const TUid aUid, const TUint32 aId, TInt& aVal ) + { + __VTPRINTENTER( "CRProxy.GetInt" ) + __VTPRINT3( DEBUG_GEN, "UID=%d,key=%d", aUid.iUid, (TInt) aId ); + + CRepository* crSession = NULL; + TRAPD( err, GetSessionL( aUid, crSession ) ); + if ( err == KErrNone ) + { + err = crSession->Get( aId, aVal ); + } + __VTPRINTEXITR( "CRProxy.GetInt %d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::Get +// Gets real value. +// ----------------------------------------------------------------------------- +// +TInt CVtEngCRProxy::Get( const TUid aUid, const TUint32 aId, TReal& aVal ) + { + __VTPRINTENTER( "CRProxy.GetReal" ) + __VTPRINT3( DEBUG_GEN, "UID=%d,key=%d", aUid.iUid, (TInt) aId ); + CRepository* crSession = NULL; + TRAPD( err, GetSessionL( aUid, crSession ) ); + if ( err == KErrNone ) + { + err = crSession->Get( aId, aVal ); + } + __VTPRINTEXITR( "CRProxy.GetR %d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::Get +// Gets binary value. +// ----------------------------------------------------------------------------- +// +TInt CVtEngCRProxy::Get( const TUid aUid, const TUint32 aId, TDes8& aVal ) + { + __VTPRINTENTER( "CRProxy.GetD8" ) + __VTPRINT3( DEBUG_GEN, "UID=%d,key=%d", aUid.iUid, (TInt) aId ); + CRepository* crSession = NULL; + TRAPD( err, GetSessionL( aUid, crSession ) ); + if ( err == KErrNone ) + { + err = crSession->Get( aId, aVal ); + } + __VTPRINTEXITR( "CRProxy.GetD8 %d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::Get +// Gets string value. +// ----------------------------------------------------------------------------- +// +TInt CVtEngCRProxy::Get( const TUid aUid, const TUint32 aId, TDes16& aVal ) + { + __VTPRINTENTER( "CRProxy.GetD16" ) + __VTPRINT3( DEBUG_GEN, "UID=%d,key=%d", aUid.iUid, (TInt) aId ); + CRepository* crSession = NULL; + TRAPD( err, GetSessionL( aUid, crSession ) ); + if ( err == KErrNone ) + { + err = crSession->Get( aId, aVal ); + } + __VTPRINTEXITR( "CRProxy.GetD16 %d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::Set +// Sets integer value to Central Repository. +// ----------------------------------------------------------------------------- +// +TInt CVtEngCRProxy::Set( const TUid aUid, const TUint32 aId, TInt aVal ) + { + __VTPRINTENTER( "CRProxy.SetInt" ) + CRepository* crSession = NULL; + TRAPD( err, GetSessionL( aUid, crSession ) ); + if ( err == KErrNone ) + { + err = crSession->Set( aId, aVal ); + } + __VTPRINTEXITR( "CRProxy.SetInt %d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::Set +// Sets real value to Central Repository. +// ----------------------------------------------------------------------------- +// +TInt CVtEngCRProxy::Set( const TUid aUid, const TUint32 aId, const TReal& aVal ) + { + __VTPRINTENTER( "CRProxy.SetR" ) + CRepository* crSession = NULL; + TRAPD( err, GetSessionL( aUid, crSession ) ); + if ( err == KErrNone ) + { + err = crSession->Set( aId, aVal ); + } + __VTPRINTEXITR( "CRProxy.SetR %d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::Set +// Sets binary value to Central Repository. +// ----------------------------------------------------------------------------- +// +TInt CVtEngCRProxy::Set( const TUid aUid, const TUint32 aId, const TDesC8& aVal ) + { + __VTPRINTENTER( "CRProxy.SetD8" ) + CRepository* crSession = NULL; + TRAPD( err, GetSessionL( aUid, crSession ) ); + if ( err == KErrNone ) + { + err = crSession->Set( aId, aVal ); + } + __VTPRINTEXITR( "CRProxy.SetD8 %d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::Set +// Sets string value to Central Repository. +// ----------------------------------------------------------------------------- +// +TInt CVtEngCRProxy::Set( + const TUid aUid, const TUint32 aId, const TDesC16& aVal ) + { + __VTPRINTENTER( "CRProxy.SetD16" ) + CRepository* crSession = NULL; + TRAPD( err, GetSessionL( aUid, crSession ) ); + if ( err == KErrNone ) + { + err = crSession->Set( aId, aVal ); + } + __VTPRINTEXITR( "CRProxy.SetD16 %d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::CCRSession::~CCRSession +// Destructor. +// ----------------------------------------------------------------------------- +// +CVtEngCRProxy::CCRSession::~CCRSession() + { + __VTPRINTENTER( "CRProxy.~" ) + delete iSession; + __VTPRINTEXIT( "CRProxy.~" ) + } + +// end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Base/CVtEngDeviceLockMonitor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Base/CVtEngDeviceLockMonitor.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,120 @@ +/* +* 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: Monitors device lock state +* +*/ + + + +// INCLUDE FILES +#include "CVtEngDeviceLockMonitor.h" +#include "CVTEngPubSubsListener.h" +#include "CVtEngEventManager.h" +#include "cvtlogger.h" + +#include + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngDeviceLockMonitor::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtEngDeviceLockMonitor* CVtEngDeviceLockMonitor::NewL() + { + CVtEngDeviceLockMonitor* self = new ( ELeave ) CVtEngDeviceLockMonitor(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// Destructor +CVtEngDeviceLockMonitor::~CVtEngDeviceLockMonitor() + { + delete iAutolockListener; + } + +// ----------------------------------------------------------------------------- +// CVtEngDeviceLockMonitor::NotifyState +// Notifies UI about device lock state +// ----------------------------------------------------------------------------- +// +void CVtEngDeviceLockMonitor::NotifyState() const + { + __VTPRINTENTER( "LockMonitor.NotifyState" ) + + TInt state = EAutolockStatusUninitialized; + + // Get autolock state + TInt err = iAutolockListener->Get( state ); + + __VTPRINT2( DEBUG_GEN, "LockMonitor Get err: %d", err ); + __VTPRINT2( DEBUG_GEN, "LockMonitor state: %d", state ); + + if( err == KErrNone ) + { + const TInt event = + ( state <= EAutolockOff ) ? + KVtEngDeviceLockOff : KVtEngDeviceLockOn; + CVtEngEventManager::NotifyEvent( event ); + } + + __VTPRINTEXIT( "LockMonitor.NotifyState" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDeviceLockMonitor::HandleNotifyPSL +// Callback for autolock state change +// ----------------------------------------------------------------------------- +// +void CVtEngDeviceLockMonitor::HandleNotifyPSL( + const TUid aUid, + const TInt& aKey, + const TRequestStatus& aStatus ) + { + if ( aStatus == KErrNone && + aUid == KPSUidCoreApplicationUIs && + aKey == KCoreAppUIsAutolockStatus ) + { + NotifyState(); + } + } + +// ----------------------------------------------------------------------------- +// CVtEngDeviceLockMonitor::CVtEngDeviceLockMonitor +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngDeviceLockMonitor::CVtEngDeviceLockMonitor() + { + } + +// ----------------------------------------------------------------------------- +// CVtEngDeviceLockMonitor::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVtEngDeviceLockMonitor::ConstructL() + { + __VTPRINTENTER( "LockMonitor.ConstructL" ) + // Listener for autolock state + iAutolockListener = CVtEngPubSubsListener::NewL( + KPSUidCoreApplicationUIs, KCoreAppUIsAutolockStatus, this ); + __VTPRINTEXIT( "LockMonitor.ConstructL" ) + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Base/CVtEngEventManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Base/CVtEngEventManager.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,271 @@ +/* +* 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: Event manager implementation. +* +*/ + + + +// INCLUDE FILES +#include "CVtEngEventManager.h" +#include "MVtEngEventObserver.h" +#include "VtEngUtils.h" +#include "VtEngEvents.h" +#include "VtEngPanic.h" +#include + +// CONSTANTS +const TInt KMaxEventsInQueue = 8; + +// max amount of simultanous event observers +const TInt KMaxVtEventObservers = 2; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngEventManager::CVtEngEventManager +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngEventManager::CVtEngEventManager() : CActive( CActive::EPriorityHigh ), + iObservers( KMaxVtEventObservers ) + { + CActiveScheduler::Add( this ); + } + + +// ----------------------------------------------------------------------------- +// CVtEngEventManager::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtEngEventManager* CVtEngEventManager::NewL( + MVtEngEventObserver& aEventObserver ) + { + CVtEngEventManager* self = + new ( ELeave ) CVtEngEventManager(); + CleanupStack::PushL( self ); + self->ConstructL( aEventObserver ); + CleanupStack::Pop(); // self + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngEventManager::ConstructL +// 2nd phase constructor. +// ----------------------------------------------------------------------------- +// +void CVtEngEventManager::ConstructL( MVtEngEventObserver& aEventObserver ) + { + iEventQueue = new ( ELeave ) CArrayFixFlat< TInt >( KMaxEventsInQueue ); + iEventQueue->SetReserveL( KMaxEventsInQueue ); + iObservers.Append( &aEventObserver ); + } + +// Destructor +CVtEngEventManager::~CVtEngEventManager() + { + Cancel(); + delete iEventQueue; + iObservers.Close(); + } + +// ----------------------------------------------------------------------------- +// CVtEngEventManager::SessionStateChangedL +// Notifies session state change to UI. +// ----------------------------------------------------------------------------- +// +void CVtEngEventManager::SessionStateChanged() + { + __VTPRINTENTER( "EventManager.SessionStateChanged" ) + NotifyEvent( KVtEngSessionStateChanged ); + __VTPRINTEXIT( "EventManager.SessionStateChanged" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngEventManager::NotifyEvent +// ----------------------------------------------------------------------------- +// +void CVtEngEventManager::NotifyEvent( const TInt aEvent ) + { + __VTPRINTENTER( "EventManager.NotifyEvent" ) + __VTPRINT2( DEBUG_GEN, "EventManager.NotifyEvent event=%d", aEvent ); + CVtEngEventManager& eventManager = + CVtEngUtility::EventManager(); + if ( !eventManager.QueueAsyncEvent( aEvent ) ) + { + eventManager.DoNotifyEvent( aEvent ); + } + __VTPRINTEXIT( "EventManager.NotifyEvent" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngEventManager::AddObserverL +// +// ----------------------------------------------------------------------------- +// +void CVtEngEventManager::AddObserverL( MVtEngEventObserver* aObserver ) + { + TInt count( iObservers.Count() ); + TBool duplicate = EFalse; + while ( count-- ) + { + if ( aObserver == iObservers[ count ] ) + { + count = 0; // break loop + duplicate = ETrue; + } + } + if ( !duplicate ) + { + User::LeaveIfError( iObservers.Append( aObserver ) ); + } + } + +// ----------------------------------------------------------------------------- +// CVtEngEventManager::RemoveObserver +// +// ----------------------------------------------------------------------------- +// +void CVtEngEventManager::RemoveObserver( const MVtEngEventObserver* aObserver ) + { + TInt count( iObservers.Count() ); + while ( count-- ) + { + if ( aObserver == iObservers[ count ] ) + { + iObservers.Remove( count ); + count = 0; // break loop + } + } + } + +// ----------------------------------------------------------------------------- +// CVtEngEventManager::RunL +// Notify event +// ----------------------------------------------------------------------------- +// +void CVtEngEventManager::RunL() + { + __VTPRINTENTER( "EventManager.RunL" ) + __VTPRINT2( DEBUG_GEN, "EventManager.RunL count=%d", iEventQueue->Count() ); + // get oldest event in queue (event at index 0) + const TInt event = iEventQueue->At( 0 ) ; + + // delete event before calling DoNotifyEvent(), because DoNotifyEvent() may + // hang if it causes ASynchronous call in handler + iEventQueue->Delete( 0 ); + + // if more events pending -> signal again + if( iEventQueue->Count() > 0 ) + { + Signal(); + } + + // and finally notify event + DoNotifyEvent( event ); + __VTPRINTEXIT( "EventManager.RunL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngEventManager::DoCancel +// No op +// ----------------------------------------------------------------------------- +// +void CVtEngEventManager::DoCancel() + { + } + +// ----------------------------------------------------------------------------- +// CVtEngEventManager::DoNotifyEvent +// ----------------------------------------------------------------------------- +// +void CVtEngEventManager::DoNotifyEvent( const TInt aEvent ) + { + __VTPRINTENTER( "EventManager.DoNotifyEvent" ) + __VTPRINT2( DEBUG_GEN, "EventManager.DoNotifyEvent event=%d", aEvent ); + TRAP_IGNORE( { + TInt count( iObservers.Count() ); + while ( count-- ) + { + iObservers[count]->HandleVtEventL( aEvent ) ; + } + } ) + __VTPRINTEXIT( "EventManager.DoNotifyEvent" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngEventManager::QueueAsyncEvent +// ----------------------------------------------------------------------------- +// +TBool CVtEngEventManager::QueueAsyncEvent( const TInt aEvent ) + { + __VTPRINTENTER( "EventManager.QueueAsyncEvent" ) + __VTPRINT2( DEBUG_GEN, "EventManager.QueueAsyncEvent event=%d", aEvent ); + TBool async( EFalse ); + switch ( aEvent ) + { + case KVtEngSessionStateChanged: + case KVtEngNegotiationProblem: + case KVtEngShareImageInitializeBegin: + case KVtEngShareImageInitializeEnd: + async = ETrue; + QueueAndSignal( aEvent ); + break; + default: + break; + } + __VTPRINTEXIT( "EventManager.QueueAsyncEvent" ) + return async; + } + +// ----------------------------------------------------------------------------- +// CVtEngEventManager::QueueAndSignal +// ----------------------------------------------------------------------------- +// +void CVtEngEventManager::QueueAndSignal( const TInt aEvent ) + { + __VTPRINTENTER( "EventManager.QueueAndSignal" ) + __VTPRINT2( DEBUG_GEN, "EventManager.QueueAndSignal event=%d", aEvent ); + if( iEventQueue->Count() < KMaxEventsInQueue ) + { + TRAP_IGNORE( iEventQueue->AppendL( aEvent ) ); // can't leave + Signal(); + } + else + { + Panic( EVtEngPanicInvalidTooManyPendingEvents ); + } + __VTPRINTEXIT( "EventManager.QueueAndSignal" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngEventManager::Signal +// ----------------------------------------------------------------------------- +// +void CVtEngEventManager::Signal() + { + __VTPRINTENTER( "EventManager.Signal" ) + if( !IsActive() ) + { + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + __VTPRINT2( DEBUG_GEN, "EventManager.QueueAndSignal count=%d", iEventQueue->Count() ); + } + __VTPRINTEXIT( "EventManager.Signal" ) + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Base/CVtEngHandlerContainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Base/CVtEngHandlerContainer.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,99 @@ +/* +* 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: Container for functional handlers in the engine. +* +*/ + + + +// INCLUDE FILES +#include "CVtEngHandlerContainer.h" +#include + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngHandlerContainer::Uninitialize +// Uninitialises handlers. +// ----------------------------------------------------------------------------- +// +void CVtEngHandlerContainer::Uninitialize() + { + iSession->Uninitialize(); + } + +// ----------------------------------------------------------------------------- +// CVtEngHandlerContainer::CVtEngHandlerContainer +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngHandlerContainer::CVtEngHandlerContainer() + { + } + +// ----------------------------------------------------------------------------- +// CVtEngHandlerContainer::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVtEngHandlerContainer::ConstructL( ) + { + iMedia = CVtEngMediaHandler::NewL( ); + iSession = CVtEngSessionHandler::NewL( ); + iAudio = CVtEngAudioHandler::NewL( ); + + } + +void CVtEngHandlerContainer::CreateDtmfHandlerL( + MVtH324ConfigCommand* aH324Config ) + { + __VTPRINTENTER( "HlrCnr.CreateDtmfHandlerL" ) + iDtmf = CVtEngDtmfHandler::NewL( *aH324Config ); + __VTPRINTEXIT( "HlrCnr.CreateDtmfHandlerL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngHandlerContainer::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtEngHandlerContainer* CVtEngHandlerContainer::NewL( ) + { + __VTPRINTENTER( "HlrCnr.NewL" ) + + CVtEngHandlerContainer* self = new( ELeave ) CVtEngHandlerContainer; + + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop(); + __VTPRINTEXIT( "HlrCnr.NewL" ) + return self; + } + + +// Destructor +CVtEngHandlerContainer::~CVtEngHandlerContainer() + { + __VTPRINTENTER( "HlrCnr.~" ) + + delete iMedia; + delete iSession; + delete iAudio; + delete iDtmf; + + __VTPRINTEXIT( "HlrCnr.~" ) + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Base/CVtEngInitializer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Base/CVtEngInitializer.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,687 @@ +/* +* Copyright (c) 2004 - 2008 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: Implementation class for initializing the engine gradually. +* Active object initializes one "subsystem" on each +* round. In case of failure timer is started and +* retrial is done after time-out. Uninitialization +* is done is one shot. + + + + +* +*/ + + +// INCLUDE FILES +#include "CVtEngInitializer.h" +#include "CVtEngStateManager.h" +#include "CVtEngEventManager.h" +#include "VtEngUtils.h" +#include "CVtEngHandlerContainer.h" +#include "CVtEngOperation.h" +#include "VtEngPanic.h" +#include "VtEngConstants.h" +#include "VtEngDefs.hrh" +#include +#include +#include +#include +#include "VtEngUtils.h" +#include "CVtEngSettings.h" + +// CONSTANTS +const TInt KVtEngInitializerPriority = CActive::EPriorityStandard; +const TInt KVtEngInitializerRetrials = 3; +const TInt KVtEngInitializerRetrialTimeout = 500000; // 0.5 seconds +const TInt KVtEngInitializerTimerPriority = CActive::EPriorityUserInput; + +_LIT( KVtEngCommDiagPortName, "PVDIAGPORT" ); +_LIT( KVtEngCommTestPortName, "COMM::0" ); + +// ============================ MEMBER FUNCTIONS =============================== + +CVtEngInitializer* CVtEngInitializer::NewL( CVtEngHandlerContainer& aHandlers ) + { + __VTPRINTENTER( "Intlzr.NewL" ) + CVtEngInitializer* self = new ( ELeave ) CVtEngInitializer( aHandlers ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + __VTPRINTEXIT( "Intlzr.NewL" ) + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngInitializer::CVtEngInitializer +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngInitializer::CVtEngInitializer( + CVtEngHandlerContainer& aHandlers ) : + CActive( KVtEngInitializerPriority ), + iHandlers( aHandlers ), + iStep( EInitNone ), + iDataportHandled( 0 ), + iOwnershipInMH( EFalse ) + { + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CVtEngInitializer::ConstructL +// Second phase constructor. +// +// ----------------------------------------------------------------------------- +// +void CVtEngInitializer::ConstructL() + { + iTimer = CPeriodic::NewL( KVtEngInitializerTimerPriority ); + + } + +// Destructor +CVtEngInitializer::~CVtEngInitializer() + { + __VTPRINTENTER( "Intlzr.~" ) + delete iTimer; + Cancel(); + + if ( iSessionCommand && !iOwnershipInMH ) + { + VTProtocolFactory::DeleteSessionCommand( iSessionCommand ); + iSessionCommand = NULL; + } + __VTPRINTEXIT( "Intlzr.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngInitializer::InitializeL +// Start initialization process. +// +// ----------------------------------------------------------------------------- +// +void CVtEngInitializer::InitializeL( CVtEngOperation& aCallback ) + { + __VTPRINTENTER( "Intlzr.InitializeL" ) + __VTPRINT( DEBUG_GEN, "Intlzr.Init") + __ASSERT_ALWAYS( iStep != EInitComplete, + Panic( EVtEngPanicInvalidInitializationEntry ) ); + iCallback = &aCallback; + if ( iStep == EInitComplete ) + { + __VTPRINTEXIT( "Intlzr.InitializeL" ) + return; + } + ContinueOrRetry( EContinue ); + __VTPRINTEXIT( "Intlzr.InitializeL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngInitializer::CancelInit +// Cancels already started ini. +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngInitializer::CancelInit() + { + __VTPRINTENTER( "Intlzr.CancelInit" ) + TBool cancelSignalled = EFalse; + __VTPRINT2( DEBUG_GEN, "Intlzr.CancelInit %d", iStep ) + if ( IsActive() ) + { + switch ( iStep ) + { + case EInitMedia: // media->InitializeL pending + case EInitProto: // media->InitializeProviderL pending + { + if ( ! ( iDataportHandled & EDataportReceived ) ) + { + __VTPRINT( DEBUG_GEN, "Intlzr.CancelInit complete" ) + if ( iStatus == KRequestPending ) + { + // Actual protocol init is not done yet. + TRequestStatus* status = &iStatus; + __VTPRINT( DEBUG_GEN, "Intlzr.CancelInit complete1" ) + User::RequestComplete( status, KErrNone ); + __VTPRINT( DEBUG_GEN, "Intlzr.CancelInit complete2" ) + } + iDataportHandled |= EDataportReceived; + __VTPRINT( DEBUG_GEN, "Intlzr.CancelInit complete" ) + } + __VTPRINT( DEBUG_GEN, "Intlzr.CancelInit MH cancel" ) + CVtEngMediaHandler* media = + static_cast( &iHandlers.Media() ); + media->CancelInitialize(); + iStep = EResetMediaPhase2; + } + break; + case EResetMedia: + break; + default: + cancelSignalled = ETrue; + Cancel(); + } + } + __VTPRINTEXITR( "Intlzr.CancelInit %d", cancelSignalled ) + return cancelSignalled; + } + +// ----------------------------------------------------------------------------- +// CVtEngInitializer::Uninitialize +// Start un-initialization process. +// +// ----------------------------------------------------------------------------- +// +void CVtEngInitializer::Uninitialize( CVtEngOperation& aCallback ) + { + __VTPRINTENTER( "Intlzr.Uninitialize" ) + iCallback = &aCallback; + ContinueOrRetry( EReset ); + __VTPRINTEXIT( "Intlzr.Uninitialize" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngInitializer::GetSessionCommand +// Transfer ownership of Protocol and continue initialization. +// +// ----------------------------------------------------------------------------- +// +MVtSessionCommand* CVtEngInitializer::GetSessionCommand() + { + __VTPRINTENTER( "Intlzr.GetSessionCommand" ) + __VTPRINT2( DEBUG_GEN | DEBUG_DETAIL, "Intlzr.GetSessionCommand iSessionCommand: $%x", reinterpret_cast< TUint >( iSessionCommand ) ) + MVtSessionCommand* sessionCommand = iSessionCommand; + + // Set ownership to media handler since media handler is requesting so. + iOwnershipInMH = ETrue; + if( iStep >= EInitDataportCompleted ) + { + // Ownership can be totally given to MH after dataport is loaned. + __VTPRINT( DEBUG_GEN | DEBUG_DETAIL, "Intlzr.GetSessionCommand iSessionCommand ownership to MH GetSessionCommand") + + iSessionCommand = NULL; + iStep = EInitComplete; + ContinueOrRetry( EContinue ); + } + if ( iStep != EResetMedia ) + { + __VTPRINT( DEBUG_GEN, "Intlzr.GetSessionCommand=>ContinueOrRetry( EContinue )") + ContinueOrRetry( EContinue ); + } + else + { + // Reset requested. ContinueOrRetry with EReset was called + // while protocol Init was ongoing. Now continue + __VTPRINT( DEBUG_GEN, "Intlzr.GetSessionCommand=>ContinueOrRetry( EReset )") + ContinueOrRetry( EReset ); + } + __VTPRINTEXIT( "Intlzr.GetSessionCommand" ) + return sessionCommand; + } + +// ----------------------------------------------------------------------------- +// CVtEngInitializer::Initialized +// Returns if engine is initialized. +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngInitializer::Initialized() const + { + return ( iStep == EInitComplete ); + } + +// ----------------------------------------------------------------------------- +// CVtEngInitializer::RunL +// Perform initialization step +// +// ----------------------------------------------------------------------------- +// +void CVtEngInitializer::RunL() + { + __VTPRINTENTER( "Intlzr.RunL" ) + __VTPRINT3( DEBUG_GEN | DEBUG_DETAIL, "Intlzr.Run step=%d err=%d", + iStep, iStatus.Int() ) + if ( iStatus != KErrNone ) + { + Notify( iStatus.Int() ); + __VTPRINTEXIT( "Intlzr.RunL" ) + return; + } + CVtEngMediaHandler* media = + static_cast( &iHandlers.Media() ); + + switch ( iStep ) + { + case EInitNone: + return; + case EInitMedia: + // Initialize video source + iStatus = KRequestPending; + media->InitializeL( iStatus ); + SetActive(); + iStep++; // EInitProto + __VTPRINTEXIT( "Intlzr.RunL" ) + return; + case EInitProto: + // Initialize Protocol => create terminal only once. + __VTPRINT( DEBUG_GEN | DEBUG_DETAIL, "Intlzr.Run create Protocol") + if ( !iSessionCommand ) + { + __VTPRINT( DEBUG_GEN | DEBUG_DETAIL, "Intlzr.Run DOCREATE Protocol" ) + TVt3G324MSupported protocolSupported; + iSessionCommand = VTProtocolFactory::CreateSessionCommandL( + media, ETrue, protocolSupported ); + + if (protocolSupported == EVt3G324MMissing) + { + __VTPRINT( DEBUG_GEN | DEBUG_DETAIL, "Intlzr.Run init 3G324M stack is missing") + Notify(KErrNotReady); + return; + } + + // Initialize Protocol immediately after it is created. + if( iSessionCommand ) + { + __VTPRINT( DEBUG_GEN | DEBUG_DETAIL, "Intlzr.Run InitL protocol") + iSessionCommand->InitProtocolL( media->SdkInitInfo() ); + } + } + if ( iSessionCommand ) + { + const TDesC* dataportName = NULL; + __VTPRINT( DEBUG_GEN | DEBUG_DETAIL, "Intlzr.Run init protocol") + if(iCallback->Command() == KVtEngInitializeEngineTest ) + { + __VTPRINT( DEBUG_GEN | DEBUG_DETAIL, + "Intlzr.Run init with COMM::0") + CVtEngUtility::Settings().SetConnectReady(); + iComms = VTProtocolFactory::CreateCommServerL( + KVtEngCommTestPortName ); + } + else if( iCallback->Command() == KVtEngInitializeEngineDiag ) + { + __VTPRINT( DEBUG_GEN | DEBUG_DETAIL, + "Intlzr.Run init with PVDIAGPORT") + CVtEngUtility::Settings().SetConnectReady(); + iComms = VTProtocolFactory::CreateCommServerL( + KVtEngCommDiagPortName ); + } + else + { // [MediatorChange]: + __VTPRINT( DEBUG_GEN | DEBUG_DETAIL, + "Intlzr.Run init with DATAPORT" ) + dataportName = + CVtEngUtility::Settings().DataportInfo(); + if ( !dataportName ) + { + // not available yet, start waiting, + // HandleSettingChangedL is called when dataport + // becomes available + __VTPRINT( DEBUG_GEN | DEBUG_DETAIL, + "Intlzr.Run DATAPORT is not ready yet" ) + + CVtEngUtility::Settings().NotifyChangeL( + CVtEngSettings::EDataportInfo, *this ); + iStatus = KRequestPending; + SetActive(); + __VTPRINTEXIT( "Intlzr.RunL" ) + return; + } + else + { + //RDebug::Print( _L("DataportName is:%S"), dataportName ); + TBool bitReversed( BitReversalUsed() ); + + iComms = VTProtocolFactory::CreateCommServerL( + *dataportName, bitReversed ); + // not interested of DP info any more + CVtEngUtility::Settings().CancelNotifyChange( + CVtEngSettings::EDataportInfo, *this ); + } + } + + // Initialization is now completed + iStep = EInitDataportCompleted; + + // Dataport is now loaned + CVtEngUtility::Settings().SetDataportLoaned( ETrue ); + + // Update states since dataport is now loaned + CVtEngStateManager* states = CVtEngUtility::StateManager(); + states->Update(); + + // No need for ownership anymore, media handler owns the pointer and is + // responsible of deletion. + if( iOwnershipInMH ) + { + __VTPRINT( DEBUG_GEN | DEBUG_DETAIL, "Intlzr.Run iSessionCommand ownership to MH") + iSessionCommand = NULL; + iStep = EInitComplete; + ContinueOrRetry( EContinue ); + } + + __VTPRINT( DEBUG_GEN | DEBUG_DETAIL, + "Intlzr.Run init protocol port operation completed") + // Media handler calls GetSessionCommand when InitL + // is complete and initialization continues. + __VTPRINTEXIT( "Intlzr.RunL" ) + return; + } + break; + case EInitSession: + { + CVtEngSessionHandler* session = + static_cast( &iHandlers.Session() ); + session->InitializeL(); + __VTPRINT( DEBUG_GEN | DEBUG_DETAIL, + "Intlzr.RunL StartMediatorListenerL" ) + CVtEngUtility::EngineUtils()->StartMediatorListenerL(); + } + break; + case EResetMedia: + iHandlers.Uninitialize(); + iStatus = KRequestPending; + media->Uninitialize( iStatus ); + SetActive(); + iStep++; // EResetMediaPhase2 + __VTPRINT( DEBUG_GEN | DEBUG_DETAIL, + "Intlzr.RunL step reset media started" ) + __VTPRINTEXIT( "Intlzr.RunL" ) + return; + case EResetMediaPhase2: + if ( iComms ) + { + __VTPRINT( DEBUG_GEN | DEBUG_DETAIL, + "Intlzr.RunL VTENgine deletes COMM server" ) + CVtEngMediaHandler* media = + static_cast( &iHandlers.Media() ); + if ( media->ProtoInitialized() ) + { + TRAPD( err, VTProtocolFactory::DeleteCommServerL( iComms ) ); + __VTPRINT2( DEBUG_GEN | DEBUG_DETAIL, + "Intlzr.RunL VTENgine deletes COMM server err=%d", err ) + __ASSERT_ALWAYS( err == KErrNone, + Panic( EVtEngPanicCommsDestructOnInvalidState ) ); + iComms = NULL; + } + else if ( !media->ProtoInitialized() && iSessionCommand ) + { + __VTPRINTEXIT( "Intlzr.RunL" ) + return; + } + } + break; + case EInitComplete: + break; + default: + Panic( EVtEngPanicInvalidInitializationState ); + break; + } + ContinueOrRetry( EContinue ); + __VTPRINTEXIT( "Intlzr.RunL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngInitializer::DoCancel +// Cancels initialization +// +// ----------------------------------------------------------------------------- +// +void CVtEngInitializer::DoCancel() + { + __VTPRINTENTER( "Intlzr.DoCancel" ) + if ( iStatus == KRequestPending ) + { + __VTPRINT2( DEBUG_GEN | DEBUG_DETAIL, "Intlzr.DoCancel step=%d", iStep ) + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrCancel ); + } + iStep = EInitNone; + iCallback = NULL; + __VTPRINTEXIT( "Intlzr.DoCancel" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngInitializer::RunError +// Handler error on initialization. +// +// ----------------------------------------------------------------------------- +// +TInt CVtEngInitializer::RunError( TInt aError ) + { + __VTPRINTENTER( "Intlzr.RunError" ) + __VTPRINT2( DEBUG_GEN, "Intlzr.RunError %d", aError ) + if ( iRetrials ) + { + __VTPRINT2( DEBUG_GEN | DEBUG_DETAIL, "Intlzr.retrials %d", iRetrials ) + TCallBack callback( CVtEngInitializer::HandleTimer, this ); + iTimer->Start( + KVtEngInitializerRetrialTimeout, + KVtEngInitializerRetrialTimeout, + callback ); + } + else + { + Notify( aError ); + } + __VTPRINTEXIT( "Intlzr.RunError" ) + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngInitializer::HandleTimer +// Handler for retrial timer. +// +// ----------------------------------------------------------------------------- +// +TInt CVtEngInitializer::HandleTimer( TAny* aAny ) + { + CVtEngInitializer* handler = + reinterpret_cast( aAny ); + handler->DoHandleTimer(); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngInitializer::DoHandleTimer +// Handler for retrial timer. +// +// ----------------------------------------------------------------------------- +// +void CVtEngInitializer::DoHandleTimer() + { + iTimer->Cancel(); + ContinueOrRetry( ERetry ); + } + +TBool CVtEngInitializer::ActivateAndSignal( TInt aSignalValue ) + { + __VTPRINTENTER( "Intlzr.ActivateAndSignal" ) + TRequestStatus* status = &iStatus; + TBool signaled = EFalse; + if ( iStatus.Int() != KRequestPending && !IsActive() ) + { + iStatus = KRequestPending; + SetActive(); + User::RequestComplete( status, aSignalValue ); + signaled = ETrue; + } + __VTPRINTEXITR( "Intlzr.ActivateAndSignal signaled=%d", signaled ) + return signaled; + } + +// ----------------------------------------------------------------------------- +// CVtEngInitializer::CreateDtmfHandlerL +// Creates handler for DTMF sending. +// +// ----------------------------------------------------------------------------- +// +void CVtEngInitializer::CreateDtmfHandlerL( MVtH324ConfigCommand* aH324Config ) + { + iHandlers.CreateDtmfHandlerL( aH324Config ); + } + +// ----------------------------------------------------------------------------- +// CVtEngInitializer::ContinueOrRetry +// Proceed to next step, retry on failure or notify observer. +// +// ----------------------------------------------------------------------------- +// +void CVtEngInitializer::ContinueOrRetry( const TProcess aOperation ) + { + __VTPRINTENTER( "Intlzr.ContinueOrRetry" ) + __VTPRINT2( DEBUG_GEN, "Intlzr.CoR op=%d", aOperation ) + if ( aOperation == EContinue ) + { + const TBool resetComplete( iStep == EResetMediaPhase2 ); + // check if last step complete and notify observer + if ( iStep == EInitComplete || resetComplete ) + { + if ( resetComplete && + // resetComplete is true also when clearing state is entered + // while waiting for dataport. In that case Final Uninit must + // not be done because MediaHandler's state is not ready for + // it => need to wait for KVtEngResetEngine from UI + iCallback->Command() == KVtEngResetEngine ) + { + CVtEngMediaHandler* media = + static_cast( &iHandlers.Media() ); + media->FinalizeUninitialization(); + iStep = EInitNone; + } + Notify( KErrNone ); + __VTPRINT2( DEBUG_GEN, "Intlzr.CoR op=EContinue, branch=%d", 1 ) + return; + } + else if( iStep == EInitProto ) + { + __VTPRINT2( DEBUG_GEN, "Intlzr.CoR op=EContinue, branch=%d", 2 ) + return; + } + __VTPRINT2( DEBUG_GEN, "Intlzr.CoR op=EContinue, branch=%d", 3 ) + iStep++; + iRetrials = KVtEngInitializerRetrials; + } + else if ( aOperation == EReset ) + { + __VTPRINT( DEBUG_GEN, "Intlzr.CoR op=EReset") + iRetrials = KVtEngInitializerRetrials; + const TInt step( iStep ); + if ( step != EInitComplete && IsActive() ) + { + // Reset requested while init ongoing but + // Protocol InitL not yet issued + if ( CancelInit() == EFalse ) + { // AO still active, must return here because end of this method + __VTPRINT( DEBUG_GEN, " Initializer CoR 2") + __VTPRINTEXIT( "Intlzr.ContinueOrRetry" ) + return; + } + } + iStep = EResetMedia; + if ( ( step == EInitProto || + step == EInitSession ) && !IsActive() ) + { + // Protocol InitL is pending. Wait until it completes. + // GetSessionCommand is called and there we this is + // again called. + __VTPRINT( DEBUG_GEN, " Initializer reset while InitL") + __VTPRINTEXIT( "Intlzr.ContinueOrRetry" ) + return; + } + } + else + { + iRetrials--; + } + ActivateAndSignal( KErrNone ); + __VTPRINTEXIT( "Intlzr.ContinueOrRetry" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngInitializer::Notify +// Notifies observer on completion or error. +// +// ----------------------------------------------------------------------------- +// +void CVtEngInitializer::Notify( const TInt aResult ) + { + __VTPRINTENTER( "Intlzr.Notify" ) + if ( iStep == EInitComplete ) + { + CVtEngStateManager* states = CVtEngUtility::StateManager(); + states->Update(); + } + + if ( iCallback ) + { + if ( aResult != KErrCancel ) + { // UI is not interested on cancel completion + iCallback->HandleOpComplete( aResult ); + } + iCallback = NULL; + __VTPRINT2( DEBUG_GEN, "Intlzr.Notify res=%d", aResult ) + } + __VTPRINTEXIT( "Intlzr.Notify" ) + } + + +// ----------------------------------------------------------------------------- +// CVtEngInitializer::BitReversalUsed +// Checks if bit reversal should be used from locally variated information. +// ----------------------------------------------------------------------------- +// +TBool CVtEngInitializer::BitReversalUsed() + { + __VTPRINT( DEBUG_GEN, "Intlzr.BitReversalUsed" ) + return CVtEngUtility::Settings().CheckBits( + KVTLVFlagEnableBitReversal ); + } + +// ----------------------------------------------------------------------------- +// CVtEngInitializer::HandleSettingChangedL +// Notification of received dataport name. +// ----------------------------------------------------------------------------- +// +void CVtEngInitializer::HandleSettingChangedL( + CVtEngSettings::TSettingId aId, + const TDesC& /*aValue*/ ) + { + __VTPRINTENTER( "Intlzr.HandleSettingChangedL" ) + if ( !( iDataportHandled & EDataportReceived ) && + aId == CVtEngSettings::EDataportInfo && + iStatus == KRequestPending ) + + { + iDataportHandled |= EDataportReceived; + //dataport will be fetched in runl, otherwise, cancelinit can not work + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + } + __VTPRINTEXIT( "Intlzr.HandleSettingChangedL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngInitializer::GetVtComms +// Return pointer to communication port. +// ----------------------------------------------------------------------------- +// +MCommServer* CVtEngInitializer::GetVtComms() + { + return iComms; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Base/CVtEngModel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Base/CVtEngModel.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,189 @@ +/* +* 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 telephony engine class implementation. +* +*/ + + + +// INCLUDE FILES +#include "CVtEngModel.h" +#include "CVtEngHandlerContainer.h" +#include "CVtEngCommandHandler.h" +#include "CVtEngEventManager.h" +#include "CVtEngStateManager.h" +#include "VtEngUtils.h" +#include "VtEngPanic.h" +#include +#include "CVtEngExtensions.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngModel::CVtEngModel +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngModel::CVtEngModel() + { + } + +// ----------------------------------------------------------------------------- +// CVtEngModel::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVtEngModel::ConstructL( + MVtEngEventObserver& aEventObserver, + MVtEngCommandObserver& aCommandObserver ) + { + VTLOGINIT + __VTPRINTENTER( "Model.ConstructL" ) + + __VTPRINT( DEBUG_GEN | DEBUG_CONSTRUCT, "Model.ConL" ) + iUtils = CVtEngUtility::NewL( ); + iHandlers = CVtEngHandlerContainer::NewL( ); + + // Create extensions + iExtensions = CVtEngExtensions::NewL(); + + iUtils->PrepareL( + *iHandlers, + iStateManager, + iEventManager, + iExtensions ); + iCommandHandler = CVtEngCommandHandler::NewL( *iHandlers ); + iCommandHandler->AddObserverL( aCommandObserver ); + iEventManager = CVtEngEventManager::NewL( aEventObserver ); + iStateManager = CVtEngStateManager::NewL( *iHandlers, *iEventManager ); + __VTPRINTEXIT( "Model.ConstructL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngModel::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CVtEngModel* CVtEngModel::NewL( + MVtEngEventObserver& aEventObserver, + MVtEngCommandObserver& aCommandObserver) + { + CVtEngModel* self = new( ELeave ) CVtEngModel; + + CleanupStack::PushL( self ); + self->ConstructL( aEventObserver, aCommandObserver ); + CleanupStack::Pop(); + + return self; + } + + +// Destructor +CVtEngModel::~CVtEngModel() + { + __VTPRINTENTER( "Model.~" ) + delete iStateManager; + delete iCommandHandler; + delete iHandlers; + delete iUtils; + delete iEventManager; + delete iExtensions; + __VTPRINTEXIT( "Model.~" ) + VTLOGUNINIT + } + +// ----------------------------------------------------------------------------- +// CVtEngModel::CommandHandler +// Returns command handler reference. +// ----------------------------------------------------------------------------- +// +EXPORT_C MVtEngCommandHandler& CVtEngModel::CommandHandler() const + { + return *iCommandHandler; + } + +// ----------------------------------------------------------------------------- +// CVtEngModel::Session +// Returns session reference. +// ----------------------------------------------------------------------------- +// +EXPORT_C MVtEngSessionInfo& CVtEngModel::Session() const + { + return iHandlers->Session(); + } + +// ----------------------------------------------------------------------------- +// CVtEngModel::Media +// Returns media reference. +// +// ----------------------------------------------------------------------------- +// +EXPORT_C MVtEngMedia& CVtEngModel::Media() const + { + return iHandlers->Media(); + } + +// ----------------------------------------------------------------------------- +// CVtEngModel::Audio +// Returns audio reference. +// ----------------------------------------------------------------------------- +// +EXPORT_C MVtEngAudio& CVtEngModel::Audio() const + { + return iHandlers->Audio(); + } + +// ----------------------------------------------------------------------------- +// CVtEngModel::Extension +// Returns extension pointer (currently none) +// ----------------------------------------------------------------------------- +// +EXPORT_C TAny* CVtEngModel::Extension( const TUid& aExtensionUid ) + { + __VTPRINTENTER( "Model.Extension" ) + + // init local variables + TInt error = KErrNone; + TAny* interfacePtr = NULL; + + // get mediahandler handle + MVtEngMedia& msession = iHandlers->Media(); + CVtEngMediaHandler& handler = static_cast( msession ); + + // get API IF from extension + error = iExtensions->GetClientInterface( &interfacePtr, aExtensionUid , + handler ); + + // in case of error + if ( error != KErrNone ) + { + __VTPRINTEXITR( "Model.Extension GetClientInterface failed %d", error) + return NULL; + } + + __VTPRINTEXIT( "Model.Extension" ) + return interfacePtr; + } + +// Engine's internal panic function +void Panic( TVtEngPanic aPanic ) + { + __VTPRINT2( DEBUG_GEN, "EnginePanic %d", aPanic) + User::Panic( KVtEngPanicCategory, aPanic ); + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Base/CVtEngPubSubsListener.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Base/CVtEngPubSubsListener.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,161 @@ +/* +* Copyright (c) 2004-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: Publish and subscribe settings listener. +* +*/ + + +// INCLUDE FILES +#include "CVTEngPubSubsListener.h" +#include "MVtEngSettingPSObserver.h" +#include + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngPubSubsListener::CVtEngPubSubsListener +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngPubSubsListener::CVtEngPubSubsListener( + const TUid aUid, const TInt aKey, MVtEngSettingPSObserver* aObserver ) : + CActive( CActive::EPriorityStandard ), + iUid( aUid ), iId( aKey ), iCallback( aObserver ) + { + __VTPRINT( DEBUG_CONSTRUCT, "CVtEngPubSubsListener C++" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngPubSubsListener::~CVtEngPubSubsListener +// Destructor. +// ----------------------------------------------------------------------------- +// +CVtEngPubSubsListener::~CVtEngPubSubsListener() + { + __VTPRINTENTER( "PSLis.~" ) + Cancel(); + iProperty.Close(); + __VTPRINTEXIT( "PSLis.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngPubSubsListener::RunL +// From CActive. +// ----------------------------------------------------------------------------- +// +void CVtEngPubSubsListener::RunL() + { + __VTPRINTENTER( "PSLis.RunL" ) + const TRequestStatus status( iStatus ); + StartListening(); + iCallback->HandleNotifyPSL( iUid, iId, status ); + __VTPRINTEXIT( "PSLis.RunL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngPubSubsListener::DoCancel +// From CActive. +// ----------------------------------------------------------------------------- +// +void CVtEngPubSubsListener::DoCancel() + { + __VTPRINTENTER( "PSLis.DoCancel" ) + iProperty.Cancel(); + __VTPRINTEXIT( "PSLis.DoCancel" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngPubSubsListener::RunError +// From CActive. +// ----------------------------------------------------------------------------- +// +TInt CVtEngPubSubsListener::RunError( TInt /*aError*/ ) + { + __VTPRINTENTER( "PSLis.RunError" ) + __VTPRINTEXIT( "PSLis.RunError" ) + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngPubSubsListener::NewL +// ----------------------------------------------------------------------------- +// +CVtEngPubSubsListener* CVtEngPubSubsListener::NewL( const TUid aUid, + const TInt aKey, MVtEngSettingPSObserver* aObserver ) + { + __VTPRINTENTER( "PSLis.NewL" ) + CVtEngPubSubsListener* self = new( ELeave ) + CVtEngPubSubsListener( aUid, aKey, aObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + __VTPRINTEXIT( "PSLis.NewL" ) + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngPubSubsListener::StartListening +// ----------------------------------------------------------------------------- +// +void CVtEngPubSubsListener::StartListening() + { + iProperty.Subscribe( iStatus ); + SetActive(); + } + +// ----------------------------------------------------------------------------- +// CVtEngPubSubsListener::ConstructL +// ----------------------------------------------------------------------------- +// +void CVtEngPubSubsListener::ConstructL() + { + CActiveScheduler::Add( this ); + + User::LeaveIfError ( iProperty.Attach( iUid, iId, EOwnerThread ) ); + StartListening(); + } + +// ----------------------------------------------------------------------------- +// CVtEngPubSubsListener::Get +// Read integer value. +// ----------------------------------------------------------------------------- +// +TInt CVtEngPubSubsListener::Get( TInt& aVal ) + { + return iProperty.Get( iUid, iId, aVal ); + } + +// ----------------------------------------------------------------------------- +// CVtEngPubSubsListener::Get +// Read binary value. +// ----------------------------------------------------------------------------- +// +TInt CVtEngPubSubsListener::Get( TDes8& aVal ) + { + return iProperty.Get( iUid, iId, aVal ); + } + +// ----------------------------------------------------------------------------- +// CVtEngPubSubsListener::Get +// Read string value. +// ----------------------------------------------------------------------------- +// +TInt CVtEngPubSubsListener::Get( TDes16& aVal ) + { + return iProperty.Get( iUid, iId, aVal ); + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Base/CVtEngSATClient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Base/CVtEngSATClient.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,118 @@ +/* +* Copyright (c) 2005 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: SAT listener. +* +*/ + + + +// INCLUDE FILES +#include "CVtEngStateManager.h" +#include "CVtEngSATClient.h" +#include "VtEngUtils.h" +#include + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngSATClient::CVtEngSATClient +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngSATClient::CVtEngSATClient() : + iSatSession(), + iSatRefresh( *this ) + { + __VTPRINT( DEBUG_GEN | DEBUG_CONSTRUCT, "CSATClient.C++" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngSATClient::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtEngSATClient* CVtEngSATClient::NewL( ) + { + __VTPRINTENTER( "CSATClient.NewL" ) + CVtEngSATClient* self = new( ELeave ) CVtEngSATClient; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + __VTPRINTEXIT( "CSATClient.NewL" ) + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngSATClient::~CVtEngSATClient +// Destructor. +// ----------------------------------------------------------------------------- +// +CVtEngSATClient::~CVtEngSATClient() + { + __VTPRINTENTER( "CSATClient.~" ) + iSatRefresh.Close(); + iSatSession.Close(); + __VTPRINTEXIT( "CSATClient.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngSATClient::ConstructL +// 2nd phase constructor. +// ----------------------------------------------------------------------------- +// +void CVtEngSATClient::ConstructL() + { + iSatSession.ConnectL(); + iSatRefresh.OpenL( iSatSession ); + iSatRefresh.NotifyFileChangeL(); + } + +// ----------------------------------------------------------------------------- +// CVtEngSATClient::AllowRefresh +// Callback from SAT. +// ----------------------------------------------------------------------------- +// +TBool CVtEngSATClient::AllowRefresh( + TSatRefreshType aType, + const TSatRefreshFiles& /*aFiles*/ ) + { + __VTPRINTENTER( "CSATClient.AllowRefresh" ) + TBool ret( EFalse ); + const MVtEngSessionInfo::TSessionState state( + CVtEngUtility::StateManager()->SessionState() ); + if ( state == MVtEngSessionInfo::EIdle || aType == EFileChangeNotification ) + { + __VTPRINT2( DEBUG_GEN, " TSatRefreshType aType=%d", aType ) + ret = ETrue; + } + __VTPRINTEXITR( "CSATClient.AllowRefresh ret=%d", ret ) + return ret; + } + +// ----------------------------------------------------------------------------- +// CVtEngSATClient::Refresh +// Callback from SAT. +// ----------------------------------------------------------------------------- +// +void CVtEngSATClient::Refresh( + TSatRefreshType /* aType */, + const TSatRefreshFiles& /* aFiles */ ) + { + // Not needed. + __VTPRINT( DEBUG_GEN | DEBUG_DETAIL, "CSATClient.Refresh" ) + iSatRefresh.RefreshEFRead( EFalse ); + } + +// end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Base/CVtEngSettings.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Base/CVtEngSettings.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,948 @@ +/* +* Copyright (c) 2004-2008 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 call setting data +* +*/ + + + +// INCLUDE FILES +#include "CVtEngSettings.h" +#include +#include "MVtEngSettingObserver.h" +#include "VtEngUtils.h" +#include "VtEngPanic.h" +#include +#include +#include +#include +#include +#include +#include + +// CONSTANTS +// Granularity for observer array. +const TInt KVtEngObserverArrayGranularity = 2; + +// Volume default level. +const TInt KVtEngVolumeDefaultLevel = 4; + +// Video quality frame rate configuration buffer size +const TInt KVtEngVQFRBufferSize = 32; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngSettings::CVtEngSettings +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngSettings::CVtEngSettings() : + iVariantReadOnlyValues( KErrNotReady ) + { + iCLI.iValid = EFalse; + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVtEngSettings::ConstructL() + { + __VTPRINTENTER( "Settings.ConstructL" ) + iSelectVolumeIdle = CIdle::NewL( CActive::EPriorityHigh ); + iObserverItems = new ( ELeave ) + CArrayFixFlat( KVtEngObserverArrayGranularity ); + + // Ear volume CR listener. + iCRProxy = &CVtEngUtility::CRProxy(); + CreateDataObserverL( this, KCRUidInCallVolume, KTelIncallEarVolume, + CCenRepNotifyHandler::EIntKey ); + + // IHF volume listener. + CreateDataObserverL( + this, KCRUidInCallVolume, KTelIncallLoudspeakerVolume, + CCenRepNotifyHandler::EIntKey ); + + // Call duration listener. + CreateDataObserverL( this, KCRUidLogs, KLogsShowCallDuration, + CCenRepNotifyHandler::EIntKey ); + + // Still image listener. + CreateDataObserverL( this, KCRUidTelephonySettings, KSettingsVTStillImage, + CCenRepNotifyHandler::EIntKey ); + + // Still image path listener. + CreateDataObserverL( + this, KCRUidTelephonySettings, KSettingsVTStillImagePath, + CCenRepNotifyHandler::EStringKey ); + + ReadVariationsL(); + ResetAll(); + + + TInt validImage( 0 ); + TInt err = iCRProxy->Get( KCRUidTelephonySettings, + KSettingsVTStillImage, validImage ); + __VTPRINT3( DEBUG_DETAIL, "Settings.ConL: use image", err, validImage ) + if ( !err && validImage ) + { + __VTPRINT( DEBUG_DETAIL, "Settings.ConL: VALID" ) + iConfig.iVideo.iImageIsValid = ETrue; + } + + TInt value( 0 ); // not shown + err = iCRProxy->Get( KCRUidLogs, KLogsShowCallDuration, value ); + if ( err == KErrNone ) + { + iConfig.iCallTimerOn = ( value == 1 ) ? ETrue : EFalse; + } + + // Initialize the volume levels. + // If value retrieval fails, use defaults. + if ( iCRProxy->Get( KCRUidInCallVolume, + KTelIncallEarVolume, iConfig.iAudio.iVolume.iHandsetVolume ) + != KErrNone ) + { + iConfig.iAudio.iVolume.iHandsetVolume = KVtEngVolumeDefaultLevel; + } + + if ( iCRProxy->Get( KCRUidInCallVolume, KTelIncallLoudspeakerVolume, + iConfig.iAudio.iVolume.iHandsfreeVolume ) != KErrNone ) + { + iConfig.iAudio.iVolume.iHandsfreeVolume = KVtEngVolumeDefaultLevel; + } + + // Open connection to phone server + RPhCltServer phoneClient; + User::LeaveIfError( phoneClient.Connect() ); + CleanupClosePushL( phoneClient ); + + CPhCltImageHandler* stillH; + stillH = CPhCltImageHandler::NewL(); + CleanupStack::PushL( stillH ); + + // Load images + RFile file; + TInt res = stillH->OpenDefaultVtImage( file ); + file.Close(); + iDefaultStillImageDefined = ( res == KErrNone ) ? ETrue : EFalse; + // Cleanup + CleanupStack::PopAndDestroy( 2 ); // phoneClient, stillH, imageParams + + __VTPRINTEXIT( "Settings.ConstructL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtEngSettings* CVtEngSettings::NewL() + { + CVtEngSettings* self = new( ELeave ) CVtEngSettings; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::~CVtEngSettings +// Destructor. +// ----------------------------------------------------------------------------- +// +CVtEngSettings::~CVtEngSettings() + { + __VTPRINTENTER( "Settings.~" ) + delete iSelectVolumeIdle; + delete iObserverItems; + delete iDataportInfo; + __VTPRINTEXIT( "Settings.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::Config +// Returns configuration. +// ----------------------------------------------------------------------------- +// +const CVtEngSettings::TVtEngVideoCallConfig& CVtEngSettings::Config() const + { + return iConfig; + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::SetCurrentVolume +// ----------------------------------------------------------------------------- +// +void CVtEngSettings::SetCurrentVolume( TBool aVolume ) + { + TBool old = iConfig.iAudio.iCurrentVolume; + iConfig.iAudio.iCurrentVolume = aVolume; + + if ( iSelectVolumeObserver && ( !old && aVolume ) || ( old && !aVolume ) ) + { + iSelectVolumeIdle->Cancel(); + iSelectVolumeIdle->Start( + TCallBack( DoInformSelectVolumeObserver, this ) ); + } + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::CurrentVolume +// ----------------------------------------------------------------------------- +// +TBool CVtEngSettings::CurrentVolume() const + { + return iConfig.iAudio.iCurrentVolume; + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::SetVolume +// Sets output volue setting. +// ----------------------------------------------------------------------------- +// +TInt CVtEngSettings::SetVolume( + const TInt aHandsetVolume, + const TInt aHandsfreeVolume, + const TBool aInternal ) + { + __VTPRINTENTER( "Settings.SetVolume" ) + __VTPRINT3( DEBUG_DETAIL, "Settings:SetVolume hs=%d, ihf=%d", + aHandsetVolume, aHandsfreeVolume ) + __VTPRINT2( DEBUG_DETAIL, "Settings:Internal=%d", aInternal ) + + TInt volume ( 0 ); + + TInt res( KErrNone ); + if ( aInternal ) + { + if ( iConfig.iAudio.iVolume.iHandsfreeVolume != aHandsfreeVolume ) + { + iConfig.iAudio.iVolume.iHandsfreeVolume = + ValidVolume( aHandsfreeVolume ); + } + if ( iConfig.iAudio.iVolume.iHandsetVolume != aHandsetVolume ) + { + iConfig.iAudio.iVolume.iHandsetVolume = + ValidVolume( aHandsetVolume ); + } + } + else + { + iCRProxy->Get( KCRUidInCallVolume, + KTelIncallEarVolume, volume ); + if ( volume != aHandsetVolume ) + { + iCRProxy->Set( KCRUidInCallVolume, + KTelIncallEarVolume, aHandsetVolume ); + } + + iCRProxy->Get( KCRUidInCallVolume, + KTelIncallLoudspeakerVolume, volume ); + if ( volume != aHandsfreeVolume ) + { + iCRProxy->Set( KCRUidInCallVolume, + KTelIncallLoudspeakerVolume, aHandsfreeVolume ); + } + } + __VTPRINTEXITR( "Settings.SetVolume res=%d", res ) + return res; + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::GetVolume +// Gets audio volume. +// ----------------------------------------------------------------------------- +// +TInt CVtEngSettings::GetVolume( + TInt& aVolume, + const TBool aHandsfree, + const TBool aInternal ) const + { + __VTPRINTEXIT( "Settings.GetVolume" ) + TInt res( KErrNone ); + if ( aInternal ) + { + if ( aHandsfree ) + { + aVolume = iConfig.iAudio.iVolume.iHandsfreeVolume; + } + else + { + aVolume = iConfig.iAudio.iVolume.iHandsetVolume; + } + } + else + { + if ( aHandsfree ) + { + res = iCRProxy->Get( KCRUidInCallVolume, + KTelIncallLoudspeakerVolume, aVolume ); + } + else + { + res = iCRProxy->Get( KCRUidInCallVolume, + KTelIncallEarVolume, aVolume ); + } + } + __VTPRINTEXITR( "Settings.GetVolume res=%d", res ) + return res; + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::SetRouting +// Sets audio routing setting. +// ----------------------------------------------------------------------------- +// +void CVtEngSettings::SetRouting( + const MVtEngAudio::TVtEngRoutingSetting& aState ) + { + iConfig.iAudio.iRouting = aState; + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::SetVideoEnabled +// Sets video enabled setting. +// ----------------------------------------------------------------------------- +// +void CVtEngSettings::SetVideoEnabled( const TBool aEnabled ) + { + __VTPRINT2( DEBUG_GEN , "Settings.SVE",aEnabled ) + iConfig.iVideo.iVideoEnabled = aEnabled; + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::SetConnectReady +// ----------------------------------------------------------------------------- +// +void CVtEngSettings::SetConnectReady() + { + iConfig.iReadyForConnect = ETrue; + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::SetDataportLoaned +// Sets dataport loaning status +// +// ----------------------------------------------------------------------------- +// +void CVtEngSettings::SetDataportLoaned( TBool aLoaned ) + { + __VTPRINTENTER( "Settings.SetDataportLoaned" ) + iConfig.iIsDataportLoaned = aLoaned; + __VTPRINTEXIT( "Settings.SetDataportLoaned" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::ResetAll +// Reset all settings. +// ----------------------------------------------------------------------------- +// +void CVtEngSettings::ResetAll() + { + __VTPRINT( DEBUG_GEN , "Settings.RA" ) + iConfig.iAudio.iRouting = KVtEngDefaultAudioRouting; + iConfig.iVideo.iVideoEnabled = ETrue; + iConfig.iReadyForConnect = EFalse; + iConfig.iIsDataportLoaned = EFalse; + // call duration setting not cleared + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::NotifyChangeL +// ----------------------------------------------------------------------------- +// +void CVtEngSettings::NotifyChangeL( + TSettingId aId, + MVtEngSettingObserver& aObserver ) + { + __VTPRINTENTER( "Settings.NotifyChangeL" ) + __VTPRINT2( DEBUG_GEN, "Settings.NC id %d", aId ) + switch ( aId ) + { + case ESelectVolume: + iSelectVolumeObserver = &aObserver; + break; + case EDataportInfo: + iDataportObserver = &aObserver; + break; + // others are CenRep items + default: + { + const TInt count( iObserverItems->Count() ); + for ( TInt index = 0; index < count; index++ ) + { + TObserverItem& item = iObserverItems->At( index ); + if ( item.iId == aId && item.iObserver == &aObserver ) + { + __VTPRINT( DEBUG_GEN, "Settings.NC.already" ) + __VTPRINTEXIT( "Settings.NotifyChangeL" ) + return; + } + } + + TObserverItem item; + item.iId = aId; + switch ( aId ) + { + case EStillImage: + item.iIntKey = KSettingsVTStillImage; + item.iUid = KCRUidTelephonySettings; + break; + case EStillImagePath: + item.iIntKey = KSettingsVTStillImagePath; + item.iUid = KCRUidTelephonySettings; + break; + case ECallTimer: + item.iIntKey = KLogsShowCallDuration; + item.iUid = KCRUidLogs; + break; + case EHandsetVolume: + item.iIntKey = KTelIncallEarVolume; + item.iUid = KCRUidInCallVolume; + break; + case EHandsfreeVolume: + item.iIntKey = KTelIncallLoudspeakerVolume; + item.iUid = KCRUidInCallVolume; + break; + default: + break; + } + item.iObserver = &aObserver; + iObserverItems->AppendL( item ); + } + } + __VTPRINTEXIT( "Settings.NotifyChangeL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::CancelNotifyChange +// Cancels receiving change events. +// ----------------------------------------------------------------------------- +// +void CVtEngSettings::CancelNotifyChange( + TSettingId aId, const MVtEngSettingObserver& aObserver ) + { + __VTPRINTENTER( "Settings.CancelNotifyChange" ) + if ( aId == ESelectVolume ) + { + if ( &aObserver == iSelectVolumeObserver ) + { + iSelectVolumeObserver = NULL; + } + } + else if ( &aObserver == iDataportObserver ) + { + iDataportObserver = NULL; + // also free space used for dataport info + delete iDataportInfo; + iDataportInfo = NULL; + } + else + { + TInt count( iObserverItems->Count() ); + while ( count-- ) + { + const TObserverItem& item = iObserverItems->At( count ); + if ( item.iId == aId && + item.iObserver == &aObserver ) + { + iObserverItems->Delete( count ); + count = 0; // breaks loop + } + } + } + __VTPRINTEXIT( "Settings.CancelNotifyChange" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::HandleNotifyInt +// ----------------------------------------------------------------------------- +// +void CVtEngSettings::HandleNotifyInt( const TUid aUid, + const TUint32 aId, TInt aNewValue ) + { + TBool informObserver = ETrue; + if ( aUid == KCRUidInCallVolume ) + { + switch ( aId ) + { + case KTelIncallLoudspeakerVolume: + { + __VTPRINT( DEBUG_GEN, "Settings.HandleNotifyInt: HF volume" ) + if ( iConfig.iAudio.iVolume.iHandsfreeVolume == aNewValue ) + { + informObserver = EFalse; + } + else + { + iConfig.iAudio.iVolume.iHandsfreeVolume = aNewValue; + } + } + break; + case KTelIncallEarVolume: + { + __VTPRINT( DEBUG_GEN, "Settings.HandleNotifyInt: HandsetVolume" ) + if ( iConfig.iAudio.iVolume.iHandsetVolume == aNewValue ) + { + informObserver = EFalse; + } + else + { + iConfig.iAudio.iVolume.iHandsetVolume = aNewValue; + } + } + break; + default: + __VTPRINT( DEBUG_GEN, "Settings.HandleNotifyInt: Non-ordered" ); + break; + } + } + else if ( aUid == KCRUidLogs ) + { + switch ( aId ) + { + case KLogsShowCallDuration: + { + __VTPRINT( DEBUG_GEN, "Settings.HandleNotifyInt: call duration" ) + iConfig.iCallTimerOn = aNewValue > 0 ? ETrue : EFalse; + } + break; + default: + __VTPRINT( DEBUG_GEN, "Settings.HandleNotifyInt: Non-ordered" ); + break; + } + } + else if ( aUid == KCRUidTelephonySettings ) + { + switch ( aId ) + { + case KSettingsVTStillImage: + { + __VTPRINT( DEBUG_GEN, "HandleNotifyInt still" ) + if ( aNewValue == 0 ) + { + __VTPRINT( DEBUG_GEN, "Settings.HandleNotifyInt disabled") + // still image disabled in settings + iConfig.iVideo.iStillImageFile.Zero(); + iConfig.iVideo.iImageIsValid = EFalse; + } + else + { + __VTPRINT( DEBUG_GEN, "Settings.HandleNotifyInt enabled") + iConfig.iVideo.iImageIsValid = ETrue; + } + } + break; + default: + __VTPRINT( DEBUG_GEN, "Settings.HandleNotifyInt: Non-ordered" ); + break; + } + } + + TObserverItem* item = FindItem( aUid, aId ); + if ( informObserver && item && item->iObserver ) + { + // The observer does not need the new value + // Plain notification is all. + TRAP_IGNORE( item->iObserver->HandleSettingChangedL( item->iId, KNullDesC16 ) ); + } + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::HandleNotifyReal +// +// +// ----------------------------------------------------------------------------- +// +void CVtEngSettings::HandleNotifyReal( const TUid /*aUid*/, + const TUint32 /*aId*/ , TReal /* aNewValue*/ ) + { + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::HandleNotifyString +// +// +// ----------------------------------------------------------------------------- +// +void CVtEngSettings::HandleNotifyString( const TUid aUid, const TUint32 aId, + const TDesC16& aNewValue ) + { + __VTPRINTENTER( "Settings.HN" ) + if ( aNewValue.Compare( iConfig.iVideo.iStillImageFile ) != 0 ) + { + if( aId == KSettingsVTStillImagePath ) + { + __VTPRINT( DEBUG_GEN, "Settings.HN KGSVTStillImagePath" ) + iConfig.iVideo.iStillImageFile.Copy( aNewValue ); + } + } + TObserverItem* item = FindItem( aUid, aId ); + if ( item && item->iObserver ) + { + TRAP_IGNORE( item->iObserver->HandleSettingChangedL( item->iId, aNewValue ) ); + } + __VTPRINTEXIT( "Settings.HN" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::FindItem +// Finds observer item. +// ----------------------------------------------------------------------------- +// +CVtEngSettings::TObserverItem* CVtEngSettings::FindItem( + const TUid& aUid, + const TDesC& aKey ) const + { + TInt count( iObserverItems->Count() ); + TObserverItem* item = NULL; + TBool found( EFalse ); + while ( count-- && !found ) + { + item = &iObserverItems->At( count ); + if ( item->iUid == aUid && + item->iKey.Compare( aKey ) == 0 ) + { + found = ETrue; + } + } + + // Just NULL the item if not found + if( !found ) + { + item = NULL; + } + return item; + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::FindItem +// Finds observer item. +// ----------------------------------------------------------------------------- +// +CVtEngSettings::TObserverItem* CVtEngSettings::FindItem( + const TUid& aUid,const TInt& aKey ) const + { + TInt count( iObserverItems->Count() ); + TObserverItem* item = NULL; + TBool found( EFalse ); + while ( count-- && !found ) + { + item = &iObserverItems->At( count ); + if ( item->iUid == aUid && + item->iIntKey == aKey ) + { + found = ETrue; + } + } + + // Just NULL the item if not found + if( !found ) + { + item = NULL; + } + return item; + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::SettingAsTInt +// Returns setting as integer value. +// ----------------------------------------------------------------------------- +// +TInt CVtEngSettings::SettingAsTInt( const TDesC& aValue ) + { + TInt value( 0 ); + const TInt err = TLex( aValue ).Val( value ); + if ( err != KErrNone ) + { + value = err; + } + return value; + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::DoInformSelectVolumeObserver +// ----------------------------------------------------------------------------- +// +TInt CVtEngSettings::DoInformSelectVolumeObserver( TAny* aAny ) + { + CVtEngSettings* self = static_cast< CVtEngSettings* >( aAny ); + + if ( self->iSelectVolumeObserver ) + { + TRAP_IGNORE( self->iSelectVolumeObserver->HandleSettingChangedL( + ESelectVolume, + KNullDesC ) ); + } + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::ReadVariationsL +// Reads local variations. +// ----------------------------------------------------------------------------- +// +void CVtEngSettings::ReadVariationsL() + { + __VTPRINTENTER( "Settings.ReadVariations" ) + User::LeaveIfError( iCRProxy->Get( KCRUidVTVariation, + KVTLocalVariationFlags, iVariantReadOnlyValues )); + TBuf< KVtEngVQFRBufferSize > buffer; + User::LeaveIfError( iCRProxy->Get( KCRUidVTConfiguration, + KVTVideoFrameRates, buffer )); + ParseFrameRates( iVQFRConfig, buffer ); + __VTPRINTEXIT( "Settings.ReadVariations" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::GetCameraOrientations +// Reads camera orientations from CR +// ----------------------------------------------------------------------------- +// + +void CVtEngSettings::GetCameraOrientations( + MVtEngMedia::TCameraOrientation& aPrimaryCameraOrientation, + MVtEngMedia::TCameraOrientation& aSecondaryCameraOrientation ) const + { + /* + * Defines layout (screen orientation) used by + * Video Telephone application per active camera. + * Each camera has one of the following values: + * 1) "LS" = Landscape + * 2) "PR" = Portrait + * 3) "OL" = Obey layout in specific device mode (normal operation) + * Camera values are: + * 1) "C1" = VT primary camera (inwards) + * 2) "C2" = VT secondary camera (outwards) + * Example value (portrait for cam1, landscape for cam2): + * C1:PR C2:LS + */ + + __VTPRINTENTER( "Settings.GetCameraOrientations" ) + const TInt KMaxKVTCameraLayoutValue = 11; + const TInt KAbbreviationLength = 2; + const TInt KSkipChars = 3; + + _LIT( KCameraOrientationLS, "LS" ); // landscape + _LIT( KCameraOrientationPR, "PR" ); // portrait + + TBuf< KMaxKVTCameraLayoutValue > cameraOrientations; + TInt err = iCRProxy->Get( KCRUidVTConfiguration, + KVTCameraLayout, cameraOrientations ); + + // parse cenrep value + if( cameraOrientations.Length() > 0 ) + { + TBuf abbreviation; + TLex lex( cameraOrientations ); + lex.SkipAndMark(KSkipChars); + abbreviation.Append( lex.Get() ); + abbreviation.Append( lex.Get() ); + + // primary camera value + if ( abbreviation.CompareF( KCameraOrientationLS ) == 0 ) + { + __VTPRINT( DEBUG_GEN, "Settings.GetCamOrient.prim:LS" ); + aPrimaryCameraOrientation = MVtEngMedia::EOrientationLandscape; + } + else if ( abbreviation.CompareF( KCameraOrientationPR ) == 0 ) + { + aPrimaryCameraOrientation = MVtEngMedia::EOrientationPortrait; + __VTPRINT( DEBUG_GEN, "Settings.GetCamOrient.prim:PR" ); + } + else + { + __VTPRINT( DEBUG_GEN, "Settings.GetCamOrient.prim:OL" ); + aPrimaryCameraOrientation = MVtEngMedia::EOrientationObeyLayoutSwitch; + } + + abbreviation.Zero(); + lex.SkipSpace(); + lex.SkipAndMark(KSkipChars); + abbreviation.Append( lex.Get() ); + abbreviation.Append( lex.Get() ); + + //secondary camera value + if ( abbreviation.CompareF( KCameraOrientationLS ) == 0) + { + __VTPRINT( DEBUG_GEN, "Settings.GetCamOrient.sec:LS" ); + aSecondaryCameraOrientation = MVtEngMedia::EOrientationLandscape; + } + else if ( abbreviation.CompareF( KCameraOrientationPR ) == 0) + { + __VTPRINT( DEBUG_GEN, "Settings.GetCamOrient.sec:PR" ); + aSecondaryCameraOrientation = MVtEngMedia::EOrientationPortrait; + } + else + { + __VTPRINT( DEBUG_GEN, "Settings.GetCamOrient.sec:OL" ); + aSecondaryCameraOrientation = MVtEngMedia::EOrientationObeyLayoutSwitch; + } + } + else + { + // reading from cenrep failed + // set default values for camera orientation + aPrimaryCameraOrientation = MVtEngMedia::EOrientationObeyLayoutSwitch; + aSecondaryCameraOrientation = MVtEngMedia::EOrientationObeyLayoutSwitch; + } + __VTPRINTEXIT( "Settings.ReadVariations" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::CheckBit +// Checks if a certain bit is turned on in locally variated features. +// ----------------------------------------------------------------------------- +// +TBool CVtEngSettings::CheckBits( const TInt aBits ) + { + __VTPRINT2( DEBUG_GEN, "Settings.CheckBit: %d", aBits ) + __VTPRINT2( DEBUG_GEN, "Settings.CheckBit=%d", + iVariantReadOnlyValues & aBits ? 1 : 0 ) + return iVariantReadOnlyValues & aBits; + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::VideoQualityFrameRateConfig +// Returns video quality frame rate configuration. +// ----------------------------------------------------------------------------- +// +const CVtEngSettings::TVtEngVideoQualityFrameRateConfig& + CVtEngSettings::VideoQualityFrameRateConfig() const + { + __VTPRINTENTER( "Settings.VideoQualityFrameRateConfig" ) + __VTPRINTEXIT( "Settings.VideoQualityFrameRateConfig" ) + return iVQFRConfig; + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::CreateDataObserverL +// Creates a shared data observer. Ownership transferred. +// ----------------------------------------------------------------------------- +// +void CVtEngSettings::CreateDataObserverL( MVtEngCRSettingObserver* aObserver, + TUid aUid, TUint32 aKey, CCenRepNotifyHandler::TCenRepKeyType aType ) + { + CVtEngCRObserverItem* item = CVtEngCRObserverItem::NewL( + aObserver, aUid, aKey, aType ); + CleanupStack::PushL( item ); + iCRProxy->RegisterInterestedL( item ); + CleanupStack::Pop( item ); + } + + +// ----------------------------------------------------------------------------- +// CVtEngSettings::ParseFrameRates +// Parses VQ frame rates read from cenrep. +// ----------------------------------------------------------------------------- +// +void CVtEngSettings::ParseFrameRates( TVtEngVideoQualityFrameRateConfig& aVQFR, + const TDesC& aBuffer ) + { + __VTPRINTENTER( "Settings.ParseFrameRates" ) + Mem::FillZ( &aVQFR, sizeof( aVQFR ) ); + if( aBuffer.Length() > 0 ) + { + TLex lex( aBuffer ); + lex.Val( aVQFR.iDetail ); + __VTPRINT2( DEBUG_GEN, "Settings.ParseFrameRates iDetail=%d", aVQFR.iDetail ); + lex.SkipSpace(); + lex.Val( aVQFR.iNormal ); + __VTPRINT2( DEBUG_GEN, "Settings.ParseFrameRates iNormal=%d", aVQFR.iNormal ); + lex.SkipSpace(); + lex.Val( aVQFR.iMotion ); + __VTPRINT2( DEBUG_GEN, "Settings.ParseFrameRates iMotion=%d", aVQFR.iMotion ); + } + __VTPRINTEXIT( "Settings.ParseFrameRates" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::IsDefaultStillImageDefined +// Checks if still image exists. +// ----------------------------------------------------------------------------- +// +TBool CVtEngSettings::IsDefaultStillImageDefined() + { + __VTPRINTENTER( "Settings.IsDefaultStillImageDefined" ) + __VTPRINTEXITR( "Settings.IsDefaultStillImageDefined%d",iDefaultStillImageDefined ) + return iDefaultStillImageDefined; + + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::SetCLI +// +// ----------------------------------------------------------------------------- +// +void CVtEngSettings::SetCLI( const MVtEngSessionInfo::TCLI& aCLI ) + { + __VTPRINTENTER( "Settings.SetCLI" ) + iCLI.iCallId = aCLI.iCallId; + iCLI.iName = aCLI.iName; + iCLI.iVoiceCallPossible = aCLI.iVoiceCallPossible; + iCLI.iValid = ETrue; + iCLI.iCallNumber = aCLI.iCallNumber; + __VTPRINT2( DEBUG_GEN, "iVoiceCallPossible=%d,", iCLI.iVoiceCallPossible ) + __VTPRINTEXIT( "Settings.SetCLI" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::GetCLI +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngSettings::GetCLI( MVtEngSessionInfo::TCLI& aCLI ) const + { + aCLI.iCallId = iCLI.iCallId; + aCLI.iVoiceCallPossible = iCLI.iVoiceCallPossible; + aCLI.iName = iCLI.iName; + aCLI.iCallNumber = iCLI.iCallNumber; + return iCLI.iValid; + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::SetDataportInfoL +// +// ----------------------------------------------------------------------------- +// +void CVtEngSettings::SetDataportInfoL( const TDesC& aPortInfo ) + { + delete iDataportInfo; + iDataportInfo = NULL; + iDataportInfo = HBufC::NewL( aPortInfo.Length() ); + *iDataportInfo = aPortInfo; + SetConnectReady(); + if ( iDataportObserver ) + { + iDataportObserver->HandleSettingChangedL( EDataportInfo, + *iDataportInfo ); + } + } + +// ----------------------------------------------------------------------------- +// CVtEngSettings::DataportInfo +// +// ----------------------------------------------------------------------------- +// +const TDesC* CVtEngSettings::DataportInfo() const + { + return iDataportInfo; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Base/VtEngUtils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Base/VtEngUtils.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,217 @@ +/* +* Copyright (c) 2004-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 telephony engine TLS container. +* +*/ + + + +// INCLUDE FILES +#include "CVtEngCRProxy.h" +#include "CVtEngAccessoryHandler.h" +#include "CVtEngSATClient.h" +#include "VtEngUtils.h" +#include "VtEngPanic.h" +#include "CVtEngInitializer.h" +#include "CVtEngSettings.h" +#include "CVtEngDeviceLockMonitor.h" + +#include "CVtEngExtensions.h" +#include "cvtengmdtrmessagelistener.h" +#include "cvtengmdtrcommandsender.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngUtility::CVtEngUtility +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngUtility::CVtEngUtility() + { + } + +// ----------------------------------------------------------------------------- +// CVtEngUtility::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVtEngUtility::ConstructL( ) + { + __ASSERT_DEBUG( Dll::Tls() == NULL, Panic( EVtEngPanicTlsPanic )); + Dll::SetTls( this ); + iCRProxy = CVtEngCRProxy::NewL(); + iAccessoryHandler = CVtEngAccessoryHandler::NewL(); + iSettings = CVtEngSettings::NewL(); + + iLockMonitor = CVtEngDeviceLockMonitor::NewL(); + iMdtrCommandSender = CVtEngMdtrCommandSender::NewL( *this ); + } + +// ----------------------------------------------------------------------------- +// CVtEngUtility::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtEngUtility* CVtEngUtility::NewL() + { + CVtEngUtility* self = new( ELeave ) CVtEngUtility; + + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop(); + + return self; + } + + +// Destructor +CVtEngUtility::~CVtEngUtility() + { + delete iMdtrMessageListener; + delete iMdtrCommandSender; + delete iCRProxy; + delete iAccessoryHandler; + delete iEngineInit; + delete iSettings; + delete iSATClient; + delete iLockMonitor; + Dll::SetTls( NULL ); + } + +// ----------------------------------------------------------------------------- +// CVtEngUtility::EngineUtils +// Return pointer to Engine Utility. +// +// ----------------------------------------------------------------------------- +// +CVtEngUtility* CVtEngUtility::EngineUtils() + { + return reinterpret_cast( Dll::Tls() ); + } + +// ----------------------------------------------------------------------------- +// CVtEngUtility::StateManager +// Returns state manager. +// +// ----------------------------------------------------------------------------- +// +CVtEngStateManager* CVtEngUtility::StateManager() + { + return *(CVtEngUtility::EngineUtils()->iStateManager); + } + +// ----------------------------------------------------------------------------- +// CVtEngUtility::EventManager +// ----------------------------------------------------------------------------- +// +CVtEngEventManager& CVtEngUtility::EventManager() + { + return **CVtEngUtility::EngineUtils()->iEventManager; + } + +// ----------------------------------------------------------------------------- +// CVtEngUtility::PrepareL +// ----------------------------------------------------------------------------- +// +void CVtEngUtility::PrepareL( + CVtEngHandlerContainer& aHandlers, + CVtEngStateManager*& aStateManagerPtr, + CVtEngEventManager*& aEventManagerPtr, + CVtEngExtensions* aExtensionPtr ) + { + iEngineInit = CVtEngInitializer::NewL( aHandlers ); + iStateManager = &aStateManagerPtr; + iEventManager = &aEventManagerPtr; + iExtensions = aExtensionPtr; + } + +// ----------------------------------------------------------------------------- +// CVtEngUtility::StartMediatorListenerL +// Creates mediator message (event/command) listener. Cannot be done in +// constructor because session control may be unavailable when we would +// receive first mediator event => session state is still uninitialized. +// ----------------------------------------------------------------------------- +// +void CVtEngUtility::StartMediatorListenerL() + { + iMdtrMessageListener = CVtEngMdtrMessageListener::NewL( *this ); + } + + +// ----------------------------------------------------------------------------- +// CVtEngUtility::Settings +// ----------------------------------------------------------------------------- +// +CVtEngSettings& CVtEngUtility::Settings() + { + return *CVtEngUtility::EngineUtils()->iSettings; + } + +// ----------------------------------------------------------------------------- +// CVtEngUtility::MediatorCommands +// ----------------------------------------------------------------------------- +// +CVtEngMdtrCommandSender& CVtEngUtility::MediatorCommands() + { + return *CVtEngUtility::EngineUtils()->iMdtrCommandSender; + } + +// ----------------------------------------------------------------------------- +// CVtEngUtility::CRProxy +// ----------------------------------------------------------------------------- +// +CVtEngCRProxy& CVtEngUtility::CRProxy() + { + return *CVtEngUtility::EngineUtils()->iCRProxy; + } + +// ----------------------------------------------------------------------------- +// CVtEngUtility::AccessoryHandler +// ----------------------------------------------------------------------------- +// +CVtEngAccessoryHandler& CVtEngUtility::AccessoryHandler() + { + return *CVtEngUtility::EngineUtils()->iAccessoryHandler; + } + +// ----------------------------------------------------------------------------- +// CVtEngUtility::StartSATListenL +// ----------------------------------------------------------------------------- +// +void CVtEngUtility::StartSATListenL() + { + iSATClient = CVtEngSATClient::NewL(); + } + +// ----------------------------------------------------------------------------- +// CVtEngUtility::NotifyLockState +// ----------------------------------------------------------------------------- +// +void CVtEngUtility::NotifyLockState() + { + iLockMonitor->NotifyState(); + } + +// ----------------------------------------------------------------------------- +// CVtEngUtility::Extensions +// ----------------------------------------------------------------------------- +// +CVtEngExtensions* CVtEngUtility::Extensions() + { + return CVtEngUtility::EngineUtils()->iExtensions; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Base/cvtengincomingcallmonitor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Base/cvtengincomingcallmonitor.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,119 @@ +/* +* 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: Monitors device incoming call state +* +*/ + + +// INCLUDE FILES +#include "cvtengincomingcallmonitor.h" +#include "CVTEngPubSubsListener.h" +#include "CVtEngEventManager.h" +#include "cvtlogger.h" + +#include + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngIncomingCallMonitor::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtEngIncomingCallMonitor* CVtEngIncomingCallMonitor::NewL() + { + CVtEngIncomingCallMonitor* self = new ( ELeave ) CVtEngIncomingCallMonitor(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// +// ----------------------------------------------------------------------------- +// CVtEngIncomingCallMonitor::~ +// Destructor. +// ----------------------------------------------------------------------------- +// +CVtEngIncomingCallMonitor::~CVtEngIncomingCallMonitor() + { + delete iIncomingCallListener; + } + +// ----------------------------------------------------------------------------- +// CVtEngIncomingCallMonitor::NotifyState +// Notifies UI about device incoming call state +// ----------------------------------------------------------------------------- +// +void CVtEngIncomingCallMonitor::NotifyState() const + { + __VTPRINTENTER( "IncomingCall.NotifyState" ) + + // Initialize state as first valuea of call state enum + TInt state = EPSCTsyCallStateUninitialized; + + // Get incomig call state and send event to UI + if ( iIncomingCallListener->Get( state ) == KErrNone ) + { + __VTPRINT2( DEBUG_SESSION, "IncomingCall.NotifyState=%d", state ) + const TInt event = ( state == EPSCTsyCallStateRinging ) ? + KVtEngSessionWaitingCallActive : KVtEngSessionWaitingCallInactive; + CVtEngEventManager::NotifyEvent( event ); + } + __VTPRINTEXIT( "IncomingCall.NotifyState" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngIncomingCallMonitoronitor::HandleNotifyPSL +// Callback for incoming call state change +// ----------------------------------------------------------------------------- +// +void CVtEngIncomingCallMonitor::HandleNotifyPSL( + const TUid aUid, + const TInt& aKey, + const TRequestStatus& aStatus ) + { + if ( aStatus == KErrNone && + aUid == KPSUidCtsyCallInformation && + aKey == KCTsyCallState ) + { + NotifyState(); + } + } + +// ----------------------------------------------------------------------------- +// CVtEngIncomingCallMonitor::CVtEngIncomingCallMonitor +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngIncomingCallMonitor::CVtEngIncomingCallMonitor() + { + } + +// ----------------------------------------------------------------------------- +// CVtEngIncomingCallMonitor::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVtEngIncomingCallMonitor::ConstructL() + { + __VTPRINTENTER( "IncomingCall.ConstructL" ) + // Listener for incoming call state + iIncomingCallListener = CVtEngPubSubsListener::NewL( + KPSUidCtsyCallInformation, KCTsyCallState, this ); + __VTPRINTEXIT( "IncomingCall.ConstructL" ) + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Base/cvtengmdtrcommandsender.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Base/cvtengmdtrcommandsender.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,460 @@ +/* +* Copyright (c) 2008 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: Mediator command sender implementation +* +*/ + + + +// INCLUDE FILES +#include "cvtengmdtrcommandsender.h" +#include "CVtEngEventManager.h" +#include "VtEngUtils.h" +#include "CVtEngSettings.h" +#include "CVtEngOperation.h" +#include "vtengcommands.h" +#include "CVtEngStateManager.h" +#include "VtEngPanic.h" +#include +#include +#include +#include +#include +#include + + +/** +* Three state classes for handling audio mute/unmute commands towards mediator when mute state +* is changed locally faster than mediator gives response. + + + IDLE <-------------------------| + | | + NotifyOutgoingAudioState( x ) / mediator.Send( x ) | + | | + v | + |--------------------------------------> SENDING -- CommandResponseL ---| + | | + | NotifyOutgoingAudioState( y ) / saveCommand( y ) + | | + | v + |- CommandResponseL( x ) / Send( y ) ---- BUFFERED + + + + +*/ +NONSHARABLE_CLASS( TVtMdtrStateIdle ) : public CBase +{ + public: + TVtMdtrStateIdle( CVtEngMdtrCommandSender& aSender, CMediatorCommandInitiator& aMediator ); + virtual void SendL( TUid aDomain, TUid aCategory, TInt aCommand ); + virtual void CommandResponseL( TUid aDomain, TUid aCategory, TInt aCommand, TInt aStatus ); + + TInt DoSend( TUid aDomain, TUid aCategory, TInt aCommand ); + + CVtEngMdtrCommandSender& iSender; + CMediatorCommandInitiator& iMediator; +}; + +NONSHARABLE_CLASS( TVtMdtrStateSending ) : public TVtMdtrStateIdle +{ + public: + TVtMdtrStateSending( CVtEngMdtrCommandSender& aSender, CMediatorCommandInitiator& aMediator ); + void SendL( TUid aDomain, TUid aCategory, TInt aCommand ); + void CommandResponseL( TUid aDomain, TUid aCategory, TInt aCommand, TInt aStatus ); +}; + +NONSHARABLE_CLASS( TVtMdtrStateBuffered ) : public TVtMdtrStateIdle +{ + public: + TVtMdtrStateBuffered( CVtEngMdtrCommandSender& aSender, CMediatorCommandInitiator& aMediator ); + void SendL( TUid aDomain, TUid aCategory, TInt aCommand ); + void CommandResponseL( TUid aDomain, TUid aCategory, TInt aCommand, TInt aStatus ); + + TUid iDomain; + TUid iCategory; + TInt iCommand; +}; + + +// CONSTANTS +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngMdtrCommandListener::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtEngMdtrCommandSender* CVtEngMdtrCommandSender::NewL( CVtEngUtility& aUtils ) + { + __VTPRINTENTER( "CVtEngMdtrCommandSender.NewL" ) + CVtEngMdtrCommandSender* self = new ( ELeave ) + CVtEngMdtrCommandSender( aUtils ); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop(); + + __VTPRINTEXIT( "CVtEngMdtrCommandSender.NewL" ) + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngMdtrCommandListener::~CVtEngMdtrCommandSender +// destructor +// ----------------------------------------------------------------------------- +// +CVtEngMdtrCommandSender::~CVtEngMdtrCommandSender() + { + iUtils.EventManager().RemoveObserver( this ); + delete iMediatorInitiator; + } + +// ----------------------------------------------------------------------------- +// CVtEngMdtrCommandListener::EndCall +// Sends end call command via Mediator +// ----------------------------------------------------------------------------- +// +void CVtEngMdtrCommandSender::EndCall( ) + { + __VTPRINTENTER( "CVtEngMdtrCommandSender.EndCall" ) + const TVersion KTelephonyCmdVersion( + KTelephonyCommandsVersionMajor, + KTelephonyCommandsVersionMinor, + KTelephonyCommandsVersionBuild ); + const TInt res = + iMediatorInitiator->IssueCommand( + KMediatorTelephonyDomain, + KCatCommandsToTelephony, + EPhoneCmdEndActiveCall, + KTelephonyCmdVersion, + KNullDesC8() ); + + __VTPRINTEXITR( "CVtEngMdtrCommandSender.EndCall res=%d", res ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMdtrCommandListener::VoiceFallback +// Sends voice fallback command to telephony via Mediator +// ----------------------------------------------------------------------------- +// +void CVtEngMdtrCommandSender::VoiceFallback() + { + __VTPRINTENTER( "CVtEngMdtrCommandSender.VoiceFallback" ) + const TVersion KVtToPhoneCmdVersion( + KVideoTelToPhoneCmdVersionMajor, + KVideoTelToPhoneCmdVersionMinor, + KVideoTelToPhoneCmdVersionBuild ); +#ifdef _DEBUG + TInt err = +#endif + iMediatorInitiator->IssueCommand( + KMediatorTelephonyDomain, + KCatVideoTelToPhoneCommands, + EVtCmdFallback, + KVtToPhoneCmdVersion, + KNullDesC8() ); + // response is not awaited + __VTPRINTEXITR( "CVtEngMdtrCommandSender.VoiceFallback %d>", err ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMdtrCommandListener::SwitchToVoiceL +// Sends switch to voice command to telephony via Mediator +// ----------------------------------------------------------------------------- +// +void CVtEngMdtrCommandSender::SwitchToVoiceL( CVtEngOperation& aOperation ) + { + __VTPRINTENTER( "CVtEngMdtrCommandSender.SwitchToVoiceL" ) + iOperation = &aOperation; + // add this as observer. Mediator command is sent when idle state + // is reached (i.e. Protocol has released dataport and it can be recovered + // by telephony) + iUtils.EventManager().AddObserverL( this ); + // let current state handle actual request + iUtils.StateManager()->HandleOperationL( aOperation ); + __VTPRINTEXIT( "CVtEngMdtrCommandSender.SwitchToVoiceL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMdtrCommandListener::NotifyOutgoingAudioState +// Sends microphone state to telephony via Mediator +// ----------------------------------------------------------------------------- +// +void CVtEngMdtrCommandSender::NotifyOutgoingAudioState( + const TBool aMicEnabled ) + { + __VTPRINTENTER( "CVtEngMdtrCommandSender.NotifyOutgoingAudioState" ) + + const TInt command = ( aMicEnabled ) + ? EAudioCmdUnmute : EAudioCmdMute; +#ifdef _DEBUG + TRAPD( res, iSenderState->SendL( + KMediatorTelephonyDomain, + KCatAudioCommandsToTelephony, + command ) ); +#else + TRAP_IGNORE(iSenderState->SendL( + KMediatorTelephonyDomain, + KCatAudioCommandsToTelephony, + command ) ); +#endif + + __VTPRINTEXITR( "CVtEngMdtrCommandSender.NotifyOutgoingAudioState %d", res ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMdtrCommandListener::SetSenderState +// sets new mediator sender state for audio command +// ----------------------------------------------------------------------------- +// +void CVtEngMdtrCommandSender::SetSenderState( TVtMdtrStateIdle& aNewState ) + { + __VTPRINTENTER( "CVtEngMdtrCommandSender.SetSenderState" ) + __VTPRINT2( DEBUG_GEN, " delete old state %x", (TInt) iSenderState ) + __ASSERT_DEBUG( iSenderState != &aNewState, + Panic( EVtEngPanicWrongMediatorSenderState ) ); + delete iSenderState; + iSenderState = &aNewState; + __VTPRINTEXITR( "CVtEngMdtrCommandSender.SetSenderState %x", (TInt) iSenderState ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMdtrCommandListener::CommandResponseL +// Mediator framework callback +// ----------------------------------------------------------------------------- +// +void CVtEngMdtrCommandSender::CommandResponseL( TUid aDomain, + TUid aCategory, + TInt aCommandId, + TInt aStatus, + const TDesC8& /*aData*/ ) + { + __VTPRINTENTER( "CVtEngMdtrCommandSender.CommandResponseL" ) + switch ( aCommandId ) + { + case EAudioCmdUnmute: + case EAudioCmdMute: + iSenderState->CommandResponseL( aDomain, aCategory, aCommandId, aStatus ); + break; + default: + // ignored for other commands (so far) + break; + } + __VTPRINT2( DEBUG_GEN, " mediator command id=%d", aCommandId ) + __VTPRINTEXITR( "CVtEngMdtrCommandSender.CommandResponseL res=%d", aStatus ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMdtrCommandListener::HandleVtEventL +// Handles state change event associated with "switch to voice" and "TerminateSession" command +// ----------------------------------------------------------------------------- +// +void CVtEngMdtrCommandSender::HandleVtEventL( TInt aEvent ) + { + __VTPRINTENTER( "CVtEngMdtrCommandSender.HandleVtEventL" ) +#ifdef _DEBUG + TInt err = KErrNone; +#endif + if ( aEvent == KVtEngSessionStateChanged && + iOperation && iOperation->Command() == KVtEngSwitchToVoice ) + { + const TVersion KVtToPhoneCmdVersion( + KVideoTelToPhoneCmdVersionMajor, + KVideoTelToPhoneCmdVersionMinor, + KVideoTelToPhoneCmdVersionBuild ); + + iUtils.EventManager().RemoveObserver( this ); + // send command (ignore possible error - no way to recover from it) +#ifdef _DEBUG + err = +#endif + iMediatorInitiator->IssueCommand( + //KMediatorVideoTelephonyDomain, + KMediatorTelephonyDomain, + KCatVideoTelToPhoneCommands, + EVtCmdSwitchToVoice, + KVtToPhoneCmdVersion, + KNullDesC8() ); + iOperation->HandleOpComplete( KErrNone ); + iOperation = NULL; + } + __VTPRINTEXITR( "CVtEngMdtrCommandSender.HandleVtEventL %d", err ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMdtrCommandListener:: +// c++ constructor +// ----------------------------------------------------------------------------- +// +CVtEngMdtrCommandSender::CVtEngMdtrCommandSender( CVtEngUtility& aUtils ) : + iUtils( aUtils ) + { + __VTPRINTENTER( "CVtEngMdtrCommandSender.CVtEngMdtrCommandSender" ) + __VTPRINTEXIT( "CVtEngMdtrCommandSender.CVtEngMdtrCommandSender" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMdtrCommandListener::ConstructL +// +// ----------------------------------------------------------------------------- +// +void CVtEngMdtrCommandSender::ConstructL() + { + __VTPRINTENTER( "CVtEngMdtrCommandSender.ConstructL" ) + iMediatorInitiator = CMediatorCommandInitiator::NewL( this ); + + // set initial mediator command sender state + iSenderState = new ( ELeave ) TVtMdtrStateIdle( *this, *iMediatorInitiator ); + __VTPRINTEXIT( "CVtEngMdtrCommandSender.ConstructL" ) + } + +TVtMdtrStateIdle::TVtMdtrStateIdle( CVtEngMdtrCommandSender& aSender, CMediatorCommandInitiator& aMediator ) +: iSender( aSender), iMediator( aMediator ) + { + __VTPRINTENTER( "TVtMdtrStateIdle.ctr" ) + __VTPRINTEXITR( "TVtMdtrStateIdle.ctr %x", (TInt) this ) + } + +void TVtMdtrStateIdle::SendL( TUid aDomain, TUid aCategory, TInt aCommand ) + { + __VTPRINTENTER( "TVtMdtrStateIdle.SendL" ) + TVtMdtrStateIdle* nextState = NULL; + const TInt res = DoSend( aDomain, aCategory, aCommand ); + if ( res == KErrInUse ) + { + nextState = new ( ELeave ) TVtMdtrStateBuffered( iSender, iMediator ); + CleanupStack::PushL( nextState ); + nextState->SendL( aDomain, aCategory, aCommand ); + CleanupStack::Pop( nextState ); + } + else + { + nextState = new ( ELeave ) TVtMdtrStateSending( iSender, iMediator ); + } + iSender.SetSenderState( *nextState ); + __VTPRINTEXIT( "TVtMdtrStateIdle.SendL" ) + } + +TInt TVtMdtrStateIdle::DoSend( TUid aDomain, TUid aCategory, TInt aCommand ) + { + __VTPRINTENTER( "TVtMdtrStateIdle.DoSend" ) + const TVersion KVtToPhoneCmdVersion( + KVideoTelToPhoneCmdVersionMajor, + KVideoTelToPhoneCmdVersionMinor, + KVideoTelToPhoneCmdVersionBuild ); + + TInt res = iMediator.IssueCommand( + aDomain, + aCategory, + aCommand, + KVtToPhoneCmdVersion, + KNullDesC8() ); + __VTPRINTEXITR( "TVtMdtrStateIdle.DoSend res=%d", res ) + return res; + } + +void TVtMdtrStateIdle::CommandResponseL( TUid /*aDomain*/, TUid /*aCategory*/, TInt /*aCommand*/, TInt /*aStatus*/ ) + { + __VTPRINTENTER( "TVtMdtrStateIdle.CommandResponseL" ) + // base class method should never be possible to call + __VTPRINTEXIT( "TVtMdtrStateIdle.CommandResponseL" ) + } + +TVtMdtrStateSending::TVtMdtrStateSending( CVtEngMdtrCommandSender& aSender, CMediatorCommandInitiator& aMediator ) +: TVtMdtrStateIdle( aSender, aMediator ) + { + __VTPRINTENTER( "TVtMdtrStateSending.ctr" ) + __VTPRINTEXITR( "TVtMdtrStateSending.ctr %x", (TInt) this ) + } + +void TVtMdtrStateSending::SendL( TUid aDomain, TUid aCategory, TInt aCommand ) + { + __VTPRINTENTER( "TVtMdtrStateSending.SendL" ) + TVtMdtrStateIdle* buffered = new ( ELeave )TVtMdtrStateBuffered( iSender, iMediator ); + CleanupStack::PushL( buffered ); + buffered->SendL( aDomain, aCategory, aCommand ); + CleanupStack::Pop( buffered ); + iSender.SetSenderState( *buffered ); + __VTPRINTEXIT( "TVtMdtrStateSending.SendL" ) + } + +void TVtMdtrStateSending::CommandResponseL( TUid aDomain, TUid aCategory, TInt aCommand, TInt aStatus ) + { + __VTPRINTENTER( "TVtMdtrStateSending.CommandResponseL" ) + __VTPRINT2( DEBUG_GEN, " command=%d", aCommand ) + __VTPRINT2( DEBUG_GEN, " response=%d", aStatus ) + TVtMdtrStateIdle* idle = new ( ELeave ) TVtMdtrStateIdle( iSender, iMediator ); + iSender.SetSenderState( *idle ); + __VTPRINTEXIT( "TVtMdtrStateSending.CommandResponseL" ) + } + +TVtMdtrStateBuffered::TVtMdtrStateBuffered( CVtEngMdtrCommandSender& aSender, CMediatorCommandInitiator& aMediator ) +: TVtMdtrStateIdle( aSender, aMediator ) + { + __VTPRINTENTER( "TVtMdtrStateBuffered.ctr" ) + __VTPRINTEXITR( "TVtMdtrStateBuffered.ctr %x", (TInt) this ) + } + +void TVtMdtrStateBuffered::SendL( TUid aDomain, TUid aCategory, TInt aCommand ) + { + __VTPRINTENTER( "TVtMdtrStateBuffered.SendL" ) + + iDomain = aDomain; + iCategory = aCategory; + iCommand = aCommand; + // iCommand is sent in CommandResponseL + __VTPRINTEXIT( "TVtMdtrStateBuffered.SendL" ) + } + +void TVtMdtrStateBuffered::CommandResponseL( TUid aDomain, TUid aCategory, TInt aCommand, TInt aStatus ) + { + __VTPRINTENTER( "TVtMdtrStateBuffered.CommandResponseL" ) + const TVersion KVtToPhoneCmdVersion( + KVideoTelToPhoneCmdVersionMajor, + KVideoTelToPhoneCmdVersionMinor, + KVideoTelToPhoneCmdVersionBuild ); + TBool nextStateIdle = ETrue; + TInt res = KErrNone; + if ( aCommand != iCommand ) + { + res = iMediator.IssueCommand( + KMediatorTelephonyDomain, + KCatAudioCommandsToTelephony, + iCommand, + KVtToPhoneCmdVersion, + KNullDesC8() ); + if ( res == KErrNone ) + { + nextStateIdle = EFalse; + } + } + TVtMdtrStateIdle* nextState = NULL; + if ( nextStateIdle ) + { + __VTPRINT2( DEBUG_GEN, " failed to send buffered command with error=%d", res ) + nextState = new ( ELeave ) TVtMdtrStateIdle( iSender, iMediator ); + } + else + { + nextState = new ( ELeave ) TVtMdtrStateSending( iSender, iMediator ); + CleanupStack::PushL( nextState ); + nextState->SendL( iDomain, iCategory, iCommand ); + CleanupStack::Pop( nextState ); + } + iSender.SetSenderState( *nextState ); + __VTPRINTEXIT( "TVtMdtrStateBuffered.CommandResponseL" ) + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Base/cvtengmdtrmessagelistener.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Base/cvtengmdtrmessagelistener.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,322 @@ +/* +* Copyright (c) 2008 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: Mediator event listener implementation +* +*/ + + + +// INCLUDE FILES +#include "cvtengmdtrmessagelistener.h" +#include "VtEngUtils.h" +#include "CVtEngSettings.h" +#include "CVtEngEventManager.h" +#include "cvtengmediatorservice.h" + +#include +#include +#include +#include +#include +#include + +// CONSTANTS + +// mediator command timeout +static const TInt KVtEngMdtrCmdTimeout = 500000; + +// array granularity is 2 (enable mic, disable mic commands) +static const TInt KVtEngMdtrCmdArrayGranularity = 2; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngMdtrMessageListener::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtEngMdtrMessageListener* CVtEngMdtrMessageListener::NewL( + CVtEngUtility& aUtils ) + { + __VTPRINTENTER( "CVtEngMdtrMessageListener.NewL" ) + CVtEngMdtrMessageListener* self = new( ELeave ) + CVtEngMdtrMessageListener( aUtils ); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop(); + __VTPRINTEXIT( "CVtEngMdtrMessageListener.NewL" ) + return self; + } + +// Destructor +CVtEngMdtrMessageListener::~CVtEngMdtrMessageListener() + { + // ignore error in unregistering + if ( iMediatorResponder ) + { + iMediatorResponder->UnregisterCommand( + KMediatorVideoTelephonyDomain, + KCatPhoneToVideotelCommands, + iCommandList ); + iCommandList.Close(); + iMediatorResponder->UnregisterCommand( + KMediatorVideoTelephonyDomain, + KCatVideotelInternalCommands, + EVtMediatorReleaseDataport ); + + delete iMediatorResponder; + } + + + // ignore error in unregistering + if ( iMediatorEvents ) + { + iMediatorEvents->UnsubscribeEvent( KMediatorVideoTelephonyDomain, + KCatVideotelInternalEvents, + EVtMediatorEventVideoCallInformation ); + delete iMediatorEvents; + } + + } + +// ----------------------------------------------------------------------------- +// CVtEngMdtrMessageListener::MediatorCommandL +// Receives mediator command and passes it to service object +// ----------------------------------------------------------------------------- +// +void CVtEngMdtrMessageListener::MediatorCommandL( + TUid /*aDomain*/, + TUid aCategory, + TInt aCommandId, + TVersion /*aVersion*/, + const TDesC8& /*aData*/ ) + { + __VTPRINTENTER( "CVtEngMdtrMessageListener.MediatorCommandL" ) + // service object destroys itself after sending command response + CVtEngMediatorService::StartLD( *iMediatorResponder, iUtils, aCategory, aCommandId ); + __VTPRINTEXIT( "CVtEngMdtrMessageListener.MediatorCommandL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMdtrMessageListener::CancelMediatorCommand +// Cancallation of mediator command. no-op, just returns response. +// ----------------------------------------------------------------------------- +// +void CVtEngMdtrMessageListener::CancelMediatorCommand( + TUid /*aDomain*/, + TUid /*aCategory*/, + TInt /*aCommandId*/ ) + { + __VTPRINTENTER( "CVtEngMdtrMessageListener.CancelMediatorCommand" ) + // No-op + __VTPRINTEXIT( "CVtEngMdtrMessageListener.CancelMediatorCommand" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMdtrEventListener::MediatorEventL +// Receives mediator event from VT Mediator Plugin. The event +// contains CLI and/or Dataport name. +// ----------------------------------------------------------------------------- +// +void CVtEngMdtrMessageListener::MediatorEventL( TUid /*aDomain*/, + TUid aCategory, + TInt aEventId, + const TDesC8& aData ) + { + __VTPRINTENTER( "CVtEngMdtrMessageListener.MediatorEventL" ) + if ( aCategory == KCatVideotelInternalEvents && + aEventId == EVtMediatorEventVideoCallInformation ) + { + TVtMediatorInfoPackage package; + package.Copy( aData ); + TVtVideoTelephonyCallInformation data = package(); + __VTPRINT2( DEBUG_GEN, " VT call info data validity value=%d", + data.iEventDataValidity) + // if message contains dataport name save it + CVtEngSettings& settings = iUtils.Settings(); + if ( data.iEventDataValidity & + TVtVideoTelephonyCallInformation::EDataportValid ) + { + //__VTPRINT(DEBUG_GEN, " Dataport is ready") + settings.SetDataportInfoL( data.iDataport ); + } + // if message contains CLI info handle it (save and notify if state + // allows) + if ( data.iEventDataValidity & + TVtVideoTelephonyCallInformation::EDisplayTextValid ) + { + MVtEngSessionInfo::TCLI cli; + cli.iCallId = data.iCallId; + cli.iName = data.iDisplayText.Left( cli.iName.MaxLength() ); + cli.iVoiceCallPossible = data.iVoiceCallPossible; + cli.iCallNumber = data.iPhoneNumText.Left( cli.iCallNumber.MaxLength() ); + settings.SetCLI( cli ); + + // ready == call is answered (allows setting app to foreground) + if ( IsReadyForCLIEvent() ) + { + // send event about CLI availability + CVtEngEventManager::NotifyEvent( KVtEngCLIAvailable ); + } + else + { + // Wait until connected state is reached (see HandleVtEventL) + __VTPRINT( DEBUG_GEN, + "CVtEngMdtrMessageListener defer CLI event" ) + iUtils.EventManager().AddObserverL( this ); + } + } + } + __VTPRINTEXIT( "CVtEngMdtrMessageListener.MediatorEventL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMdtrMessageListener::HandleVtEventL +// +// Handles defered CLI event dispatching (to UI). CLI event was defered because +// engine state was not suitable in MediatorEventL which then started observing +// state changes. +// ----------------------------------------------------------------------------- +// +void CVtEngMdtrMessageListener::HandleVtEventL( TInt aEvent ) + { + __VTPRINTENTER( "CVtEngMdtrMessageListener.HandleVtEventL" ) + if ( aEvent == KVtEngSessionStateChanged && + IsReadyForCLIEvent() ) // <- ready == call is answered + { + iUtils.EventManager().RemoveObserver( this ); + __VTPRINT( DEBUG_GEN, + "CVtEngMdtrMessageListener dispatch defered CLI event" ) + CVtEngEventManager::NotifyEvent( KVtEngCLIAvailable ); + } + + __VTPRINTEXIT( "CVtEngMdtrMessageListener.HandleVtEventL" ) + } + + +// ----------------------------------------------------------------------------- +// CVtEngMdtrMessageListener::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVtEngMdtrMessageListener::ConstructL() + { + __VTPRINTENTER( "CVtEngMdtrMessageListener.ConstructL" ) + + // for sending command responses + iMediatorResponder = CMediatorCommandResponder::NewL( this ); + + // for receiving events from VT Mediator Plugin (dataport/CLI info) + iMediatorEvents = CMediatorEventConsumer::NewL( this ); + + TCapabilitySet capSet; + capSet.SetEmpty(); + // for audio control + capSet.AddCapability( ECapabilityWriteDeviceData ); + + // define common attributes for all commands that engine is responsible for + MediatorService::TCommand command; + command.iCaps = capSet; + command.iVersion = TVersion( + KPhoneToVideotelCmdVersionMajor, + KPhoneToVideotelCmdVersionMinor, + KPhoneToVideotelCmdVersionBuild ); + command.iTimeout = KVtEngMdtrCmdTimeout; + + // enable microphone command + command.iCommandId = EVtCmdUnmute; + iCommandList.Append( command ); + + // disable microphone command + command.iCommandId = EVtCmdMute; + iCommandList.Append( command ); + + // register VT events that are raised by VT Mediator Plugin. + // !!! Note !!!! + // event subscription must be done before command registration because + // command registration triggers raising the event in the plugin. Different + // order would cause the engine to miss the event. + const TVersion commandVersion( + KVideotelMdtrCommandsVersionMajor, + KVideotelMdtrCommandsVersionMinor, + KVideotelMdtrCommandsVersionBuild ); + //capSet.SetEmpty(); + //capSet.AddCapability( ECapabilityPowerMgmt ); + + iMediatorResponder->RegisterCommand( + KMediatorVideoTelephonyDomain, + KCatVideotelInternalCommands, + EVtMediatorReleaseDataport, + commandVersion, + capSet, + KVtEngMdtrCmdTimeout ); + + const TVersion eventVersion( + KTelephonyEventsVersionMajor, + KTelephonyEventsVersionMinor, + KTelephonyEventsVersionBuild ); + + TInt res = iMediatorEvents->SubscribeEvent( KMediatorVideoTelephonyDomain, + KCatVideotelInternalEvents, + EVtMediatorEventVideoCallInformation, + eventVersion ); + + if ( res == KErrNone ) + { + // register Mediator commands that we handle + res = iMediatorResponder->RegisterCommand( + KMediatorVideoTelephonyDomain, + KCatPhoneToVideotelCommands, + iCommandList ); + + } + __VTPRINTEXITR( "CVtEngMdtrMessageListener.ConstructL res=%d",res ) + // registering must not fail + User::LeaveIfError( res ); + } + +// ----------------------------------------------------------------------------- +// CVtEngMdtrMessageListener::CVtEngMdtrMessageListener +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngMdtrMessageListener::CVtEngMdtrMessageListener( CVtEngUtility& aUtils) + : iUtils( aUtils ), iCommandList( KVtEngMdtrCmdArrayGranularity ) + { + __VTPRINTENTER( "CVtEngMdtrMessageListener.CVtEngMdtrMessageListener" ) + __VTPRINTEXIT( "CVtEngMdtrMessageListener.CVtEngMdtrMessageListener" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMdtrMessageListener::IsReadyForCLIEvent +// Checks if engine state is appropriate to send CLI event. +// ----------------------------------------------------------------------------- +// +TBool CVtEngMdtrMessageListener::IsReadyForCLIEvent() const + { + __VTPRINTENTER( "CVtEngMdtrMessageListener.IsReadyForCLIEvent" ) + const MVtEngSessionInfo::TSessionState state = + iUtils.StateManager()->SessionState(); + const TBool isReady = + ( state == MVtEngSessionInfo::EConnected || + state == MVtEngSessionInfo::ENegotiating || + state == MVtEngSessionInfo::EOpen ); + __VTPRINTEXITR( "CVtEngMdtrMessageListener.IsReadyForCLIEvent %d>", + isReady ) + return isReady; + } + +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Base/cvtengmediatorservice.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Base/cvtengmediatorservice.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,301 @@ +/* +* Copyright (c) 2008 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: Mediator service implementation +* +*/ + + + +// INCLUDE FILES +#include "cvtengmediatorservice.h" +#include "cvtenginternaloperation.h" +#include "CVtEngStateManager.h" +#include "CVtEngEventManager.h" +#include "VtEngUtils.h" +#include "CVtEngSettings.h" +#include +#include +#include +#include +#include +#include + +// CONSTANTS + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngMediatorService::StartLD +// Mediator service starter. +// ----------------------------------------------------------------------------- +// +void CVtEngMediatorService::StartLD( + CMediatorCommandResponder& aResponder, + CVtEngUtility& aUtils, + const TUid aCategory, + const TInt aCommand ) + { + __VTPRINTENTER( "CVtEngMediatorService.StartLD" ) + CVtEngMediatorService* self = new ( ELeave ) CVtEngMediatorService( + aResponder, aUtils, aCategory, aCommand ); + CleanupStack::PushL( self ); + self->ConstructAndDoServiceL(); + CleanupStack::Pop(); + __VTPRINTEXIT( "CVtEngMediatorService.StartLD" ) + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +// +CVtEngMediatorService::~CVtEngMediatorService() + { + // ensure this is removed + __VTPRINTENTER( "CVtEngMediatorService::~CVtEngMediatorService" ) + iUtils.EventManager().RemoveObserver( this ); + + // send response if destructed due to leave in ConstructAndDoServiceL + SendMediatorResponseD( EFalse ); + __VTPRINTEXIT( "CVtEngMediatorService::~CVtEngMediatorService" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediatorService::SetOperation +// ----------------------------------------------------------------------------- +// +void CVtEngMediatorService::SetOperation( CVtEngOperation* /*aActiveOp*/ ) + { + __VTPRINTENTER( "CVtEngMediatorService.SetOperation" ) + // no-op + __VTPRINTEXIT( "CVtEngMediatorService.SetOperation" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediatorService::CommandCompleteL +// callback to internal operation. +// ----------------------------------------------------------------------------- +// +void CVtEngMediatorService::CommandCompleteL( + const TVtEngCommandId /*aCommand*/, + const TInt aResult ) + { + __VTPRINTENTER( "CVtEngMediatorService.CommandCompleteL" ) + + iServiceStatus = aResult; + + // Sends response to Telephony if not already sent by + // HandleVtEventL -> SendMediatorResponseD + SendMediatorResponseD( ETrue ); + __VTPRINTEXITR( "CVtEngMediatorService.CommandCompleteL %d", aResult ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediatorService::HandleVtEventL +// ----------------------------------------------------------------------------- +// +void CVtEngMediatorService::HandleVtEventL( TInt aEvent ) + { + __VTPRINTENTER( "CVtEngMediatorService.HandleVtEventL" ) + + // This is registered event observer when shutdown mediator command was + // received. Now send response if state precondition is met + if ( aEvent == KVtEngSessionStateChanged && + IsShuttingDown() ) + { + // no interest on events any more, task fulfilled + iUtils.EventManager().RemoveObserver( this ); + + // iServiceStatus used for mediator response + iServiceStatus = KErrNone; + + SendMediatorResponseD( EFalse ); + } + __VTPRINTEXIT( "CVtEngMediatorService.HandleVtEventL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediatorService::CVtEngMediatorService +// ----------------------------------------------------------------------------- +// +CVtEngMediatorService::CVtEngMediatorService( + CMediatorCommandResponder& aResponder, + CVtEngUtility& aUtils, + const TUid aCategory, + const TInt aCommandId ) : + iResponder( aResponder ), + iUtils( aUtils ), + iCategory( aCategory ), + iCommandId( aCommandId ), + iServiceStatus( KErrNotReady ) + { + __VTPRINTENTER( "CVtEngMediatorService.CVtEngMediatorService" ) + __VTPRINTEXIT( "CVtEngMediatorService.CVtEngMediatorService" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediatorService::ConstructAndDoServiceL +// ----------------------------------------------------------------------------- +// +void CVtEngMediatorService::ConstructAndDoServiceL() + { + __VTPRINTENTER( "CVtEngMediatorService.ConstructAndDoServiceL" ) + __VTPRINT2( DEBUG_GEN, " CVtEngMediatorService.ConstructAndDoServiceL command id=%d", iCommandId ) + // if starting of any operation below fails (StartOperationL leaves), + // this object is deleted. Destructor sends mediator response. + // non-supported command leads to leave+destructor also (see default case) + if ( KCatVideotelInternalCommands == iCategory) + { + switch ( iCommandId ) + { + case EVtMediatorReleaseDataport: + if ( !IsShuttingDown() ) + { + // Mediator response is sent when state becomes appropriate, + // indicated by call to HandleVtEventL, or + // when operation callback CommandCompleteL is called, + // which ever comes first. However, this object is deleted + // only after operation callback is received. + iUtils.EventManager().AddObserverL( this ); + StartOperationL( KVtEngTerminateSession ); + } + // if already shutting down this is no op (and self destructed) + // if get this command because endactivecall from vt menu, do not do any op from here + else + { + SendMediatorResponseD(EFalse); + } + break; + default: + // requested command that is not supported, issue "failed" response + iServiceStatus = KErrNotSupported; + break; + } + } + else + { + switch ( iCommandId ) + { + case EVtCmdUnmute: + case EVtCmdMute: + { + TVtEngCommandId engineCmd = ( iCommandId == + EVtCmdUnmute ) ? KVtEngUnmuteOutgoingAudio : + KVtEngMuteOutgoingAudio; + if ( !IsShuttingDown() ) + { + StartOperationL( engineCmd ); + } + else + { + SendMediatorResponseD(EFalse); + } + } + break; + default: + // requested command that is not supported, issue "failed" response + iServiceStatus = KErrNotSupported; + break; + } + } + if ( iServiceStatus != KRequestPending && !IsShuttingDown() ) + { // results in destruction of this object and sending of mediator + // response with error + //__VTPRINT2( DEBUG_GEN, "CVtEngMediatorService.ConstructAndDoServiceL leave by iServiceStatus: %d", iServiceStatus ) + User::Leave( iServiceStatus ); + } + + __VTPRINTEXIT( "CVtEngMediatorService.ConstructAndDoServiceL" ) + } +// ----------------------------------------------------------------------------- +// CVtEngMediatorService::IsShuttingDown +// Checks if shutdown is ongoing +// ----------------------------------------------------------------------------- +// +TBool CVtEngMediatorService::IsShuttingDown() const + { + __VTPRINTENTER( "CVtEngMediatorService.IsShuttingDown" ) + const MVtEngSessionInfo::TSessionState state = + iUtils.StateManager()->SessionState(); + TBool isShuttingDown = EFalse; + + // consider shutdown true if clearing or idle + if ( state == MVtEngSessionInfo::EClearing || + state == MVtEngSessionInfo::EIdle ) + { + isShuttingDown = ETrue; + } + __VTPRINTEXITR( "CVtEngMediatorService.IsShuttingDown %d", + isShuttingDown ) + return isShuttingDown; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediatorService::StartOperationL +// ----------------------------------------------------------------------------- +// +void CVtEngMediatorService::StartOperationL( const TVtEngCommandId aCommand ) + { + __VTPRINTENTER( "CVtEngMediatorService.StartOperationL" ) + iOperation = CVtEngInternalOperation::NewL( + aCommand, + iUtils.StateManager()->Handlers(), + *this ); + iOperation->ExecuteL(); + iServiceStatus = KRequestPending; + __VTPRINTEXIT( "CVtEngMediatorService.StartOperationL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediatorService::SendMediatorResponseD +// ----------------------------------------------------------------------------- +// +void CVtEngMediatorService::SendMediatorResponseD( const TBool aDeleteThis ) + { + __VTPRINTENTER( "CVtEngMediatorService.SendMediatorResponseD" ) + __VTPRINT2( DEBUG_GEN, "CVtEngMediatorService.SendMediatorResponseD command: %d", iCommandId ) + if ( iCommandId != KErrNotFound ) + { + if ( iCategory == KCatVideotelInternalCommands && iCommandId == EVtMediatorReleaseDataport ) + { + iResponder.IssueResponse( + KMediatorVideoTelephonyDomain, + KCatVideotelInternalCommands, + iCommandId, + iServiceStatus, + KNullDesC8() ); + } + else + { + iResponder.IssueResponse( + KMediatorVideoTelephonyDomain, + KCatPhoneToVideotelCommands, + iCommandId, + iServiceStatus, + KNullDesC8() ); + } + + // prevents further response because destructor also calls this method + iCommandId = KErrNotFound; + } + if ( aDeleteThis ) + { + // note! check above is mandatory because this method is called + // also from destructor. + delete this; + } + __VTPRINTEXIT( "CVtEngMediatorService.SendMediatorResponseD" ) + } + +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Commands/CVtEngCommandHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Commands/CVtEngCommandHandler.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,560 @@ +/* +* 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: Handles commands from user interface. +* +*/ + + + +// INCLUDE FILES + +#include +#include "CVtEngCommandHandler.h" +#include "CVtEngHandlerContainer.h" +#include "MVtEngCommandObserver.h" +#include "CVtEngOperation.h" +#include +#include "CVtEngStateManager.h" +#include +#include "VtEngUtils.h" + +#include "CVtEngStateIdle.h" +#include "CVtEngStateInitializing.h" +#include "CVtEngStateConnected.h" +#include "CVtEngStateRinging.h" +#include "CVtEngStateOpen.h" +#include "CVtEngStateNegotiating.h" +#include "CVtEngStateClearing.h" +#include "CVtEngStateAlerting.h" + +// CONSTANTS +const TInt KVtEngCommandPoolCommands = 1; + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::CVtEngCommandHandler +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngCommandHandler::CVtEngCommandHandler( + CVtEngHandlerContainer& aHandlers ) : + iObservers( 1 ), + iHandlers( aHandlers ), + iInvalidCommandId( KVtEngCommandNone ) + { + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVtEngCommandHandler::ConstructL() + { + __VTPRINTENTER( "CmdHlr.ConstructL" ) + iCommandPool = new ( ELeave ) CVtEngCmdPool( KVtEngCommandPoolCommands ); + + // session termination + AddToPoolL( KVtEngInitializeEngine ); + AddToPoolL( KVtEngInitializeEngineDiag ); + AddToPoolL( KVtEngInitializeEngineTest ); + AddToPoolL( KVtEngPrepareViewFinder ); + AddToPoolL( KVtEngPrepareRemoteRenderDSA ); + AddToPoolL( KVtEngPrepareRemoteRenderDP ); + AddToPoolL( KVtEngPrepareRemoteRenderNGA ); + AddToPoolL( KVtEngResetEngine ); + __VTPRINTEXIT( "CmdHlr.ConstructL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtEngCommandHandler* CVtEngCommandHandler::NewL( CVtEngHandlerContainer& aHandlers ) + { + __VTPRINT( DEBUG_GEN | DEBUG_CONSTRUCT, "CmdHlr.New") + CVtEngCommandHandler* self = new( ELeave ) CVtEngCommandHandler( aHandlers ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + + +// Destructor +CVtEngCommandHandler::~CVtEngCommandHandler() + { + __VTPRINTENTER( "CmdHlr.~" ) + iObservers.Close(); + if ( iActiveOp ) + { + if ( iCommandPool->Get( iActiveOp->Command() ) == NULL ) + { + delete iActiveOp; + } + } + delete iCommandPool; + __VTPRINTEXIT( "CmdHlr.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::ExecuteL +// +// ----------------------------------------------------------------------------- +// +void CVtEngCommandHandler::ExecuteL( + const TVtEngCommandId aCommandId, + TDesC8* aParams ) + { + __VTPRINTENTER( "CmdHlr.ExecuteL" ) + + __VTPRINT2( DEBUG_GEN, "ComHlr:Exec cmdId=%d", aCommandId ) + ValidateL( aCommandId, aParams ); + CVtEngOperation* opFromPool = iCommandPool->Get( aCommandId ); + CVtEngOperation* op = opFromPool; + if ( op == NULL ) + { + op = CVtEngOperation::NewL( aCommandId, iHandlers, *this ); + CleanupStack::PushL( op ); + } + + switch ( aCommandId ) + { + case KVtEngInitializeEngine: + case KVtEngInitializeEngineTest: + case KVtEngInitializeEngineDiag: + case KVtEngResetEngine: + case KVtEngTerminateSession: + case KVtEngStartViewFinder: + case KVtEngStopViewFinder: + case KVtEngStartRenderRemote: + case KVtEngStopRenderRemote: + case KVtEngPauseRenderRemote: + case KVtEngMuteOutgoingAudio: + case KVtEngUnmuteOutgoingAudio: + case KVtEngStopDtmfTone: + case KVtEngRequestLastRemoteFrame: + // Handling of different UIIs + case KVtEngSetUIIDtmfSupport: + case KVtEngSetUIIBasicStringSupport: + case KVtEngSetUIIIA5StringSupport: + case KVtEngSetUIIGeneralStringSupport: + case KVtEngFreeze: + case KVtEngUnfreeze: + case KVtEngHandleLayoutChange: + + // Media object sharing (no parameters ) + case KVtEngStartShareImage: + case KVtEngStopShareImage: + op->ExecuteL( NULL ); + break; + // Media + case KVtEngSetUIForeground: + case KVtEngPrepareCamera: + case KVtEngPrepareViewFinder: + case KVtEngPrepareViewFinderDSA: + case KVtEngPrepareRemoteRenderDSA: + case KVtEngPrepareViewFinderDP: + case KVtEngPrepareRemoteRenderDP: + case KVtEngPrepareRemoteRenderNGA: + case KVtEngSetSource: + case KVtEngSetZoomStep: + case KVtEngSetAudioRouting: + case KVtEngSetAudioVolume: + case KVtEngIncreaseAudioVolume: + case KVtEngDecreaseAudioVolume: + case KVtEngSendDtmf: + case KVtEngStartDtmfTone: + case KVtEngSetVideoQuality: + case KVtEngSwitchToVoice: + // Extension commands + case KVtEngSetContrast: + case KVtEngSetBrightness: + case KVtEngSetWhiteBalance: + case KVtEngSetColorTone: +#if defined ( RD_VT_RTF ) + case KVtEngStartRecord: + case KVtEngStopRecord: +#endif + // Media object sharing (with parameters ) + case KVtEngInitializeShareImage: + // Flow through, ok to execute + op->ExecuteL( aParams ); + break; + default: + User::Leave( KErrNotSupported ); + } + if ( opFromPool == NULL ) + { + CleanupStack::Pop( ); // op (deletes itself) + } + CVtEngStateManager* states = CVtEngUtility::StateManager(); + states->Update(); + __VTPRINTEXIT( "CmdHlr.ExecuteL" ) + } + + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::CancelCommand +// +// ----------------------------------------------------------------------------- +// +TInt CVtEngCommandHandler::CancelCommand( const TVtEngCommandId aCommandId ) + { + __VTPRINTENTER( "CmdHlr.CancelCommand" ) + + __VTPRINT2( DEBUG_GEN, "ComHlr.Cancel cmd=%d", aCommandId ) + TInt err( KErrGeneral ); + if ( iActiveOp && + iActiveOp->Command() == aCommandId && + aCommandId != KVtEngResetEngine && + aCommandId != KVtEngInitializeEngineTest && + aCommandId != KVtEngInitializeEngineDiag) + { + iActiveOp->Cancel(); + err = KErrNone; + } + __VTPRINT2( DEBUG_GEN | DEBUG_DETAIL, "ComHlr.Cancel res=%d",err ) + __VTPRINTEXIT( "CmdHlr.CancelCommand" ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::GetCommandCaps +// +// ----------------------------------------------------------------------------- +// +TInt CVtEngCommandHandler::GetCommandCaps( + const TVtEngCommandId aCommand ) + { + TInt caps( 0 ); + CheckAsynchronity( aCommand, caps ); + CheckSupport( aCommand, caps ); + CheckState( aCommand, caps ); + return caps; + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::PendingCommand +// +// ----------------------------------------------------------------------------- +// +TVtEngCommandId CVtEngCommandHandler::PendingCommand() + { + if ( iActiveOp ) + { + return iActiveOp->Command(); + } + return KVtEngCommandNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::InvalidCommand +// +// ----------------------------------------------------------------------------- +// +TVtEngCommandId CVtEngCommandHandler::InvalidCommand() + { + return iInvalidCommandId; + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::AddObserverL +// +// ----------------------------------------------------------------------------- +// +void CVtEngCommandHandler::AddObserverL( + MVtEngCommandObserver& aObserver ) + { + User::LeaveIfError( iObservers.Append( &aObserver ) ); + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::RemoveObserver +// +// ----------------------------------------------------------------------------- +// +void CVtEngCommandHandler::RemoveObserver( + MVtEngCommandObserver& aObserver ) + { + const TInt pos( iObservers.Find( &aObserver ) ); + if ( pos >= 0 ) + { + iObservers.Remove( pos ); + } + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::CommandCompleteL +// +// ----------------------------------------------------------------------------- +// +void CVtEngCommandHandler::CommandCompleteL( + const TVtEngCommandId aCommand, + const TInt aResult ) + { + __VTPRINTENTER( "CmdHlr.CommandCompleteL" ) + __VTPRINT3( DEBUG_GEN, " completed cmd=%d,res=%d", aCommand, aResult ) + TInt count( iObservers.Count() ); + while ( count-- ) + { + MVtEngCommandObserver* observer = iObservers[ count ]; + observer->HandleVTCommandPerformedL( aCommand, aResult ); + } + __VTPRINTEXIT( "CmdHlr.CommandCompleteL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::SetOperation +// Sets active operation +// +// ----------------------------------------------------------------------------- +// +void CVtEngCommandHandler::SetOperation( CVtEngOperation* aActiveOp ) + { + iActiveOp = aActiveOp; + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::AddToPoolL +// Adds a command to command pool. Only commands without parameters and +// that don't delete themselfs can currently be added. +// +// ----------------------------------------------------------------------------- +// +void CVtEngCommandHandler::AddToPoolL( TVtEngCommandId aCommand ) + { + CVtEngOperation* op = CVtEngOperation::NewL( + aCommand, iHandlers, *this, EFalse ); + CleanupStack::PushL( op ); + iCommandPool->AppendL( op ); + CleanupStack::Pop(); // op + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::ValidateL +// Checks if command can be performed. +// +// ----------------------------------------------------------------------------- +// +void CVtEngCommandHandler::ValidateL( + const TVtEngCommandId aCommandId, + TDesC8* /*aParams*/ ) + { + // check if async command is already pending and new + // command is async + TInt caps( 0 ); + CheckState( aCommandId, caps ); + if ( !(caps & EAttribEnabled ) ) + { + User::Leave( KErrNotReady ); + } + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::CheckAsynchronity +// Checks if command is async +// +// ----------------------------------------------------------------------------- +// +void CVtEngCommandHandler::CheckAsynchronity( + const TVtEngCommandId aCommandId, + TInt& aCaps ) + { + switch ( aCommandId ) + { + case KVtEngInitializeEngine: + case KVtEngInitializeEngineTest: + case KVtEngInitializeEngineDiag: + case KVtEngResetEngine: + case KVtEngTerminateSession: + case KVtEngSetSource: + case KVtEngPrepareCamera: + case KVtEngSetAudioRouting: + case KVtEngMuteOutgoingAudio: + case KVtEngUnmuteOutgoingAudio: + case KVtEngSetAudioVolume: + case KVtEngHandleLayoutChange: + case KVtEngUnfreeze: + + // Media object sharing + case KVtEngInitializeShareImage: + case KVtEngStartShareImage: + case KVtEngStopShareImage: + case KVtEngSwitchToVoice: + aCaps |= EAttribAsync; + break; + default: + aCaps &= (~EAttribAsync); + break; + } + __VTPRINT3( DEBUG_GEN | DEBUG_RETURN, "ComHlr:capsA cmd=%d,caps=%d", aCommandId, aCaps ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::CheckSupport +// Checks if command is supported +// +// ----------------------------------------------------------------------------- +// +void CVtEngCommandHandler::CheckSupport( + const TVtEngCommandId aCommandId, + TInt& aCaps ) + { + switch ( aCommandId ) + { + case KVtEngInitializeEngine: + case KVtEngInitializeEngineTest: + case KVtEngInitializeEngineDiag: + case KVtEngResetEngine: + case KVtEngTerminateSession: + case KVtEngStartViewFinder: + case KVtEngStopViewFinder: + case KVtEngPrepareViewFinder: + case KVtEngPrepareRemoteRenderDSA: + case KVtEngPrepareRemoteRenderDP: + case KVtEngPrepareRemoteRenderNGA: + case KVtEngStartRenderRemote: + case KVtEngStopRenderRemote: + case KVtEngSetAudioRouting: + case KVtEngSetAudioVolume: + case KVtEngIncreaseAudioVolume: + case KVtEngDecreaseAudioVolume: + case KVtEngPauseRenderRemote: + case KVtEngMuteOutgoingAudio: + case KVtEngUnmuteOutgoingAudio: + case KVtEngSetSource: + case KVtEngPrepareCamera: + case KVtEngStartDtmfTone: + case KVtEngStopDtmfTone: + case KVtEngFreeze: + case KVtEngUnfreeze: + case KVtEngSetVideoQuality: + case KVtEngHandleLayoutChange: + // Handling of different UIIs, support is there + case KVtEngSetUIIDtmfSupport: + case KVtEngSetUIIBasicStringSupport: + case KVtEngSetUIIIA5StringSupport: + case KVtEngSetUIIGeneralStringSupport: + case KVtEngSetUIForeground: + case KVtEngRequestLastRemoteFrame: + + // Media object sharing + case KVtEngInitializeShareImage: + case KVtEngStartShareImage: + case KVtEngStopShareImage: + case KVtEngSwitchToVoice: + aCaps |= EAttribSupported; + break; + + // Extension commands + case KVtEngSetContrast: + case KVtEngSetBrightness: + case KVtEngSetWhiteBalance: + case KVtEngSetColorTone: +#if defined ( RD_VT_RTF ) + case KVtEngStartRecord: + case KVtEngStopRecord: +#endif + aCaps |= EAttribSupported; + break; + + default: + aCaps &= (~EAttribSupported); + __VTPRINT( DEBUG_GEN, "ComHlr.NOT SUPPORTED" ) + break; + } + __VTPRINT3( DEBUG_GEN | DEBUG_DETAIL, " capsSupport cmd=%d,caps=%d", aCommandId, aCaps ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::CheckState +// Checks if command is possible in current state. +// +// ----------------------------------------------------------------------------- +// +void CVtEngCommandHandler::CheckState( + const TVtEngCommandId aCommandId, + TInt& aCaps ) + { + iInvalidCommandId = KVtEngCommandNone; + aCaps &= (~EAttribEnabled); + if ( !(iActiveOp && ( aCaps & EAttribAsync ) ) ) + { + const CVtEngStateManager* states = CVtEngUtility::StateManager(); + if ( states->IsCommandPossible( aCommandId ) ) + { + aCaps |= EAttribEnabled; + } + else + { + iInvalidCommandId = aCommandId; + __VTPRINT( DEBUG_GEN, "ComHlr.ChkState INVALID" ) + } + } + __VTPRINT3( DEBUG_GEN | DEBUG_DETAIL, " capsState cmd=%d,caps=%d", aCommandId, aCaps ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::CVtEngCmdPool::CVtEngCmdPool +// C++ constructor +// +// ----------------------------------------------------------------------------- +// +CVtEngCommandHandler::CVtEngCmdPool::CVtEngCmdPool( TInt aGranularity ) : + CArrayPtrFlat( aGranularity ) + { + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::CVtEngCmdPool::CVtEngCmdPool +// Destructor - deletes operations in the pool. +// +// ----------------------------------------------------------------------------- +// +CVtEngCommandHandler::CVtEngCmdPool::~CVtEngCmdPool( ) + { + ResetAndDestroy(); + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::CVtEngCmdPool::Get +// Returns pointer to an operation in the pool. +// +// ----------------------------------------------------------------------------- +// +CVtEngOperation* CVtEngCommandHandler::CVtEngCmdPool::Get( + const TVtEngCommandId aId ) + { + TInt count( Count() ); + CVtEngOperation* ret = NULL; + while ( count-- ) + { + CVtEngOperation* op = At( count ); + if ( op->Command() == aId ) + { + ret = op; + count = 0; // break + } + } + return ret; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Commands/CVtEngOperation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Commands/CVtEngOperation.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,333 @@ +/* +* 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: Operation base class implementation. +* +*/ + + + +// INCLUDE FILES +#include "CVtEngOperation.h" +#include "CVtEngCommandHandler.h" +#include "TVtEngOperationUtils.h" +#include "VtEngUtils.h" +#include "cvtengmdtrcommandsender.h" +#include "cvtlogger.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngOperation::NewL +// Symbian two-phase constructor +// +// ----------------------------------------------------------------------------- +// +CVtEngOperation* CVtEngOperation::NewL( + TVtEngCommandId aCommandId, + CVtEngHandlerContainer& aHandlers, + MVtEngOperationObserver& aObserver, + TBool aDelete ) + { + CVtEngOperation* self = new ( ELeave ) + CVtEngOperation( aCommandId, aHandlers, aObserver, aDelete ); + + CleanupStack::PushL( self ); + self->iAsyncCallback = new ( ELeave ) + CAsyncCallBack( CActive::EPriorityStandard ); + self->iAsyncCallback->Set( TCallBack( ASyncHandleOpComplete, self ) ); + + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngOperation::CVtEngOperation +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngOperation::CVtEngOperation( + TVtEngCommandId aCommandId, + CVtEngHandlerContainer& aHandlers, + MVtEngOperationObserver& aObserver, + TBool aDelete ) : + iCommand( aCommandId ), + iHandlers( aHandlers ), + iObserver( aObserver ), + iDelete( aDelete ) + { + } + +// ----------------------------------------------------------------------------- +// CVtEngOperation::~CVtEngOperation +// Destructor +// +// ----------------------------------------------------------------------------- +// +CVtEngOperation::~CVtEngOperation() + { + Cancel(); + delete iAsyncCallback; + } + +// ----------------------------------------------------------------------------- +// CVtEngOperation::HandleOpCompleteL +// Destructor +// +// ----------------------------------------------------------------------------- +// +void CVtEngOperation::HandleOpComplete( const TInt aResult ) + { + __VTPRINTENTER( "EngOp.HandleOpComplete" ) + iObserver.SetOperation( NULL ); + CVtEngMdtrCommandSender& mediatorSender = + CVtEngUtility::EngineUtils()->MediatorCommands(); + switch( iCommand ) + { + case KVtEngTerminateSession: + // send mediator command to telephony for call release + mediatorSender.EndCall(); + break; + case KVtEngMuteOutgoingAudio: + case KVtEngUnmuteOutgoingAudio: + // notify telephony subsystems about new microphone state + mediatorSender.NotifyOutgoingAudioState( + iCommand == KVtEngUnmuteOutgoingAudio ); + break; + default: + break; + } +#ifdef VTDEBUG + TRAPD( err, iObserver.CommandCompleteL( iCommand, aResult ) ); + __VTPRINT2( DEBUG_GEN, "EngOp.Complete err=", err ) +#else + TRAP_IGNORE( iObserver.CommandCompleteL( iCommand, aResult ) ); +#endif // VTDEBUG + if ( iDelete ) + { + delete this; + } + __VTPRINTEXITR( "EngOp.HandleOpComplete %d", aResult ) + } + +// ----------------------------------------------------------------------------- +// CVtEngOperation::ASyncHandleOpComplete +// Destructor +// +// ----------------------------------------------------------------------------- +// +TInt CVtEngOperation::ASyncHandleOpComplete( TAny* aPtr ) + { + __VTPRINTENTER( "EngOp.ASyncHandleOpComplete" ) + CVtEngOperation* self = reinterpret_cast< CVtEngOperation* >( aPtr ); + TInt error( self->iAsyncErr ); + self->iAsyncErr = KErrNone; + self->HandleOpComplete( error ); + __VTPRINTEXIT( "EngOp.ASyncHandleOpComplete" ) + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngOperation::ExecuteL +// Destructor +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngOperation::ExecuteL( TDesC8* aParams ) + { + __VTPRINTENTER( "EngOp.ExecuteL" ) + TBool complete( EFalse ); + + // Offer for synchronous handling. + TRAPD( err, complete = OfferExecuteSyncL( aParams ) ); +#ifdef VTDEBUG + if ( err < KErrNone ) + { + __VTPRINT2( DEBUG_GEN, "EngOp.ExecuteL LEAVE = %d", err ) + } +#endif + User::LeaveIfError( err ); + if ( !complete ) + { + // async request + switch ( iCommand ) + { + case KVtEngResetEngine: + case KVtEngInitializeEngine: + case KVtEngInitializeEngineTest: + case KVtEngInitializeEngineDiag: + case KVtEngTerminateSession: + case KVtEngSwitchToVoice: + TVtEngEngineInitUtil::HandleL( *this, iHandlers ); + break; + + case KVtEngSetSource: + case KVtEngPrepareCamera: + case KVtEngStartViewFinder: + case KVtEngPauseViewFinder: + case KVtEngStopViewFinder: + case KVtEngStartRenderRemote: + case KVtEngStopRenderRemote: + case KVtEngHandleLayoutChange: + case KVtEngUnfreeze: + + // Media object sharing + case KVtEngStopShareImage: + TVtEngRenderUtil::HandleL( *this, iHandlers ); + break; + + // Media object sharing + // These two commands must be trapped and completed without leave + // because Application UI has to be able to act according to error. + case KVtEngInitializeShareImage: + case KVtEngStartShareImage: + TRAP( err, TVtEngRenderUtil::HandleL( *this, iHandlers ) ); + break; + + case KVtEngSetAudioRouting: + TVtEngAudioRoutingUtil::HandleL( *this ); + break; + + case KVtEngSetAudioVolume: + case KVtEngMuteOutgoingAudio: + case KVtEngUnmuteOutgoingAudio: + TVtEngAudioPlaybackUtil::HandleL( *this, iHandlers ); + break; + default: + __VTPRINT( DEBUG_GEN, "EngOp.ExecuteL not handled" ) + break; + } + + iObserver.SetOperation( this ); + + if ( err != KErrNone ) + { + __VTPRINT2( DEBUG_GEN, "EngOp.ExecuteL completing command %d", err ) + iAsyncErr = err; + iAsyncCallback->CallBack(); + } + } + else if ( iDelete ) + { + delete this; + } + __VTPRINTEXITR( "EngOp.ExecuteL %d", complete ) + return complete; + } + +// ----------------------------------------------------------------------------- +// CVtEngOperation::Cancel +// Cancels operation. +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngOperation::Cancel() + { + __VTPRINTENTER( "EngOp.Cancel") + __VTPRINT2( DEBUG_GEN, "Command id = %d", iCommand) + switch ( iCommand ) + { + case KVtEngInitializeEngine: + //TVtEngEngineInitUtil::Cancel( *this ); + break; + case KVtEngInitializeShareImage: + TVtEngRenderUtil::Cancel( *this ,iHandlers); + break; + default: + break; + } + __VTPRINTEXIT( "EngOp.Cancel" ) + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CVtEngOperation::OfferExecuteSyncL +// +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngOperation::OfferExecuteSyncL( TDesC8* aParams ) + { + __VTPRINTENTER( "EngOp.OfferExecuteSyncL" ) + TBool complete( EFalse ); + iParams = aParams; // reset back to null in ExecuteL + // test + + switch ( iCommand ) + { + case KVtEngIncreaseAudioVolume: + case KVtEngDecreaseAudioVolume: + TVtEngAudioPlaybackUtil::HandleL( *this, iHandlers ); + complete = ETrue; + break; + case KVtEngPrepareViewFinder: + case KVtEngPrepareViewFinderDSA: + case KVtEngPrepareViewFinderDP: + case KVtEngStartViewFinder: + case KVtEngPauseViewFinder: + case KVtEngStopViewFinder: + case KVtEngPrepareRemoteRenderDSA: + case KVtEngPrepareRemoteRenderDP: + case KVtEngPrepareRemoteRenderNGA: + case KVtEngStartRenderRemote: + case KVtEngStopRenderRemote: + case KVtEngPauseRenderRemote: + case KVtEngSetZoomStep: + case KVtEngFreeze: + TVtEngViewFinderConfigureUtil::HandleL( *this, iHandlers ); + complete = ETrue; + break; + case KVtEngPrepareRemoteRender: + break; + case KVtEngStartDtmfTone: + case KVtEngStopDtmfTone: + // Handling of different UIIs, support is there + case KVtEngSetUIIDtmfSupport: + case KVtEngSetUIIBasicStringSupport: + case KVtEngSetUIIIA5StringSupport: + case KVtEngSetUIIGeneralStringSupport: + + TVtEngMediaTransportUtil::HandleL( *this, iHandlers ); + complete = ETrue; + break; + + case KVtEngSetUIForeground: + case KVtEngSetVideoQuality: + case KVtEngRequestLastRemoteFrame: + TVtEngRenderUtil::HandleL( *this, iHandlers ); + complete = ETrue; + break; + + // Extension commands + case KVtEngSetContrast: + case KVtEngSetBrightness: + case KVtEngSetWhiteBalance: + case KVtEngSetColorTone: +#if defined ( RD_VT_RTF ) + case KVtEngStartRecord: + case KVtEngStopRecord: +#endif + TVtEngExtensionUtil::HandleL( *this ); + complete = ETrue; + break; + + default: + __VTPRINT( DEBUG_GEN, "EngOp.ExecuteL not handled sync" ) + break; + } + __VTPRINTEXITR( "EngOp.OfferExecuteSyncL %d", complete ) + return complete; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Commands/TVtEngOperationUtils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Commands/TVtEngOperationUtils.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,236 @@ +/* +* 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: Handler utilities implementation. +* +*/ + + + +// INCLUDE FILES +#include "TVtEngOperationUtils.h" +#include "VtEngPanic.h" +#include "CVtEngInitializer.h" +#include "VtEngUtils.h" +#include "CVtEngOperation.h" +#include "CVtEngHandlerContainer.h" +#include "CVtEngMediaHandler.h" +#include "CVtEngAudioHandler.h" +#include "CVtEngSessionHandler.h" +#include "CVtEngStateManager.h" +#include "CVtEngSettings.h" +#include "cvtengmdtrcommandsender.h" +#include + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// TVtEngRenderUtil::HandleL +// unpacks and handles a rendering command +// +// ----------------------------------------------------------------------------- +// +void TVtEngRenderUtil::HandleL( + CVtEngOperation& aOperation, + CVtEngHandlerContainer& aHandlers ) + { + CVtEngMediaHandler& media = + static_cast( aHandlers.Media() ); + + media.HandleL( aOperation ); + } + +// ----------------------------------------------------------------------------- +// TVtEngRenderUtil::Cancel +// cancel the specify pending command +// +// ----------------------------------------------------------------------------- +// + +void TVtEngRenderUtil::Cancel( + CVtEngOperation& aOperation, + CVtEngHandlerContainer& aHandlers ) + { + const TVtEngCommandId id = aOperation.Command(); + __VTPRINTENTER( "TVtEngRenderUtil.Cancel") + __VTPRINT2( DEBUG_GEN, "Command id = %d", id) + if ( id == KVtEngInitializeShareImage ) + { + CVtEngMediaHandler& media = + static_cast( aHandlers.Media() ); + + media.CancelInitializeShareImage(); + } + __VTPRINTEXIT( "TVtEngRenderUtil.Cancel") + } +// ----------------------------------------------------------------------------- +// TVtEngAudioRoutingUtil::HandleL +// unpacks and handles audio routing command. +// +// ----------------------------------------------------------------------------- +// + +void TVtEngAudioRoutingUtil::HandleL( + CVtEngOperation& aOperation ) + { + CVtEngUtility::StateManager()->HandleOperationL( aOperation ); + } + +// ----------------------------------------------------------------------------- +// TVtEngAudioPlaybackUtil::HandleL +// unpacks and handles audio playback command. +// +// ----------------------------------------------------------------------------- +// +void TVtEngAudioPlaybackUtil::HandleL( + CVtEngOperation& aOperation, + CVtEngHandlerContainer& aHandlers ) + { + __VTPRINTENTER( "AudioPlaybackUtil.HandleL" ) + if ( aOperation.Command() == KVtEngSetAudioVolume ) + { + CVtEngSettings& settings = CVtEngUtility::Settings(); + const TPckgC& pckg = + static_cast&> + ( *aOperation.Parameters() ); + + settings.SetVolume( pckg().iHandsetVolume, pckg().iHandsfreeVolume, + ETrue ); + } + + // All the commands are though passed to handler + CVtEngMediaHandler& media = + static_cast( aHandlers.Media() ); + __VTPRINT( DEBUG_DETAIL, "TVtEngAudioPlaybackUtil::HandleL:Handler fetched") + + media.HandleL( aOperation ); + __VTPRINTEXIT( "AudioPlaybackUtil.HandleL" ) + } + +// ----------------------------------------------------------------------------- +// TVtEngMediaTransportUtil::HandleL +// unpacks and handles media transport command. +// +// ----------------------------------------------------------------------------- +// +void TVtEngMediaTransportUtil::HandleL( + CVtEngOperation& aOperation, + CVtEngHandlerContainer& aHandlers ) + { + __VTPRINTENTER( "MediaTransportUtil.HandleL" ) + const TVtEngCommandId command( aOperation.Command() ); + if ( command == KVtEngStopDtmfTone || + command == KVtEngStartDtmfTone || + // DTMF commands + command == KVtEngSetUIIDtmfSupport || + command == KVtEngSetUIIBasicStringSupport || + command == KVtEngSetUIIIA5StringSupport || + command == KVtEngSetUIIGeneralStringSupport ) + { + aHandlers.Dtmf().HandleL( aOperation ); + } + + __VTPRINTEXIT( "MediaTransportUtil.HandleL" ) + } + +// ----------------------------------------------------------------------------- +// TVtEngViewFinderConfigureUtil::HandleL +// unpacks and handles +// +// ----------------------------------------------------------------------------- +// +void TVtEngViewFinderConfigureUtil::HandleL( + CVtEngOperation& aOperation, + CVtEngHandlerContainer& aHandlers ) + { + CVtEngMediaHandler& media = + static_cast( aHandlers.Media() ); + + media.HandleL( aOperation ); + } + +// ----------------------------------------------------------------------------- +// TVtEngCameraConfigUtil::HandleL +// unpacks and handles +// +// ----------------------------------------------------------------------------- +// +void TVtEngCameraConfigUtil::HandleL( + CVtEngOperation& /*aOperation*/, + CVtEngHandlerContainer& /*aHandlers*/ ) + { + } + +// ----------------------------------------------------------------------------- +// TVtEngEngineInitUtil::HandleL +// Handles engine initialization and uninitialization command. +// +// ----------------------------------------------------------------------------- +// +void TVtEngEngineInitUtil::HandleL( + CVtEngOperation& aOperation, + CVtEngHandlerContainer& /* aHandlers */ ) + { + __VTPRINTENTER( "EngineInitUtil.HandleL" ) + const TVtEngCommandId id = aOperation.Command(); + + CVtEngInitializer& initializer = + CVtEngUtility::EngineUtils()->Initializer(); + + switch ( id ) + { + case KVtEngInitializeEngine: + case KVtEngInitializeEngineDiag: + case KVtEngInitializeEngineTest: + initializer.InitializeL( aOperation ); + break; + case KVtEngResetEngine: + initializer.Uninitialize( aOperation ); + break; + case KVtEngTerminateSession: + CVtEngUtility::StateManager()->HandleOperationL( aOperation ); + break; + case KVtEngSwitchToVoice: + CVtEngUtility::MediatorCommands().SwitchToVoiceL( aOperation ); + break; + default: + Panic( EVtEngPanicIncorrectUtility ); + break; + } + __VTPRINTEXIT( "EngineInitUtil.HandleL" ) + } + +void TVtEngEngineInitUtil::Cancel( CVtEngOperation& aOperation ) + { + const TVtEngCommandId id = aOperation.Command(); + if ( id == KVtEngInitializeEngine ) + { + CVtEngInitializer& initializer = + CVtEngUtility::EngineUtils()->Initializer(); + initializer.CancelInit(); + } + } + +// ----------------------------------------------------------------------------- +// TVtEngExtensionUtil::HandleL +// handles extension operations. +// +// ----------------------------------------------------------------------------- +// +void TVtEngExtensionUtil::HandleL( + CVtEngOperation& aOperation ) + { + CVtEngUtility::StateManager()->HandleOperationL( aOperation ); + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Commands/cvtenginternaloperation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Commands/cvtenginternaloperation.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,136 @@ +/* +* Copyright (c) 2008 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: Internal operation class implementation +* +*/ + + +// INCLUDE FILES +#include "cvtenginternaloperation.h" +#include "mvtengoperationobserver.h" +#include "CVtEngStateManager.h" +#include "TVtEngOperationUtils.h" +#include "VtEngUtils.h" +#include "cvtlogger.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngOperation::NewL +// Symbian two-phase constructor +// +// ----------------------------------------------------------------------------- +// +CVtEngInternalOperation* CVtEngInternalOperation::NewL( + TVtEngCommandId aCommandId, + CVtEngHandlerContainer& aHandlers, + MVtEngOperationObserver& aObserver, + TBool aDelete ) + { + __VTPRINTENTER( "CVtEngInternalOperation.NewL<" ) + CVtEngInternalOperation* self = new ( ELeave ) + CVtEngInternalOperation( aCommandId, aHandlers, aObserver, aDelete ); + __VTPRINTEXIT( "CVtEngInternalOperation.NewL>" ) + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngInternalOperation::CVtEngInternalOperation +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngInternalOperation::CVtEngInternalOperation( + TVtEngCommandId aCommandId, + CVtEngHandlerContainer& aHandlers, + MVtEngOperationObserver& aObserver, + TBool aDelete ) : CVtEngOperation( aCommandId, aHandlers, aObserver, + aDelete ) + { + __VTPRINTENTER( "CVtEngInternalOperation.CVtEngInternalOperation" ) + __VTPRINTEXIT( "CVtEngInternalOperation.CVtEngInternalOperation" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngInternalOperation::~CVtEngInternalOperation +// Destructor +// +// ----------------------------------------------------------------------------- +// +CVtEngInternalOperation::~CVtEngInternalOperation() + { + __VTPRINTENTER( "CVtEngInternalOperation.~" ) + __VTPRINTEXIT( "CVtEngInternalOperation.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngInternalOperation::HandleOpCompleteL +// Destructor +// +// ----------------------------------------------------------------------------- +// +void CVtEngInternalOperation::HandleOpComplete( const TInt aResult ) + { + __VTPRINTENTER( "CVtEngInternalOperation.HandleOpComplete" ) + #ifdef VTDEBUG + TRAPD( err, iObserver.CommandCompleteL( iCommand, aResult ) ); + __VTPRINT2( DEBUG_GEN, "EngOp.Complete err=", err ) +#else + TRAP_IGNORE( iObserver.CommandCompleteL( iCommand, aResult ) ); +#endif // VTDEBUG + if ( iDelete ) + { + delete this; + } + __VTPRINTEXITR( "CVtEngInternalOperation.HandleOpComplete %d>", aResult ) + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// CVtEngInternalOperation::ExecuteL +// Destructor +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngInternalOperation::ExecuteL() + { + __VTPRINTENTER( "CVtEngInternalOperation.ExecuteL" ) + const CVtEngStateManager* states = CVtEngUtility::StateManager(); + TInt err( KErrNotReady ); + if ( states->IsCommandPossible( iCommand ) ) + { + err = KErrNone; + switch ( iCommand ) + { + case KVtEngTerminateSession: + TVtEngEngineInitUtil::HandleL( *this, iHandlers ); + break; + case KVtEngMuteOutgoingAudio: + case KVtEngUnmuteOutgoingAudio: + TVtEngAudioPlaybackUtil::HandleL( *this, iHandlers ); + break; + default: + __VTPRINT( DEBUG_GEN, "EngOp.ExecuteL not handled" ) + err = KErrNotSupported; + break; + } + } + User::LeaveIfError( err ); + __VTPRINTEXIT( "CVtEngInternalOperation.ExecuteL" ) + return EFalse; + } + +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Extensions/CVtEngCameraPreferences.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Extensions/CVtEngCameraPreferences.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,437 @@ +/* +* 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: Videoteleng Camera Preferences extension +* +*/ + + +// INCLUDE FILES +#include "CVtEngCameraPreferences.h" +#include "VtEngPanic.h" +#include "CVtEngSettings.h" +#include "VtEngUtils.h" +#include "mvtengcamerapreferencesobserver.h" + +#include +#include + +// LOCAL CONSTANTS AND MACROS + +// ============================ MEMBER FUNCTIONS ============================== + +// ---------------------------------------------------------------------------- +// CVtEngCameraPreferences::CVtEngCameraPreferences +// C++ constructor can NOT contain any code, that +// might leave. +// ---------------------------------------------------------------------------- +// +CVtEngCameraPreferences::CVtEngCameraPreferences(): + CVtEngExtensionBase( + KVtEngExtensionCameraPreferences ) + { + } + +// ---------------------------------------------------------------------------- +// CVtEngCameraPreferences::ConstructL +// Symbian 2nd phase constructor can leave. +// ---------------------------------------------------------------------------- +// +void CVtEngCameraPreferences::ConstructL() + { + __VTPRINTENTER( "CVtEngCameraPreferences.ConstructL" ) + __VTPRINTEXIT( "CVtEngCameraPreferences.ConstructL" ) + } + +// ---------------------------------------------------------------------------- +// CVtEngCameraPreferences::NewL +// Two-phased constructor. +// ---------------------------------------------------------------------------- +// +CVtEngCameraPreferences* CVtEngCameraPreferences::NewL() + { + CVtEngCameraPreferences* self = new( ELeave ) CVtEngCameraPreferences; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------------------------- +// CVtEngCameraPreferences::~CVtEngCameraPreferences +// Destructor. Cannot leave. +// ---------------------------------------------------------------------------- +// +CVtEngCameraPreferences::~CVtEngCameraPreferences() + { + __VTPRINTENTER( "CameraPreferences.~" ) + if ( iObserver ) + { + iObserver->Detach( *this ); + } + __VTPRINTEXIT( "CameraPreferences.~" ) + } + +// ---------------------------------------------------------------------------- +// CVtEngCameraPreferences::GetInterface +// +// ---------------------------------------------------------------------------- +// +TAny* CVtEngCameraPreferences::GetInterface() + { + __VTPRINTENTER( "CameraPreferences.GetInterface") + // Cast first as API MVtEngCameraPreferences* class + // and after that to TAny* + __VTPRINTEXIT( "CameraPreferences.GetInterface" ) + return reinterpret_cast< TAny* >( ( MVtEngCameraPreferences* ) this ); + + } + +// ---------------------------------------------------------------------------- +// CVtEngCameraPreferences::HandleL +// +// ---------------------------------------------------------------------------- +// +TBool CVtEngCameraPreferences::HandleL( CVtEngOperation* aOp ) + { + __VTPRINTENTER( "CameraPreferences.HandleL" ) + const TVtEngCommandId id( aOp->Command() ); + __VTPRINT2( DEBUG_GEN, "CVtEngCameraPreferences.HandleL CMD ID[%d] ", id ) + + // Check provider + if ( iProvider == NULL ) + { + __VTPRINTEXITR( "CVtEngCameraPreferences.HandleL iProvider [%d]", + ( TInt )iProvider ) + User::Leave( KErrNotReady ); + } + // Check which command and call + // active provider with operation params + switch ( id ) + { + case KVtEngSetContrast: + { + TInt contrast = 0; + TVtEngOpParamUtil< TInt >::Set( contrast, *aOp ); + iProvider->SetContrastL( contrast ); + if ( iObserver ) + { + iObserver->ContrastUpdated( contrast ); + } + break; + } + case KVtEngSetBrightness: + { + TInt brightness = 0; + TVtEngOpParamUtil< TInt >::Set( brightness, *aOp ); + iProvider->SetBrightnessL( brightness ); + if ( iObserver ) + { + iObserver->BrightnessUpdated( brightness ); + } + break; + } + case KVtEngSetWhiteBalance: + { + CCamera::TWhiteBalance whitebalance = CCamera::EWBAuto; + TVtEngOpParamUtil< CCamera::TWhiteBalance >::Set( whitebalance, + *aOp ); + iProvider->SetWhiteBalanceL( whitebalance ); + if ( iObserver ) + { + iObserver->WhiteBalanceUpdated( TWhiteBalance( whitebalance ) ); + } + break; + } + case KVtEngSetColorTone: + { + CCamera::CCameraImageProcessing::TEffect colortone = + CCamera::CCameraImageProcessing::EEffectNone; + TVtEngOpParamUtil< CCamera::CCameraImageProcessing::TEffect >::Set( + colortone, *aOp ); + iProvider->SetColorToneL( colortone ); + if ( iObserver ) + { + iObserver->ColorToneUpdated( TColorTone( colortone ) ); + } + break; + } + //Not supported command + default: + __VTPRINTEXITR( + "CVtEngCameraPreferences.HandleL NOT SUPPORTED CMD[%d]", id ) + return EFalse; + } + __VTPRINTEXIT( "CameraPreferences.HandleL" ) + return ETrue; + } + +// ---------------------------------------------------------------------------- +// CVtEngCameraPreferences::ValidateCommand +// +// ---------------------------------------------------------------------------- + +TBool CVtEngCameraPreferences::ValidateCommand( + const TVtEngCommandId aCommandId ) + { + __VTPRINTENTER( "CameraPreferences.ValidateCommand" ) + // Check provider + if ( iProvider == NULL ) + { + __VTPRINTEXITR( + "CVtEngCameraPreferences.ValidateCommand iProvider [%d]", + ( TInt ) iProvider) + return EFalse; + } + // Take provider info is needed down below + TVSDataProviderInfo info; + iProvider->ProviderInfo( info ); + + // local or hw support + // set as False + TBool hworlocalsupport = EFalse; + + // Check which command and check if + // if provider and local variation supports + __VTPRINT2( DEBUG_GEN, + "CVtEngCameraPreferences.ValidateCommand CMD ID[%d] ", aCommandId ) + switch ( aCommandId ) + { + case KVtEngSetContrast: + { + if ( info.iOptionsSupported & TCameraInfo::EContrastSupported ) + { + hworlocalsupport = ETrue; + } + break; + } + case KVtEngSetBrightness: + { + if ( info.iOptionsSupported & TCameraInfo::EBrightnessSupported ) + { + hworlocalsupport = ETrue; + } + break; + } + case KVtEngSetWhiteBalance: + { + if ( info.iWhiteBalanceModesSupported != CCamera::EWBAuto ) + { + hworlocalsupport = ETrue; + } + break; + } + case KVtEngSetColorTone: + { + if ( info.iSupportedColorTones != + CCamera::CCameraImageProcessing::EEffectNone ) + { + hworlocalsupport = ETrue; + } + break; + } + // Not supported command + default: + { + __VTPRINT2( DEBUG_GEN, + "CVtEngCameraPreferences.ValidateCommand NOT SUPPORTED CMD[%d]", + aCommandId) + hworlocalsupport = EFalse; + } + } + __VTPRINTEXITR( "CVtEngCameraPreferences.ValidateCommand return value[%d]", + hworlocalsupport) + return hworlocalsupport; + } + +// ---------------------------------------------------------------------------- +// CVtEngCameraPreferences::GetColorTone +// +// ---------------------------------------------------------------------------- +// +TInt CVtEngCameraPreferences::GetColorTone( + MVtEngCameraPreferences::TColorTone& aColortone ) const + { + __VTPRINTENTER( "CameraPreferences.GetColorTone" ) + if ( iProvider == NULL ) + { + __VTPRINTEXITR( "CVtEngCameraPreferences.GetColorTone iProvider[%d]", + ( TInt )iProvider) + return KErrNotReady; + } + TInt error; + CCamera::CCameraImageProcessing::TEffect colortone; + error = iProvider->GetColorTone( colortone ); + aColortone = ( MVtEngCameraPreferences::TColorTone ) colortone; + __VTPRINTEXITR( "CameraPreferences.GetColorTone error [%d]",error ) + return error; + } + +// ---------------------------------------------------------------------------- +// CVtEngCameraPreferences::GetSupportedColorTones +// +// ---------------------------------------------------------------------------- +// +TInt CVtEngCameraPreferences::GetSupportedColorTones( + TUint32& aSupportedColorTones ) const + { + __VTPRINTENTER( "CameraPreferences.GetSupportedColorTones" ) + if ( iProvider == NULL ) + { + __VTPRINTEXITR( + "CVtEngCameraPreferences.GetSupportedColorTones iProvider[%d]", + ( TInt )iProvider) + return KErrNotReady; + } + + TVSDataProviderInfo info; + iProvider->ProviderInfo( info ); + aSupportedColorTones = info.iSupportedColorTones; + __VTPRINTEXITR( "CameraPreferences.GetSupportedColorTones [%b]", + info.iSupportedColorTones) + return KErrNone; + } + +// ---------------------------------------------------------------------------- +// CVtEngCameraPreferences::GetWhiteBalance +// +// ---------------------------------------------------------------------------- +// +TInt CVtEngCameraPreferences::GetWhiteBalance( + MVtEngCameraPreferences::TWhiteBalance& aWhiteBalance ) const + { + __VTPRINTENTER( "CameraPreferences.GetWhiteBalance" ) + if ( iProvider == NULL ) + { + __VTPRINTEXITR( + "CVtEngCameraPreferences.GetWhiteBalance iProvider [%d]", + ( TInt )iProvider ) + return KErrNotReady; + } + TInt error; + CCamera::TWhiteBalance whitebalance; + error = iProvider->GetWhiteBalance( whitebalance ); + aWhiteBalance = (MVtEngCameraPreferences::TWhiteBalance) whitebalance; + __VTPRINTEXITR( "CameraPreferences.GetWhiteBalance error [%d]",error ) + return error; + } + +// ---------------------------------------------------------------------------- +// CVtEngCameraPreferences::GetSupportedWhiteBalanceModes +// +// ---------------------------------------------------------------------------- +// +TInt CVtEngCameraPreferences::GetSupportedWhiteBalanceModes( + TUint32& aWhiteBalance ) const + { + __VTPRINTENTER( "CameraPreferences.GetSupportedWhiteBalanceModes" ) + if ( iProvider == NULL ) + { + __VTPRINTEXITR( + "CVtEngCameraPreferences.GetSupportedWhiteBalanceModes iProvider [%d]", + ( TInt )iProvider) + return KErrNotReady; + } + + TVSDataProviderInfo info; + iProvider->ProviderInfo( info ); + aWhiteBalance = info.iWhiteBalanceModesSupported; + __VTPRINTEXITR( "CameraPreferences.GetSupportedWhiteBalanceModes [%b]", + info.iWhiteBalanceModesSupported) + return KErrNone; + } + +// ---------------------------------------------------------------------------- +// CVtEngCameraPreferences::GetBrightness +// +// ---------------------------------------------------------------------------- +// +TInt CVtEngCameraPreferences::GetBrightness( TInt& aBrightness ) const + { + __VTPRINTENTER( "CameraPreferences.GetBrightness" ) + if ( iProvider == NULL ) + { + __VTPRINTEXITR( "CVtEngCameraPreferences.GetBrightness iProvider [%d]", + ( TInt )iProvider) + + return KErrNotReady; + } + TInt error; + error = iProvider->GetBrightness( aBrightness ); + __VTPRINTEXITR( "CameraPreferences.GetBrightness error [%d]",error ) + return error; + } + +// ---------------------------------------------------------------------------- +// CVtEngCameraPreferences::GetContrast +// +// ---------------------------------------------------------------------------- +// +TInt CVtEngCameraPreferences::GetContrast( TInt& aContrast ) const + { + __VTPRINTENTER( "CameraPreferences.GetContrast" ) + if ( iProvider == NULL ) + { + __VTPRINTEXITR( "CVtEngCameraPreferences.GetContrast iProvider [%d]", + ( TInt )iProvider) + return KErrNotReady; + } + TInt error; + error = iProvider->GetContrast( aContrast ); + __VTPRINTEXITR( "CameraPreferences.GetContrast error [%d]",error ) + + return error; + } + +// ---------------------------------------------------------------------------- +// CVtEngCameraPreferences::SetProvider +// +// ---------------------------------------------------------------------------- +// +void CVtEngCameraPreferences::SetProvider( CVSDataProvider* aProvider, + MVtEngCameraPreferencesObserver& aObserver ) + { + __VTPRINTENTER( "CameraPreferences.SetProvider" ) + if ( iObserver ) + { + iObserver->Detach( *this ); + iObserver = NULL; + } + iProvider = aProvider; + iObserver = &aObserver; + if ( iObserver ) + { + iObserver->Attach( *this ); + } + __VTPRINTEXIT( "CameraPreferences.SetProvider" ) + } + +// ---------------------------------------------------------------------------- +// CVtEngCameraPreferences::Detach +// +// ---------------------------------------------------------------------------- +// +void CVtEngCameraPreferences::Detach( MVtEngCameraPreferencesObserver& + aObserver ) + { + __VTPRINTENTER( "CameraPreferences.Detach" ) + if ( iObserver == &aObserver ) + { + iObserver = NULL; + } + __VTPRINTEXITR( "CameraPreferences.Detach $%x", TInt( iObserver ) ) + } + + + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Extensions/CVtEngExtensionBase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Extensions/CVtEngExtensionBase.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,47 @@ +/* +* 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: Videoteleng extension base class +* +*/ + + +// INCLUDE FILES +#include "CVtEngExtensionBase.h" + +// LOCAL CONSTANTS AND MACROS + +// ============================ MEMBER FUNCTIONS ============================== + +// ---------------------------------------------------------------------------- +// CVtEngExtensionBase::CVtEngExtensionBase +// C++ constructor can NOT contain any code, that +// might leave. +// ---------------------------------------------------------------------------- +// +CVtEngExtensionBase::CVtEngExtensionBase( TUid aExtensionUid ): + iExtensionUid( aExtensionUid ) + { + } +// ---------------------------------------------------------------------------- +// CVtEngExtensionBase::Uid +// +// +// ---------------------------------------------------------------------------- +// +const TUid& CVtEngExtensionBase::Uid() const + { + return iExtensionUid; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Extensions/CVtEngExtensions.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Extensions/CVtEngExtensions.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,267 @@ +/* +* 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: Videoteleng API extension configuration +* +*/ + + +// INCLUDE FILES +#include "CVtEngExtensions.h" +#include "VtEngPanic.h" +#include "VtEngUtils.h" + +#include "CVtEngOperation.h" +#include "CVtEngMediaHandler.h" +#include "CVtEngCameraPreferences.h" +#include "cvtengrecord2file.h" + +#include + +// LOCAL CONSTANTS AND MACROS + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngExtensions::CVtEngExtensions +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngExtensions::CVtEngExtensions(): + iExtensionArray( KExtensionGranularity ) + { + } + +// ----------------------------------------------------------------------------- +// CVtEngExtensions::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVtEngExtensions::ConstructL() + { + __VTPRINTENTER( "Extensions.ConstructL" ) + __VTPRINTEXIT( "Extensions.ConstructL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngExtensions::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtEngExtensions* CVtEngExtensions::NewL() + { + CVtEngExtensions* self = new( ELeave ) CVtEngExtensions; + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngExtensions::~CVtEngExtensions +// Destructor. Cannot leave. +// ----------------------------------------------------------------------------- +// +CVtEngExtensions::~CVtEngExtensions() + { + __VTPRINTENTER( "Extensions.~" ) + // Clean and destroy pointer array + iExtensionArray.ResetAndDestroy(); + __VTPRINTEXIT( "Extensions.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngExtensions::CreateExtensions +// +// ----------------------------------------------------------------------------- +// +CVtEngExtensionBase* CVtEngExtensions::CreateExtensionsL( const TUid& aUid, + CVtEngMediaHandler& aHandler) + { + __VTPRINTENTER( "Extensions.CreateExtensions" ) + + // init local variables + TInt error = KErrNotSupported; + CVtEngExtensionBase* extension = NULL; + + // Check if supported UID + if ( aUid == KVtEngExtensionCameraPreferences || + aUid == KVtEngExtensionRecord2File ) + { + // Create extension + extension = aHandler.CreateExtensionsL( aUid ); + + // Push it to clean up stack because + // it needs to be append in to + // array and it can be failed + CleanupStack::PushL( extension ); + + // append extension in to array + error = iExtensionArray.Append(extension); + if ( error != KErrNone ) + { + // if append fails + // clear clean up stack and leave + __VTPRINTEXITR( + "Extensions.CreateExtensions iExtension.Append failed %d", + error ) + CleanupStack::PopAndDestroy(); + User::Leave( error ); + } + // append succesful + // pop extension from clena up stack and return + __VTPRINTEXITR( + "Extensions.CreateExtensions iExtension UID[%d] succesfully Appended", + aUid.iUid) + CleanupStack::Pop(); + return extension; + } + // not supported UID + // leave with error + else + { + __VTPRINTEXITR( + "Extensions.CreateExtensions Extension NOTSUPPORTED UID%d", + aUid.iUid ) + User::Leave( error ); + return extension; + } + + } + +// ----------------------------------------------------------------------------- +// CVtEngExtensions::GetClientInterface +// +// ----------------------------------------------------------------------------- +// +TInt CVtEngExtensions::GetClientInterface( TAny** aInterfacePtr, + const TUid& aUid , CVtEngMediaHandler& aHandler) + { + __VTPRINTENTER( "Extensions.GetClientInterface" ) + // if aInterfacePtr pointer is NULL -> panic + __ASSERT_ALWAYS( aInterfacePtr,Panic( EVtEngPanicInvalidPointer ) ); + + // init local variables + CVtEngExtensionBase* extension = NULL; + TInt error = KErrGeneral; + + // initialize IF pointer to be NULL + // if correct extension API IF is found + // then changed to valid pointer + *aInterfacePtr = NULL; + + // Check if extension is allready in pointer array + TInt index = LookupExtensions( aUid ); + if ( index != KErrNotFound ) + { + *aInterfacePtr = iExtensionArray[index]->GetInterface(); + __VTPRINTEXITR( "Extensions.GetClientInterface error [%d]", KErrNone ) + return KErrNone; + } + // Create extension + else + { + TRAP( error, extension = CreateExtensionsL( aUid, aHandler ) ); + if ( extension && error == KErrNone ) + { + *aInterfacePtr = extension->GetInterface(); + error = KErrNone; + } + __VTPRINTEXITR( "Extensions.GetClientInterface error [%d]", error ) + return error; + } + } +// ----------------------------------------------------------------------------- +// CVtEngExtensions::LookupExtensions +// +// ----------------------------------------------------------------------------- +// +TInt CVtEngExtensions::LookupExtensions( const TUid& aUid) const + { + __VTPRINTENTER( "Extensions.LookupExtensions" ) + TInt index( iExtensionArray.Count() ); + + // Loop whole extension array + while( index-- ) + { + // If matches in one of arrays UIDs + if( aUid == iExtensionArray[index]->Uid() ) + { + __VTPRINTEXITR( "Extensions.LookupExtensions index [%d]", index) + return index; + } + } + __VTPRINTEXITR("Extensions.LookupExtensions Not Found index [%d]", + KErrNotFound) + return KErrNotFound; + } + +// ----------------------------------------------------------------------------- +// CVtEngExtensions::OfferOperationL +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngExtensions::OfferOperationL( CVtEngOperation* aOp ) + { + __VTPRINTENTER( "Extensions.OfferOperationL" ) + + TInt index( iExtensionArray.Count() ); + + // Format cmdComleted as false + TBool cmdCompleted = EFalse; + // Offer operation to all extension in array + while( index-- ) + { + // If valid extension found + if ( iExtensionArray[index]->HandleL( aOp ) ) + { + cmdCompleted = ETrue; + break; + } + } + __VTPRINTEXITR( "Extensions.OfferOperationL cmdCompleted [%d]", + cmdCompleted) + return cmdCompleted; + } + +// ----------------------------------------------------------------------------- +// CVtEngExtensions::ValidateCommand +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngExtensions::ValidateCommand( const TVtEngCommandId aCommandId ) + { + __VTPRINTENTER( "Extensions.ValidateCommand" ) + TInt index( iExtensionArray.Count() ); + + // Format oKToPerform as false + TBool oKToPerform = EFalse; + // Try validate command in all extensions in array + while( index-- ) + { + // If valid extension found + if ( iExtensionArray[index]->ValidateCommand( aCommandId ) ) + { + oKToPerform = ETrue; + break; + } + } + __VTPRINTEXITR( "Extensions.ValidateCommand oKToPerform [%d]", + oKToPerform) + return oKToPerform; + } + +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Extensions/cvtengr2ftoneplayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Extensions/cvtengr2ftoneplayer.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,217 @@ +/* +* Copyright (c) 2003, 2004, 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: Plays snap, self-timer and video start/stop sounds. +* +*/ + + +// INCLUDES +#include + +#include + +#include +#include + +#include + +#include "cvtengr2ftoneplayer.h" + +// CONSTANTS + +// FORWARD DECLARATIONS + +// ================= MEMBER FUNCTIONS ======================= + +// ---------------------------------------------------------- +// CVtEngR2FTonePlayer::CVtEngR2FTonePlayer +// C++ constructor +// ---------------------------------------------------------- +// +CVtEngR2FTonePlayer::CVtEngR2FTonePlayer() + { + } + + +// --------------------------------------------------------------------------- +// CVtEngR2FTonePlayer::NewL +// Symbian OS two-phased constructor +// --------------------------------------------------------------------------- +// +CVtEngR2FTonePlayer* CVtEngR2FTonePlayer::NewL() + { + CVtEngR2FTonePlayer* self = new ( ELeave ) CVtEngR2FTonePlayer(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + + +// ---------------------------------------------------------- +// CVtEngR2FTonePlayer::ConstructL +// Symbian OS 2nd phase constructor +// ---------------------------------------------------------- +// +void CVtEngR2FTonePlayer::ConstructL() + { + __VTPRINTENTER( "CVtEngR2FTonePlayer.ConstructL" ) + iAudioPlayer = CMdaAudioPlayerUtility::NewL( *this, + KAudioPriorityVideoRecording, + TMdaPriorityPreference( KAudioPrefCamera ) ); + + iVideoStartSound = StringLoader::LoadL( R_VIDEOTELUI_VIDEO_RECORD_START_SOUND_PATH ); + iVideoStopSound = StringLoader::LoadL( R_VIDEOTELUI_VIDEO_RECORD_STOP_SOUND_PATH ); + iSoundInProgress = EFalse; + iOpenFileInProgress = EFalse; + __VTPRINTEXIT( "CVtEngR2FTonePlayer.ConstructL" ) + } + + +// Destructor. +CVtEngR2FTonePlayer::~CVtEngR2FTonePlayer() + { + if ( iAudioPlayer ) + { + iAudioPlayer->Close(); + delete iAudioPlayer; + } + + delete iVideoStartSound; + delete iVideoStopSound; + } + + +// --------------------------------------------------------------------------- +// CVtEngR2FTonePlayer::PlaySound +// Play a sound with given id. +// --------------------------------------------------------------------------- +// +TInt CVtEngR2FTonePlayer::PlaySound( TInt aSound ) + { + __VTPRINTENTER( "CVtEngR2FTonePlayer.PlaySound" ) + TInt err = KErrNone; + iAudioPlayer->Stop(); + iAudioPlayer->Close(); + + switch ( aSound ) + { + case EVtR2FVideoStartSoundId: + case EVtR2FVideoStopSoundId: + { + __VTPRINT( DEBUG_GEN,"CVtEngR2FTonePlayer.PlaySound() user sound" ) + + // Set correct sound file + TPtrC soundFile = *iVideoStartSound; + if ( aSound == EVtR2FVideoStopSoundId ) + { + soundFile.Set( *iVideoStopSound ); + } + + // Video recording start sound using MMF + if ( !iOpenFileInProgress && !iSoundInProgress ) + { + TRAP( err, iAudioPlayer->OpenFileL( soundFile ) ); + if ( !err ) + { + __VTPRINT( DEBUG_GEN,"CVtEngR2FTonePlayer.PlaySound() open now in progress" ) + iOpenFileInProgress = ETrue; + } + } + else + { + __VTPRINT( DEBUG_GEN, "CVtEngR2FTonePlayer.PlaySound() err, in use" ) + // The last OpenFileL call still hasnt completed. + // Cannot start playing a new file. + err = KErrInUse; + } + break; + } + + default: + { + // Other sounds are not supported + err = KErrArgument; + break; + } + } + __VTPRINTEXIT( "CVtEngR2FTonePlayer.PlaySound" ) + return err; + } + +// --------------------------------------------------------------------------- +// CVtEngR2FTonePlayer::Stop +// Stop any ongoing sound. +// --------------------------------------------------------------------------- +// +void CVtEngR2FTonePlayer::StopSound() + { + __VTPRINTENTER( "CVtEngR2FTonePlayer.StopSound" ) + + iAudioPlayer->Stop(); + iAudioPlayer->Close(); + + __VTPRINTEXIT( "CVtEngR2FTonePlayer.StopSound" ) + } + +// --------------------------------------------------------------------------- +// CVtEngR2FTonePlayer::MapcInitComplete +// CMdaAudioPlayerUtility initialization complete +// --------------------------------------------------------------------------- +// +void CVtEngR2FTonePlayer::MapcInitComplete( + TInt aError, const TTimeIntervalMicroSeconds& aDuration ) + { + __VTPRINTENTER( "CVtEngR2FTonePlayer.MapcInitComplete" ) + __VTPRINT3( DEBUG_GEN, "CVtEngR2FTonePlayer.MapcInitComplete(%d, %d) ", + aError, I64INT( aDuration.Int64()) ) + + (void) aDuration; + + iOpenFileInProgress = EFalse; + + // If tone can be played + if ( !aError ) + { + __VTPRINT( DEBUG_GEN, "CVtEngR2FTonePlayer.MapcInitComplete() play" ) + iSoundInProgress = ETrue; + iAudioPlayer->Play(); + } + // error occured during tone player init + else + { + __VTPRINT( DEBUG_GEN,"CVtEngR2FTonePlayer.MapcInitComplete() error" ) + } + __VTPRINTEXIT( "CVtEngR2FTonePlayer.MapcInitComplete" ) + } + + +// --------------------------------------------------------------------------- +// CVtEngR2FTonePlayer::MapcPlayComplete +// Playback complete, notify observer +// --------------------------------------------------------------------------- +// +void CVtEngR2FTonePlayer::MapcPlayComplete( TInt aError ) + { + __VTPRINTENTER( "CVtEngR2FTonePlayer.MapcPlayComplete" ) + __VTPRINT2( DEBUG_GEN, "CVtEngR2FTonePlayer.MapcPlayComplete(%d)", aError) + + (void) aError; + + iSoundInProgress = EFalse; + __VTPRINTEXIT( "CVtEngR2FTonePlayer.MapcPlayComplete" ) + } + + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Extensions/cvtengrecord2file.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Extensions/cvtengrecord2file.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,203 @@ +/* +* 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: Videoteleng Record to file extension +* +*/ + + +// INCLUDE FILES +#include "cvtengrecord2file.h" +#include "VtEngPanic.h" +#include "CVtEngSettings.h" +#include "VtEngUtils.h" +#include "cvtengr2ftoneplayer.h" + +#include + +// LOCAL CONSTANTS AND MACROS + +// ============================ MEMBER FUNCTIONS ============================== + +// ---------------------------------------------------------------------------- +// CVtEngRecord2File::CVtEngRecord2File +// C++ constructor can NOT contain any code, that +// might leave. +// ---------------------------------------------------------------------------- +// +CVtEngRecord2File::CVtEngRecord2File(): + CVtEngExtensionBase( + KVtEngExtensionRecord2File ) + { + } + +// ---------------------------------------------------------------------------- +// CVtEngRecord2File::ConstructL +// Symbian 2nd phase constructor can leave. +// ---------------------------------------------------------------------------- +// +void CVtEngRecord2File::ConstructL() + { + __VTPRINTENTER( "CVtEngRecord2File.ConstructL" ) + + iTonePlayer = CVtEngR2FTonePlayer::NewL(); + __VTPRINTEXIT( "CVtEngRecord2File.ConstructL" ) + } + +// ---------------------------------------------------------------------------- +// CVtEngRecord2File::NewL +// Two-phased constructor. +// ---------------------------------------------------------------------------- +// +CVtEngRecord2File* CVtEngRecord2File::NewL() + { + CVtEngRecord2File* self = new( ELeave ) CVtEngRecord2File; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------------------------- +// CVtEngRecord2File::~CVtEngRecord2File +// Destructor. Cannot leave. +// ---------------------------------------------------------------------------- +// +CVtEngRecord2File::~CVtEngRecord2File() + { + + __VTPRINTENTER( "CVtEngRecord2File.~" ) + if ( iTonePlayer ) + { + iTonePlayer->StopSound(); + delete iTonePlayer; + } + __VTPRINTEXIT( "CVtEngRecord2File.~" ) + } +// ---------------------------------------------------------------------------- +// CVtEngRecord2File::GetInterface +// +// ---------------------------------------------------------------------------- +// +TAny* CVtEngRecord2File::GetInterface() + { + __VTPRINTENTER( "CVtEngRecord2File.GetInterface") + // Cast first as API MVtEngRecord2File* class + // and after that to TAny* + __VTPRINTEXIT( "CVtEngRecord2File.GetInterface" ) + return reinterpret_cast< TAny* >( ( MVtEngRecord2File* ) this ); + + } + +// ---------------------------------------------------------------------------- +// CVtEngRecord2File::HandleL +// +// ---------------------------------------------------------------------------- +// +TBool CVtEngRecord2File::HandleL( CVtEngOperation* aOp ) + { + __VTPRINTENTER( "CVtEngRecord2File.HandleL" ) + const TVtEngCommandId id( aOp->Command() ); + __VTPRINT2( DEBUG_GEN, "CVtEngRecord2File.HandleL CMD ID[%d] ", id ) + + // Check which command and call + // active provider with operation params + switch ( id ) + { + case KVtEngStartRecord: + { + + iTonePlayer->PlaySound( CVtEngR2FTonePlayer::EVtR2FVideoStartSoundId ); + break; + } + case KVtEngStopRecord: + { + + iTonePlayer->PlaySound( CVtEngR2FTonePlayer::EVtR2FVideoStopSoundId ); + break; + } + //Not supported command + default: + __VTPRINTEXITR( + "CVtEngRecord2File.HandleL NOT SUPPORTED CMD[%d]", id ) + return EFalse; + } + __VTPRINTEXIT( "CVtEngRecord2File.HandleL" ) + return ETrue; + } + +// ---------------------------------------------------------------------------- +// CVtEngRecord2File::ValidateCommand +// +// ---------------------------------------------------------------------------- + +TBool CVtEngRecord2File::ValidateCommand( + const TVtEngCommandId aCommandId ) + { + __VTPRINTENTER( "CVtEngRecord2File.ValidateCommand" ) + + // local or hw support + // set as False + TBool support = EFalse; + + // Check which command and check if + // if provider and local variation supports + __VTPRINT2( DEBUG_GEN, + "CVtEngRecord2File.ValidateCommand CMD ID[%d] ", aCommandId ) + switch ( aCommandId ) + { + case KVtEngStartRecord: + { + support = ETrue; + break; + } + + case KVtEngStopRecord: + { + support = ETrue; + break; + } + // Not supported command + default: + { + __VTPRINT2( DEBUG_GEN, + "CVtEngRecord2File.ValidateCommand NOT SUPPORTED CMD[%d]", + aCommandId) + support = EFalse; + } + } + __VTPRINTEXITR( "CVtEngRecord2File.ValidateCommand return value[%d]", + support) + return support; + } + +// ---------------------------------------------------------------------------- +// CVtEngRecord2File::IsTonePlaySupported +// FOR TESTING PURPOSES REMOVE! +// ---------------------------------------------------------------------------- + +TInt CVtEngRecord2File::IsTonePlaySupported( TBool& aSupported) const + { + if (iTonePlayer) + { + aSupported = ETrue; + } + else + { + aSupported = EFalse; + } + __VTPRINT2( DEBUG_GEN, "CVtEngRecord2File.IsTonePlaySupported bool[%d] ", (TInt)aSupported ) + return KErrNone; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Media/CVtEngDrawDP.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Media/CVtEngDrawDP.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,2026 @@ +/* +* Copyright (c) 2004-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: Remote video handler. +* +*/ + + +// INCLUDE FILES + +#include "CVtEngDrawDP.h" +#include "CVtEngEventManager.h" +#include "CVtEngSettings.h" +#include "VtEngUtils.h" +#include "MVtEngFrameObserver.h" +#include +#include +#include +#include + +#include + +// LOCAL CONSTANTS AND MACROS + +// YCbCr conversion constants + +// Luma +static const TUint32 KYLut[ 256 ] = + { + 0x00000000, 0x00400801, 0x00801002, 0x00C01803, + 0x01002004, 0x01402805, 0x01803006, 0x01C03807, + 0x02004008, 0x02404809, 0x0280500A, 0x02C0580B, + 0x0300600C, 0x0340680D, 0x0380700E, 0x03C0780F, + 0x04008010, 0x04408811, 0x04809012, 0x04C09813, + 0x0500A014, 0x0540A815, 0x0580B016, 0x05C0B817, + 0x0600C018, 0x0640C819, 0x0680D01A, 0x06C0D81B, + 0x0700E01C, 0x0740E81D, 0x0780F01E, 0x07C0F81F, + 0x08010020, 0x08410821, 0x08811022, 0x08C11823, + 0x09012024, 0x09412825, 0x09813026, 0x09C13827, + 0x0A014028, 0x0A414829, 0x0A81502A, 0x0AC1582B, + 0x0B01602C, 0x0B41682D, 0x0B81702E, 0x0BC1782F, + 0x0C018030, 0x0C418831, 0x0C819032, 0x0CC19833, + 0x0D01A034, 0x0D41A835, 0x0D81B036, 0x0DC1B837, + 0x0E01C038, 0x0E41C839, 0x0E81D03A, 0x0EC1D83B, + 0x0F01E03C, 0x0F41E83D, 0x0F81F03E, 0x0FC1F83F, + 0x10020040, 0x10420841, 0x10821042, 0x10C21843, + 0x11022044, 0x11422845, 0x11823046, 0x11C23847, + 0x12024048, 0x12424849, 0x1282504A, 0x12C2584B, + 0x1302604C, 0x1342684D, 0x1382704E, 0x13C2784F, + 0x14028050, 0x14428851, 0x14829052, 0x14C29853, + 0x1502A054, 0x1542A855, 0x1582B056, 0x15C2B857, + 0x1602C058, 0x1642C859, 0x1682D05A, 0x16C2D85B, + 0x1702E05C, 0x1742E85D, 0x1782F05E, 0x17C2F85F, + 0x18030060, 0x18430861, 0x18831062, 0x18C31863, + 0x19032064, 0x19432865, 0x19833066, 0x19C33867, + 0x1A034068, 0x1A434869, 0x1A83506A, 0x1AC3586B, + 0x1B03606C, 0x1B43686D, 0x1B83706E, 0x1BC3786F, + 0x1C038070, 0x1C438871, 0x1C839072, 0x1CC39873, + 0x1D03A074, 0x1D43A875, 0x1D83B076, 0x1DC3B877, + 0x1E03C078, 0x1E43C879, 0x1E83D07A, 0x1EC3D87B, + 0x1F03E07C, 0x1F43E87D, 0x1F83F07E, 0x1FC3F87F, + 0x20040080, 0x20440881, 0x20841082, 0x20C41883, + 0x21042084, 0x21442885, 0x21843086, 0x21C43887, + 0x22044088, 0x22444889, 0x2284508A, 0x22C4588B, + 0x2304608C, 0x2344688D, 0x2384708E, 0x23C4788F, + 0x24048090, 0x24448891, 0x24849092, 0x24C49893, + 0x2504A094, 0x2544A895, 0x2584B096, 0x25C4B897, + 0x2604C098, 0x2644C899, 0x2684D09A, 0x26C4D89B, + 0x2704E09C, 0x2744E89D, 0x2784F09E, 0x27C4F89F, + 0x280500A0, 0x284508A1, 0x288510A2, 0x28C518A3, + 0x290520A4, 0x294528A5, 0x298530A6, 0x29C538A7, + 0x2A0540A8, 0x2A4548A9, 0x2A8550AA, 0x2AC558AB, + 0x2B0560AC, 0x2B4568AD, 0x2B8570AE, 0x2BC578AF, + 0x2C0580B0, 0x2C4588B1, 0x2C8590B2, 0x2CC598B3, + 0x2D05A0B4, 0x2D45A8B5, 0x2D85B0B6, 0x2DC5B8B7, + 0x2E05C0B8, 0x2E45C8B9, 0x2E85D0BA, 0x2EC5D8BB, + 0x2F05E0BC, 0x2F45E8BD, 0x2F85F0BE, 0x2FC5F8BF, + 0x300600C0, 0x304608C1, 0x308610C2, 0x30C618C3, + 0x310620C4, 0x314628C5, 0x318630C6, 0x31C638C7, + 0x320640C8, 0x324648C9, 0x328650CA, 0x32C658CB, + 0x330660CC, 0x334668CD, 0x338670CE, 0x33C678CF, + 0x340680D0, 0x344688D1, 0x348690D2, 0x34C698D3, + 0x3506A0D4, 0x3546A8D5, 0x3586B0D6, 0x35C6B8D7, + 0x3606C0D8, 0x3646C8D9, 0x3686D0DA, 0x36C6D8DB, + 0x3706E0DC, 0x3746E8DD, 0x3786F0DE, 0x37C6F8DF, + 0x380700E0, 0x384708E1, 0x388710E2, 0x38C718E3, + 0x390720E4, 0x394728E5, 0x398730E6, 0x39C738E7, + 0x3A0740E8, 0x3A4748E9, 0x3A8750EA, 0x3AC758EB, + 0x3B0760EC, 0x3B4768ED, 0x3B8770EE, 0x3BC778EF, + 0x3C0780F0, 0x3C4788F1, 0x3C8790F2, 0x3CC798F3, + 0x3D07A0F4, 0x3D47A8F5, 0x3D87B0F6, 0x3DC7B8F7, + 0x3E07C0F8, 0x3E47C8F9, 0x3E87D0FA, 0x3EC7D8FB, + 0x3F07E0FC, 0x3F47E8FD, 0x3F87F0FE, 0x3FC7F8FF + }; + +// Chroma1 (Cb) +static const TUint32 KCbLut[ 256 ] = + { + 0x0001531C, 0x00014B1E, 0x00014B20, 0x00014B22, + 0x00014324, 0x00014325, 0x00014327, 0x00013B29, + 0x00013B2B, 0x00013B2D, 0x0001332E, 0x00013330, + 0x00013332, 0x00012B34, 0x00012B35, 0x00012B37, + 0x00012339, 0x0001233B, 0x0001233D, 0x00011B3E, + 0x00011B40, 0x00011B42, 0x00011344, 0x00011345, + 0x00011347, 0x00010B49, 0x00010B4B, 0x00010B4D, + 0x0001034E, 0x00010350, 0x00010352, 0x0000FB54, + 0x0000FB55, 0x0000FB57, 0x0000F359, 0x0000F35B, + 0x0000F35D, 0x0000EB5E, 0x0000EB60, 0x0000EB62, + 0x0000E364, 0x0000E366, 0x0000E367, 0x0000DB69, + 0x0000DB6B, 0x0000DB6D, 0x0000D36E, 0x0000D370, + 0x0000D372, 0x0000CB74, 0x0000CB76, 0x0000CB77, + 0x0000C379, 0x0000C37B, 0x0000C37D, 0x0000BB7E, + 0x0000BB80, 0x0000BB82, 0x0000B384, 0x0000B386, + 0x0000B387, 0x0000AB89, 0x0000AB8B, 0x0000AB8D, + 0x0000AB8E, 0x0000A390, 0x0000A392, 0x0000A394, + 0x00009B96, 0x00009B97, 0x00009B99, 0x0000939B, + 0x0000939D, 0x0000939F, 0x00008BA0, 0x00008BA2, + 0x00008BA4, 0x000083A6, 0x000083A7, 0x000083A9, + 0x00007BAB, 0x00007BAD, 0x00007BAF, 0x000073B0, + 0x000073B2, 0x000073B4, 0x00006BB6, 0x00006BB7, + 0x00006BB9, 0x000063BB, 0x000063BD, 0x000063BF, + 0x00005BC0, 0x00005BC2, 0x00005BC4, 0x000053C6, + 0x000053C7, 0x000053C9, 0x00004BCB, 0x00004BCD, + 0x00004BCF, 0x000043D0, 0x000043D2, 0x000043D4, + 0x00003BD6, 0x00003BD8, 0x00003BD9, 0x000033DB, + 0x000033DD, 0x000033DF, 0x00002BE0, 0x00002BE2, + 0x00002BE4, 0x000023E6, 0x000023E8, 0x000023E9, + 0x00001BEB, 0x00001BED, 0x00001BEF, 0x000013F0, + 0x000013F2, 0x000013F4, 0x00000BF6, 0x00000BF8, + 0x00000BF9, 0x000003FB, 0x000003FD, 0x000003FF, + 0x00000000, 0x00000001, 0x00000003, 0x00000005, + 0x001FF807, 0x001FF808, 0x001FF80A, 0x001FF00C, + 0x001FF00E, 0x001FF010, 0x001FE811, 0x001FE813, + 0x001FE815, 0x001FE017, 0x001FE018, 0x001FE01A, + 0x001FD81C, 0x001FD81E, 0x001FD820, 0x001FD021, + 0x001FD023, 0x001FD025, 0x001FC827, 0x001FC828, + 0x001FC82A, 0x001FC02C, 0x001FC02E, 0x001FC030, + 0x001FB831, 0x001FB833, 0x001FB835, 0x001FB037, + 0x001FB039, 0x001FB03A, 0x001FA83C, 0x001FA83E, + 0x001FA840, 0x001FA041, 0x001FA043, 0x001FA045, + 0x001F9847, 0x001F9849, 0x001F984A, 0x001F904C, + 0x001F904E, 0x001F9050, 0x001F8851, 0x001F8853, + 0x001F8855, 0x001F8057, 0x001F8059, 0x001F805A, + 0x001F785C, 0x001F785E, 0x001F7860, 0x001F7061, + 0x001F7063, 0x001F7065, 0x001F6867, 0x001F6869, + 0x001F686A, 0x001F606C, 0x001F606E, 0x001F6070, + 0x001F5872, 0x001F5873, 0x001F5875, 0x001F5877, + 0x001F5079, 0x001F507A, 0x001F507C, 0x001F487E, + 0x001F4880, 0x001F4882, 0x001F4083, 0x001F4085, + 0x001F4087, 0x001F3889, 0x001F388A, 0x001F388C, + 0x001F308E, 0x001F3090, 0x001F3092, 0x001F2893, + 0x001F2895, 0x001F2897, 0x001F2099, 0x001F209A, + 0x001F209C, 0x001F189E, 0x001F18A0, 0x001F18A2, + 0x001F10A3, 0x001F10A5, 0x001F10A7, 0x001F08A9, + 0x001F08AB, 0x001F08AC, 0x001F00AE, 0x001F00B0, + 0x001F00B2, 0x001EF8B3, 0x001EF8B5, 0x001EF8B7, + 0x001EF0B9, 0x001EF0BB, 0x001EF0BC, 0x001EE8BE, + 0x001EE8C0, 0x001EE8C2, 0x001EE0C3, 0x001EE0C5, + 0x001EE0C7, 0x001ED8C9, 0x001ED8CB, 0x001ED8CC, + 0x001ED0CE, 0x001ED0D0, 0x001ED0D2, 0x001EC8D3, + 0x001EC8D5, 0x001EC8D7, 0x001EC0D9, 0x001EC0DB, + 0x001EC0DC, 0x001EB8DE, 0x001EB8E0, 0x001EB8E2 + }; + +// Chroma1 (Cr) +static const TUint32 KCrLut[ 256 ] = + { + 0xD302D000, 0xD382C800, 0xD3C2C000, 0xD442B800, + 0xD482B800, 0xD502B000, 0xD542A800, 0xD582A800, + 0xD602A000, 0xD6429800, 0xD6C29000, 0xD7029000, + 0xD7428800, 0xD7C28000, 0xD8028000, 0xD8827800, + 0xD8C27000, 0xD9027000, 0xD9826800, 0xD9C26000, + 0xDA425800, 0xDA825800, 0xDAC25000, 0xDB424800, + 0xDB824800, 0xDC024000, 0xDC423800, 0xDC823800, + 0xDD023000, 0xDD422800, 0xDDC22000, 0xDE022000, + 0xDE421800, 0xDEC21000, 0xDF021000, 0xDF820800, + 0xDFC20000, 0xE041F800, 0xE081F800, 0xE0C1F000, + 0xE141E800, 0xE181E800, 0xE201E000, 0xE241D800, + 0xE281D800, 0xE301D000, 0xE341C800, 0xE3C1C000, + 0xE401C000, 0xE441B800, 0xE4C1B000, 0xE501B000, + 0xE581A800, 0xE5C1A000, 0xE601A000, 0xE6819800, + 0xE6C19000, 0xE7418800, 0xE7818800, 0xE7C18000, + 0xE8417800, 0xE8817800, 0xE9017000, 0xE9416800, + 0xE9816800, 0xEA016000, 0xEA415800, 0xEAC15000, + 0xEB015000, 0xEB814800, 0xEBC14000, 0xEC014000, + 0xEC813800, 0xECC13000, 0xED412800, 0xED812800, + 0xEDC12000, 0xEE411800, 0xEE811800, 0xEF011000, + 0xEF410800, 0xEF810800, 0xF0010000, 0xF040F800, + 0xF0C0F000, 0xF100F000, 0xF140E800, 0xF1C0E000, + 0xF200E000, 0xF280D800, 0xF2C0D000, 0xF300D000, + 0xF380C800, 0xF3C0C000, 0xF440B800, 0xF480B800, + 0xF4C0B000, 0xF540A800, 0xF580A800, 0xF600A000, + 0xF6409800, 0xF6C09000, 0xF7009000, 0xF7408800, + 0xF7C08000, 0xF8008000, 0xF8807800, 0xF8C07000, + 0xF9007000, 0xF9806800, 0xF9C06000, 0xFA405800, + 0xFA805800, 0xFAC05000, 0xFB404800, 0xFB804800, + 0xFC004000, 0xFC403800, 0xFC803800, 0xFD003000, + 0xFD402800, 0xFDC02000, 0xFE002000, 0xFE401800, + 0xFEC01000, 0xFF001000, 0xFF800800, 0xFFC00000, + 0x00000000, 0x00400000, 0x009FF800, 0x011FF000, + 0x015FF000, 0x01DFE800, 0x021FE000, 0x025FE000, + 0x02DFD800, 0x031FD000, 0x039FC800, 0x03DFC800, + 0x041FC000, 0x049FB800, 0x04DFB800, 0x055FB000, + 0x059FA800, 0x05DFA800, 0x065FA000, 0x069F9800, + 0x071F9000, 0x075F9000, 0x079F8800, 0x081F8000, + 0x085F8000, 0x08DF7800, 0x091F7000, 0x095F7000, + 0x09DF6800, 0x0A1F6000, 0x0A9F5800, 0x0ADF5800, + 0x0B5F5000, 0x0B9F4800, 0x0BDF4800, 0x0C5F4000, + 0x0C9F3800, 0x0D1F3000, 0x0D5F3000, 0x0D9F2800, + 0x0E1F2000, 0x0E5F2000, 0x0EDF1800, 0x0F1F1000, + 0x0F5F1000, 0x0FDF0800, 0x101F0000, 0x109EF800, + 0x10DEF800, 0x111EF000, 0x119EE800, 0x11DEE800, + 0x125EE000, 0x129ED800, 0x12DED800, 0x135ED000, + 0x139EC800, 0x141EC000, 0x145EC000, 0x149EB800, + 0x151EB000, 0x155EB000, 0x15DEA800, 0x161EA000, + 0x169E9800, 0x16DE9800, 0x171E9000, 0x179E8800, + 0x17DE8800, 0x185E8000, 0x189E7800, 0x18DE7800, + 0x195E7000, 0x199E6800, 0x1A1E6000, 0x1A5E6000, + 0x1A9E5800, 0x1B1E5000, 0x1B5E5000, 0x1BDE4800, + 0x1C1E4000, 0x1C5E4000, 0x1CDE3800, 0x1D1E3000, + 0x1D9E2800, 0x1DDE2800, 0x1E1E2000, 0x1E9E1800, + 0x1EDE1800, 0x1F5E1000, 0x1F9E0800, 0x1FDE0800, + 0x205E0000, 0x209DF800, 0x211DF000, 0x215DF000, + 0x21DDE800, 0x221DE000, 0x225DE000, 0x22DDD800, + 0x231DD000, 0x239DC800, 0x23DDC800, 0x241DC000, + 0x249DB800, 0x24DDB800, 0x255DB000, 0x259DA800, + 0x25DDA800, 0x265DA000, 0x269D9800, 0x271D9000, + 0x275D9000, 0x279D8800, 0x281D8000, 0x285D8000, + 0x28DD7800, 0x291D7000, 0x295D7000, 0x29DD6800, + 0x2A1D6000, 0x2A9D5800, 0x2ADD5800, 0x2B1D5000, + 0x2B9D4800, 0x2BDD4800, 0x2C5D4000, 0x2C9D3800 + }; + + +// Posting surface factory DLL's name +_LIT( KDPAPIDLLName, "PostingSurfaceFactory.dll" ); + +// Reversed enumeration for the bitmaps. +static const MDisplaySink::TBitmapNo KVtEngBitmapNoReversed[] = + { + MDisplaySink::ESecondBitmap, + MDisplaySink::EFirstBitmap + }; + +// Default posting format (if this or KDefaultPostingFormat420 is not +// supported, BaseConstructL() will leave with KErrNotSupported) +const CPostingSurface::TPostingFormat KDefaultPostingFormat422 = + CPostingSurface::EYuv422LeBt601Range0; + +// Default posting format (if this or KDefaultPostingFormat422 is not +// supported, BaseConstructL() will leave with KErrNotSupported) +const CPostingSurface::TPostingFormat KDefaultPostingFormat420 = + CPostingSurface::EYuv420PlanarBt601Range0; + +// Default posting buffering flags. +const TUint KDefaultPostingBufferingFlags = + // Double buffering + CPostingSurface::EDoubleBuffering | + // Progressive frames (no interlacing) + CPostingSurface::EProgressiveFrames | + // Do not allow frameskip + CPostingSurface::EDisAllowFrameSkip | + // Use internal buffers (allocated by DP) + CPostingSurface::EInternalBuffers; + +// Default pixel aspect ratio num. Aspect ratio = Num/Denom. +const TUint16 KDefaultPixelAspectRatioNum = 1; + +// Default pixel aspect ratio denom. Aspect ratio = Num/Denom. +const TUint16 KDefaultPixelAspectRatioDenom = 1; + +// LOCAL METHODS + +// ----------------------------------------------------------------------------- +// DoConvertYuv420toXRGB0888 +// ----------------------------------------------------------------------------- +// +inline void DoConvertYuv420toXRGB0888( + TInt aWidth, // width in pixels + const TUint8*& aSourceDataPtrY1, // pointer to Y data row 1 + const TUint8*& aSourceDataPtrY2, // pointer to Y data row 2 + const TUint8*& aSourceDataPtrU, // pointer to U data row + const TUint8*& aSourceDataPtrV, // pointer to V data row + TUint8* aDestDataPtr1, // pointer to destination row 1 + TUint8* aDestDataPtr2 // pointer to destination row 2 + ) + { + TUint32* destDataPtr1 = reinterpret_cast< TUint32* >( aDestDataPtr1 ); + TUint32* destDataPtr2 = reinterpret_cast< TUint32* >( aDestDataPtr2 ); + // width assumed to be even + TInt pixelsLeft = aWidth / 2; + + TUint32 r, g, b; + TUint32 LutY0, LutY1, LutC; + TUint32 pixel; + TUint32 OverflowMask = 0xC0180300U; + + // One scanline at the time + while ( pixelsLeft-- ) + { + + // row 1, 2 pixels + + LutY0 = KYLut[*aSourceDataPtrY1++]; + LutY1 = KYLut[*aSourceDataPtrY1++]; + LutC = KCbLut[*aSourceDataPtrU++]; + LutC += KCrLut[*aSourceDataPtrV++]; + + pixel = LutY0 + LutC; + + if (pixel & OverflowMask) + { + if (pixel & 0xC0000000U) + { + if (pixel & 0x80000000U) + { + pixel &= ~0x3FC00000U; + } + else + { + pixel |= 0x3FC00000U; + } + } + if (pixel & 0x00180000U) + { + if (pixel & 0x00100000U) + { + pixel &= ~0x0007F800U; + } + else + { + pixel |= 0x0007F800U; + } + } + if (pixel & 0x00000300U) + { + if (pixel & 0x00000200U) + { + pixel &= ~0x000000FFU; + } + else + { + pixel |= 0x000000FFU; + } + } + } + + r = (pixel >> 6) & 0xFF0000; + g = (pixel >> 3) & 0x00FF00; + b = pixel & 0x0000FF; + + *destDataPtr1++ = 0xFF000000 | r | g | b; + + pixel = LutY1 + LutC; + + if (pixel & OverflowMask) + { + if (pixel & 0xC0000000U) + { + if (pixel & 0x80000000U) + { + pixel &= ~0x3FC00000U; + } + else + { + pixel |= 0x3FC00000U; + } + } + if (pixel & 0x00180000U) + { + if (pixel & 0x00100000U) + { + pixel &= ~0x0007F800U; + } + else + { + pixel |= 0x0007F800U; + } + } + if (pixel & 0x00000300U) + { + if (pixel & 0x00000200U) + { + pixel &= ~0x000000FFU; + } + else + { + pixel |= 0x000000FFU; + } + } + } + + r = (pixel >> 6) & 0xFF0000; + g = (pixel >> 3) & 0x00FF00; + b = pixel & 0x0000FF; + + *destDataPtr1++ = 0xFF000000 | r | g | b; + + // row, 2 pixels + + LutY0 = KYLut[*aSourceDataPtrY2++]; + LutY1 = KYLut[*aSourceDataPtrY2++]; + + pixel = LutY0 + LutC; + + if (pixel & OverflowMask) + { + if (pixel & 0xC0000000U) + { + if (pixel & 0x80000000U) + { + pixel &= ~0x3FC00000U; + } + else + { + pixel |= 0x3FC00000U; + } + } + if (pixel & 0x00180000U) + { + if (pixel & 0x00100000U) + { + pixel &= ~0x0007F800U; + } + else + { + pixel |= 0x0007F800U; + } + } + if (pixel & 0x00000300U) + { + if (pixel & 0x00000200U) + { + pixel &= ~0x000000FFU; + } + else + { + pixel |= 0x000000FFU; + } + } + } + + r = (pixel >> 6) & 0xFF0000; + g = (pixel >> 3) & 0x00FF00; + b = pixel & 0x0000FF; + + *destDataPtr2++ = 0xFF000000 | r | g | b; + + pixel = LutY1 + LutC; + + if (pixel & OverflowMask) + { + if (pixel & 0xC0000000U) + { + if (pixel & 0x80000000U) + { + pixel &= ~0x3FC00000U; + } + else + { + pixel |= 0x3FC00000U; + } + } + if (pixel & 0x00180000U) + { + if (pixel & 0x00100000U) + { + pixel &= ~0x0007F800U; + } + else + { + pixel |= 0x0007F800U; + } + } + if (pixel & 0x00000300U) + { + if (pixel & 0x00000200U) + { + pixel &= ~0x000000FFU; + } + else + { + pixel |= 0x000000FFU; + } + } + } + + r = (pixel >> 6) & 0xFF0000; + g = (pixel >> 3) & 0x00FF00; + b = pixel & 0x0000FF; + + *destDataPtr2++ = 0xFF000000 | r | g | b; + + } + } + +// ----------------------------------------------------------------------------- +// DoConvertYuv422toXRGB0888 +// ----------------------------------------------------------------------------- +// +inline void DoConvertYuv422toXRGB0888( + TInt aWidth, // width in pixels + const TUint8*& aSourceDataPtr, // pointer to source row + TUint8* aDestDataPtr // pointer to destination row + ) + { + TUint32* destDataPtr = reinterpret_cast< TUint32* >( aDestDataPtr ); + // width assumed to be even + TInt pixelsLeft = aWidth / 2; + + TUint32 r, g, b; + TUint32 LutY0, LutY1, LutC; + TUint32 pixel; + TUint32 OverflowMask = 0xC0180300U; + + // One scanline at the time + while ( pixelsLeft-- ) + { + + LutC = KCbLut[*aSourceDataPtr++]; + LutY0 = KYLut[*aSourceDataPtr++]; + LutC += KCrLut[*aSourceDataPtr++]; + LutY1 = KYLut[*aSourceDataPtr++]; + + pixel = LutY0 + LutC; + + if (pixel & OverflowMask) + { + if (pixel & 0xC0000000U) + { + if (pixel & 0x80000000U) + { + pixel &= ~0x3FC00000U; + } + else + { + pixel |= 0x3FC00000U; + } + } + if (pixel & 0x00180000U) + { + if (pixel & 0x00100000U) + { + pixel &= ~0x0007F800U; + } + else + { + pixel |= 0x0007F800U; + } + } + if (pixel & 0x00000300U) + { + if (pixel & 0x00000200U) + { + pixel &= ~0x000000FFU; + } + else + { + pixel |= 0x000000FFU; + } + } + } + + r = (pixel >> 6) & 0xFF0000; + g = (pixel >> 3) & 0x00FF00; + b = pixel & 0x0000FF; + + *destDataPtr++ = 0xFF000000 | r | g | b; + + pixel = LutY1 + LutC; + + if (pixel & OverflowMask) + { + if (pixel & 0xC0000000U) + { + if (pixel & 0x80000000U) + { + pixel &= ~0x3FC00000U; + } + else + { + pixel |= 0x3FC00000U; + } + } + if (pixel & 0x00180000U) + { + if (pixel & 0x00100000U) + { + pixel &= ~0x0007F800U; + } + else + { + pixel |= 0x0007F800U; + } + } + if (pixel & 0x00000300U) + { + if (pixel & 0x00000200U) + { + pixel &= ~0x000000FFU; + } + else + { + pixel |= 0x000000FFU; + } + } + } + + r = (pixel >> 6) & 0xFF0000; + g = (pixel >> 3) & 0x00FF00; + b = pixel & 0x0000FF; + + *destDataPtr++ = 0xFF000000 | r | g | b; + } + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::NewL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +CVtEngDrawDP* CVtEngDrawDP::NewL( + MDisplaySinkObserver* aObserver ) + { + __VTPRINTENTER( "RVD(DP).NewL" ) + CVtEngDrawDP* self = new ( ELeave ) CVtEngDrawDP( aObserver ); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop(); + __VTPRINTEXIT( "RVD(DP).NewL" ) + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::~CVtEngDrawDP +// Destructor. Cannot leave. +// ----------------------------------------------------------------------------- +// +CVtEngDrawDP::~CVtEngDrawDP() + { + __VTPRINTENTER( "RVD(DP).~" ) + Cancel(); + delete iFrameBuffer; + delete iBufferWaiter; + delete iPostingSurface; + __VTPRINT( DEBUG_MEDIA , "RVD(DP).~ RRegion::Close()" ) + iClipRegion.Close(); + CloseDPLibrary(); + + delete iTarget; + delete iSource; + delete iImageScaler; + __VTPRINTEXIT( "RVD(DP).~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::CVtEngDraw +// C++ constructor. Cannot leave. +// ----------------------------------------------------------------------------- +// +CVtEngDrawDP::CVtEngDrawDP( MDisplaySinkObserver* aObserver ) : + CVtEngDraw( aObserver ), iClipRegion( 1 ), + iPostingFormat( KDefaultPostingFormat422 ) + { + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::BaseConstructL +// Base construction. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::BaseConstructL() + { + __VTPRINTENTER( "RVD(DP).BaseConstructL" ) + if ( IsFlag( EFlagUIForeground ) ) + { + DoBaseConstructL(); + } + else + { + SetFlag( EBaseConstructCalled ); + } + __VTPRINTEXIT( "RVD(DP).BaseConstructL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::CreateSinkL +// Instantiates display sink. +// ----------------------------------------------------------------------------- +// +MDisplaySink* CVtEngDrawDP::CreateSinkL() + { + __VTPRINTENTER( "RVD(DP).CreateSinkL" ) + TDisplaySinkParamsDP params; + GetSinkParams( params ); + MDisplaySink* sink = ::CreateSinkL( params, KNullDesC8 ); + if ( IsFlag( EBaseConstructCalled ) ) + { + sink->Pause(); + SetFlag( ESinkParamUpdateRequired | ESinkResumeRequired ); + } + __VTPRINTEXIT( "RVD(DP).CreateSinkL" ) + return sink; + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::CVtEngDraw::BaseRefreshL +// Draw a frame. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::BaseRefreshL() + { + __VTPRINTENTER( "RVD(DP).BaseRefreshL" ) + __VTPRINTEXIT( "RVD(DP).BaseRefreshL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::BaseRefreshBitmapsL +// Refreshes bitmaps sizes and display mode if needed. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::BaseRefreshBitmapsL() + { + __VTPRINTENTER( "RVD(DP).BaseRefreshBitmapsL" ) + BaseConstructL(); + InitializePostingSurfaceL(); + // set the params for DS + UpdateSinkParamsL(); + ClearFlag( EFirstFrameReceived ); + __VTPRINTEXIT( "RVD(DP).BaseRefreshBitmapsL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::BaseDoCancel +// DoCancel for derived class. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::BaseDoCancel() + { + __VTPRINTENTER( "RVD(DP).BaseDoCancel" ) + __VTPRINTEXIT( "RVD(DP).BaseDoCancel" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::BaseVerifyConfigL +// Checks current configuration against DP implementation. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::BaseVerifyConfigL() + { + __VTPRINTENTER( "RVD(DP).BaseVerifyConfigL" ) + // Check support for requested size + if ( !SupportsSize( iSourceSize ) ) + { + __VTPRINT( DEBUG_MEDIA , + "RVD(DP).BaseVerifyConfigL Size NOT supported" ) + User::Leave( KErrNotSupported ); + } + RecalculateClipRegionL(); + __VTPRINTEXIT( "RVD(DP).BaseVerifyConfigL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::BaseRestartL +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::BaseRestartL() + { + __VTPRINTENTER( "RVD(DP).BaseRestartL" ) + if ( IsFlag( EFlagUIForeground ) ) + { + RecalculateClipRegionL(); + iBufferWaiter->FetchBuffer(); + } + __VTPRINTEXIT( "RVD(DP).BaseRestartL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::BaseAbortNow +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::BaseAbortNow() + { + __VTPRINTENTER( "RVD(DP).BaseAbortNow" ) + UpdateVtFrame(); + __VTPRINTEXIT( "RVD(DP).BaseAbortNow" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::StartDrawL +// Starts the drawing. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::BaseStartDrawL() + { + __VTPRINTENTER( "RVD(DP).BaseStartDrawL" ) + if ( IsFlag( EBaseConstructCalled ) ) + { + SetFlag( EBaseBaseStartDrawCalled ); + } + else + { + DoBaseStartDrawL(); + } + __VTPRINTEXIT( "RVD(DP).BaseStartDrawL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::BaseStopDraw +// Stop the drawing. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::BaseStopDraw() + { + // Cancel the timer in any case. + __VTPRINTENTER( "RVD(DP).BaseStopDraw" ) + ClearFlag( EBaseBaseStartDrawCalled ); + iWatcher->Cancel(); + if ( iDSA ) + { + ClearFlag( ERemoteVideoDrawing | EStarted ); + iDSA->Cancel(); + } + iBufferWaiter->Cancel(); + Cancel(); + __VTPRINTEXIT( "RVD(DP).BaseStopDraw" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::BaseSetConfigL +// Sets new configuration. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::BaseSetConfigL( const TVtEngRenderConfig& aConfig ) + { + __VTPRINTENTER( "RVD(DP).BaseSetConfigL" ) + Mem::FillZ( &iConfig, sizeof( TVtEngRenderConfigDP ) ); + iConfig = aConfig; + if ( IsFlag( EBaseConstructCalled ) ) + { + SetFlag( EBaseSetConfigCalled ); + } + else + { + ConfigUpdatedL(); + } + __VTPRINTEXIT( "RVD(DP).BaseSetConfigL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::BaseSetUIForegroundL +// Sets UI foreground status. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::BaseSetUIForegroundL( TBool aForeground ) + { + __VTPRINTENTER( "RVD(DP).BaseSetUIForegroundL" ) + if( aForeground ) + { + TBool wasSentToBackground( IsFlag( ESentToBackground ) ); + SetFlag( EFlagUIForeground ); + ClearFlag( ESentToBackground ); + if( IsFlag( EDelayedCallsMask ) ) + { + HandleDelayedCallsL(); + } + if ( wasSentToBackground ) + { + BaseRefreshBitmapsL(); + Restart( RDirectScreenAccess::ETerminateCancel ); + BaseStartDrawL(); + } + } + else + { + if ( !IsFlag( EBaseConstructCalled ) ) + { + BaseStopDraw(); + delete iPostingSurface; + iPostingSurface = 0; + for ( TInt i = MDisplaySink::EFirstBitmap; + i < MDisplaySink::EFirstBitmap + KVtEngMaxBuffers; i++ ) + { + iBuffers[ i ].UnSet(); + } + SetFlag( ESentToBackground ); + } + ClearFlag( EFlagUIForeground ); + } + __VTPRINTEXIT( "RVD(DP).BaseSetUIForegroundL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::BaseRequestLastFrame +// Request update last remote video frame through MVtEngFrameObserver::vtSetFrame +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::BaseRequestLastFrame() + { + __VTPRINTENTER( "RVD(DP).BaseRequestLastFrame" ) + UpdateVtFrame(); + __VTPRINTEXIT( "RVD(DP).BaseRequestLastFrame" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::BaseVideoFrameSizeChangedL +// Called when incoming frame buffer size changes. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::BaseVideoFrameSizeChangedL( const TSize& aTo ) + { + __VTPRINTENTER( "RVD(DP).BaseVideoFrameSizeChangedL" ) + CreateFrameBufferL( aTo ); + __VTPRINTEXIT( "RVD(DP).BaseVideoFrameSizeChangedL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::Config +// Returns current configuration. +// ----------------------------------------------------------------------------- +// +TVtEngRenderConfig& CVtEngDrawDP::Config() + { + return iConfig; + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::RunL +// CActive heir execution method. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::RunL() + { + __VTPRINTENTER( "RVD(DP).RunL" ) + + TInt bitmapNo( iStatus.Int() ); + + if ( bitmapNo < KErrNone ) + { + __VTPRINT( DEBUG_MEDIA, "RVD(DP).RunL notify rvd problem" ) + CVtEngEventManager::NotifyEvent( KVtEngRemoteRenderingProblem ); + return; + } + + TVtEngBuffer& buffer = iBuffers[ bitmapNo ]; + + if ( !iDSUpdated ) + { + __VTPRINT( DEBUG_MEDIA, "RVD(DP).RunL !Updated" ) + __VTPRINTEXIT( "RVD(DP).RunL" ) + return; + } + else if ( !IsFlag( EFlagUIForeground ) ) + { + __VTPRINT( DEBUG_MEDIA, "RVD(DP).RunL !Flag( EFlagUIForeground )" ) + __VTPRINTEXIT( "RVD(DP).RunL" ) + if ( iPostingSurface ) + { + iPostingSurface->PostBuffer( buffer.Buffer() ); + buffer.UnSet(); + iBufferWaiter->FetchBuffer(); + } + return; + } + else if ( buffer.Buffer() == NULL ) + { + __VTPRINT( DEBUG_MEDIA, "RVD(DP).RunL signalled with NULL buffer" ) + TInt result( iBufferWaiter->FetchBuffer() ); + __VTPRINT2( DEBUG_MEDIA, + "RVD(DP).RunL FetchBuffer %d", result ) + User::LeaveIfError( result ); + __VTPRINTEXIT( "RVD(DP).RunL" ) + return; + } + + // Image received, reset counter. + iCheckpoint = KVtEngWatcherThreshold; + + StoreFrameBuffer( buffer.Buffer() ); + __VTPRINT2( DEBUG_MEDIA, "RVD(DP).RunL flags=%d", iFlags ) + TBool firstFrame( !IsFlag ( EFirstFrameReceived ) ); + SetFlag( EFirstFrameReceived ); + // Remote video is about to start? + if ( !IsFlag( EStarted ) && IsFlag( EReadyInternal ) ) + { + if ( !iDSA->IsActive() ) + { + iDSA->StartL(); + } + SetFlag( EStarted ); + if ( !iConfig.iClipRect.IsEmpty() ) + { + SetFlag( EReadyForeground ); + iDSA->Gc()->SetClippingRect( iConfig.iClipRect ); + RecalculateClipRegionL(); + } + __VTPRINT( DEBUG_MEDIA, "RVD(DP).RunL notify rvd start" ) + //CVtEngEventManager::NotifyEvent( KVtEngRemoteVideoStarted ); + } + if ( firstFrame ) + { + CVtEngEventManager::NotifyEvent( KVtEngRemoteVideoStarted ); + } + TRAPD( setClipRegResult, SetClipRegionL() ); + if ( setClipRegResult ) + { + __VTPRINT2( DEBUG_MEDIA, "RVD(DP).RunL SetClipRegionL failed %d", + setClipRegResult ); + } + __VTPRINT3( DEBUG_MEDIA, "RVD(DP).RunL received buffer %d $%x", + bitmapNo, + reinterpret_cast< TUint >( buffer.Buffer() ) ) + TInt result + ( iPostingSurface->PostBuffer( buffer.Buffer() ) ); + __VTPRINT2( DEBUG_MEDIA, "RVD(DP).RunL PostBuffer %d", result ) + buffer.UnSet(); + if ( iBuffers[ KVtEngBitmapNoReversed[ bitmapNo ] ].IsSet() ) + { + __VTPRINT2( DEBUG_MEDIA, "RVD(DP).RunL reactivating for buffer %d", + KVtEngBitmapNoReversed[ bitmapNo ] ) + Activate(); + DisplaySink().NextFrame(); + } + + if ( result == KErrNotReady ) + { + BaseRefreshBitmapsL(); + result = KErrNone; + } + + User::LeaveIfError( result ); + result = iBufferWaiter->FetchBuffer(); + __VTPRINT2( DEBUG_MEDIA, + "RVD(DP).RunL FetchBuffer %d", result ) + User::LeaveIfError( result ); + + __VTPRINTEXIT( "RVD(DP).RunL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::BufferReady +// BufferReady +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::BufferReady( CPostingSurface::TPostingBuff* aBuffer ) + { + __VTPRINTENTER( "RVD(DP).BufferReady" ) + SetAvailableToSink( aBuffer ); + __VTPRINTEXIT( "RVD(DP).BufferReady" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::FetchError +// Buffer fetching error +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::FetchError( TInt ) + { + __VTPRINTENTER( "RVD(DP).FetchError" ) + CVtEngEventManager::NotifyEvent( KVtEngRemoteRenderingProblem ); + __VTPRINTEXIT( "RVD(DP).FetchError" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::HandleDelayedCallsL +// +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::HandleDelayedCallsL() + { + __VTPRINTENTER( "RVD(DP).HandleDelayedCallsL" ) + if ( IsFlag( EBaseConstructCalled ) ) + { + DoBaseConstructL(); + } + if ( IsFlag( EBaseSetConfigCalled ) ) + { + ConfigUpdatedL(); + ClearFlag( EBaseSetConfigCalled ); + } + if ( IsFlag( EInitializePostingSurfaceCalled ) ) + { + DoInitializePostingSurfaceL(); + } + if ( IsFlag( ESinkParamUpdateRequired ) ) + { + DoUpdateSinkParamsL(); + } + if ( IsFlag( EBaseBaseStartDrawCalled ) ) + { + DoBaseStartDrawL(); + } + __VTPRINTEXIT( "RVD(DP).HandleDelayedCallsL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::DoBaseConstructL +// Base construction implementation +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::DoBaseConstructL() + { + __VTPRINTENTER( "RVD(DP).DoBaseConstructL" ) + + if ( !iImageScaler ) + { + iImageScaler = + CVtImageScaler::NewL( *this, CVtImageScaler::EBilinear ); + } + delete iBufferWaiter; + iBufferWaiter = NULL; + delete iPostingSurface; + iPostingSurface = NULL; + + // Load DP API library + LoadDPLibraryL(); + + // Create posting surface instance + iPostingSurface = CreatePostingSurfaceL(); + + CPostingSurface::TPostingFormat previousPostingFormat( iPostingFormat ); + + // Check support for format + if ( !SupportsFormat( KDefaultPostingFormat420 ) ) + { + if ( !SupportsFormat( KDefaultPostingFormat422 ) ) + { + __VTPRINT( DEBUG_MEDIA , + "RVD(DP).BaseConstructL Format NOT supported" ) + User::Leave( KErrNotSupported ); + } + else + { + __VTPRINT( DEBUG_MEDIA , "RVD(DP).BaseConstructL using 422" ) + iPostingFormat = KDefaultPostingFormat422; + } + } + else + { + __VTPRINT( DEBUG_MEDIA , "RVD(DP).BaseConstructL using 420" ) + iPostingFormat = KDefaultPostingFormat420; + } + iPostingSurface->GetCapabilities( iPostingCaps ); + iBufferWaiter = + new ( ELeave ) CVtEngBufferWaiter( *iPostingSurface, *this ); + for ( TInt i = MDisplaySink::EFirstBitmap; + i < MDisplaySink::EFirstBitmap + KVtEngMaxBuffers; i++ ) + { + iBuffers[ i ].UnSet(); + } + + // If posting for is different from previous, then free frame buffer + if ( ( previousPostingFormat != iPostingFormat ) || !iFrameBuffer ) + { + CreateFrameBufferL( iSourceSize ); + } + ClearFlag( EBaseConstructCalled ); + __VTPRINTEXIT( "RVD(DP).DoBaseConstructL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::UpdateSinkParamsL +// Updates sink params +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::UpdateSinkParamsL() + { + __VTPRINTENTER( "RVD(DP).UpdateSinkParamsL" ) + if ( IsFlag( EBaseConstructCalled ) ) + { + SetFlag( ESinkParamUpdateRequired ); + } + else + { + DoUpdateSinkParamsL(); + } + __VTPRINTEXIT( "RVD(DP).UpdateSinkParamsL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::DoBaseStartDrawL +// +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::DoBaseStartDrawL() + { + __VTPRINTENTER( "RVD(DP).DoBaseStartDrawL" ) + UpdateVtFrame(); + if ( iDSA ) + { + SetFlag( EReadyInternal ); + if ( !iWatcher->IsActive() ) + { + iWatcher->Start( KVtEngWatcherTimeout, KVtEngWatcherTimeout, + iCallback ); + } + User::LeaveIfError( iBufferWaiter->FetchBuffer() ); + SetFlag( ERemoteVideoDrawing ); + } + else + { + User::Leave( KErrNotReady ); + } + ClearFlag( EBaseBaseStartDrawCalled ); + __VTPRINTEXIT( "RVD(DP).DoBaseStartDrawL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::DoInitializePostingSurfaceL +// Initializes posting surface. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::DoInitializePostingSurfaceL() + { + __VTPRINTENTER( "RVD(DP).DoInitializePostingSurfaceL" ) + CPostingSurface::TPostingSourceParams postingSourceParams; + GetPostingSourceParams( postingSourceParams ); + CPostingSurface::TPostingParams postingParams; + GetPostingParams( postingParams ); + // Create and start DSA for getting access to DP + CreateAndStartDSAL(); + + /*S60 Display Posting API has a limitation that only one surface instance can be + created at a time. Unfortunately there's no way to check when posting is really + free. PostingSurface initialization maybe returns KErrInUse. + Please refer to TSW error EAKC-7R3TME. + The transition effect between landscape and portrait uses ATID to achieve smooth + transition. ATID and PostingSurface share the same buffers and cannot be used + simultaneously. PostingSurface initialization maybe returns KErrNotReady. + Please refer to TSW error EWXO-7P4DV3. + So it probably requires some kind of timer based retry to bypass these cases.*/ + TInt err; + while (1) + { + __VTPRINT( DEBUG_MEDIA, "RVD(DP).DoInitializePostingSurfaceL Initialize PostingSurface" ); + TRAP( err, iPostingSurface->InitializeL(postingSourceParams, postingParams) ); + if ( err == KErrNone) + { + break; + } + else + { + //time interval for each PostingSurface initialization is 0.2 second. + __VTPRINT2( DEBUG_MEDIA, "RVD(DP).DoInitializePostingSurfaceL InitPS error = %d", err ) + User::After(200000); + } + } + + delete iTarget; iTarget = NULL; + iTarget = CVtImageBitmap::NewL( + postingParams.iDisplayedRect.Size(), EColor16MU ); + if ( iSource ) + { + if ( IsFlag( EFrameBufferFilled ) && + !IsFlag( EFrameBufferNeedsConvertAndScale ) ) + { + iImageScaler->ScaleNowL( *iSource, *iTarget ); + Config().iObserver->vtSetFrame( + MVtEngFrameObserver::ERemoteVideoFrame, + &iTarget->Bitmap() ); + } + else + { + Config().iObserver->vtSetFrame( + MVtEngFrameObserver::ERemoteVideoFrame, NULL ); + } + } + else + { + //delete iSource; iSource = NULL; + iSource = CVtImageBitmap::NewL( iSourceSize, EColor16MU ); + Config().iObserver->vtSetFrame( MVtEngFrameObserver::ERemoteVideoFrame, + NULL ); + } + RecalculateClipRegionL(); + ClearFlag( EInitializePostingSurfaceCalled ); + __VTPRINTEXIT( "RVD(DP).DoInitializePostingSurfaceL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::DoUpdateSinkParamsL +// Updates sink params +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::DoUpdateSinkParamsL() + { + __VTPRINTENTER( "RVD(DP).DoUpdateSinkParamsL" ) + TDisplaySinkParamsDP params; + GetSinkParams( params ); + DisplaySink().UpdateSinkParamsL( params, iDSUpdated ); + ClearFlag( ESinkParamUpdateRequired ); + if ( IsFlag( ESinkResumeRequired ) ) + { + DisplaySink().Resume(); + ClearFlag( ESinkResumeRequired ); + } + __VTPRINTEXIT( "RVD(DP).DoUpdateSinkParamsL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::IsAlphaTrashed +// Checks if the alpha has been trashed on screen buffer. +// ----------------------------------------------------------------------------- +// +TBool CVtEngDrawDP::IsAlphaTrashed() const + { + __VTPRINTENTER( "RVD(DP).IsAlphaTrashed" ) + TBool isTrashed( EFalse ); + const CFbsScreenDevice& sdev( *iDSA->ScreenDevice() ); + if ( sdev.DisplayMode() == EColor16MA ) + { + TRgb color; + TPoint point( iClipRegion.BoundingRect().Center() ); + sdev.GetPixel( color, point ); + isTrashed = ( color.Alpha() != 0 ); + } + __VTPRINTEXITR( "RVD(DP).IsAlphaTrashed %d", isTrashed ) + return isTrashed; + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::SetClipRegionL +// Sets clipping region for DP. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::SetClipRegionL() + { + __VTPRINTENTER( "RVD(DP).SetClipRegionL" ) + if ( iClipRegionUpdated || IsAlphaTrashed() ) + { + iClipRegionUpdated = EFalse; + CFbsBitGc* gc = iDSA->Gc(); + gc->SetClippingRegion( iDSA->DrawingRegion() ); + gc->SetDrawMode( CGraphicsContext::EDrawModeAND ); + gc->SetBrushColor( TRgb( 255, 255, 255, 0 ) ); + gc->Clear(); + iDSA->ScreenDevice()->Update(); + User::LeaveIfError( + iPostingSurface->SetClipRegion( iClipRegion ) ); + } + __VTPRINTEXIT( "RVD(DP).SetClipRegionL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::InitializePostingSurfaceL +// Initializes posting surface. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::InitializePostingSurfaceL() + { + __VTPRINTENTER( "RVD(DP).InitializePostingSurfaceL" ) + if ( IsFlag( EBaseConstructCalled ) ) + { + SetFlag( EInitializePostingSurfaceCalled ); + } + else + { + DoInitializePostingSurfaceL(); + } + __VTPRINTEXIT( "RVD(DP).InitializePostingSurfaceL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::GetPostingSourceParams +// Fills posting source params structure. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::GetPostingSourceParams( + CPostingSurface::TPostingSourceParams& aParams ) const + { + __VTPRINTENTER( "RVD(DP).GetPostingSourceParams" ) + Mem::FillZ( &aParams, sizeof( CPostingSurface::TPostingSourceParams ) ); + aParams.iPostingBuffering = KDefaultPostingBufferingFlags; + aParams.iBufferType = CPostingSurface::EStandardBuffer; + aParams.iPostingUsage = CPostingSurface::EVideoCapture; + aParams.iSourceImageSize = iSourceSize; + aParams.iPostingFormat = iPostingFormat; + aParams.iPixelAspectRatioNum = KDefaultPixelAspectRatioNum; + aParams.iPixelAspectRatioDenom = KDefaultPixelAspectRatioDenom; + aParams.iContentCopyRestricted = EFalse; + __VTPRINTEXIT( "RVD(DP).GetPostingSourceParams" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::GetPostingParams +// Fills posting params structure. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::GetPostingParams( + CPostingSurface::TPostingParams& aParams ) const + { + __VTPRINTENTER( "RVD(DP).GetPostingParams" ) + Mem::FillZ( &aParams, sizeof( CPostingSurface::TPostingParams ) ); + + aParams.iDisplayedRect = iConfig.iClipRect; + + __VTPRINT3( DEBUG_MEDIA, "RVD(DP).GetPostingParams DRect.iTl (%d, %d)", + aParams.iDisplayedRect.iTl.iX, aParams.iDisplayedRect.iTl.iY ); + __VTPRINT3( DEBUG_MEDIA, "RVD(DP).GetPostingParams DRect.iBr (%d, %d)", + aParams.iDisplayedRect.iBr.iX, aParams.iDisplayedRect.iBr.iY ); + + TRect& dispRect( aParams.iDisplayedRect ); + dispRect.Move( iConfig.iOffset ); + FixRectForDP( dispRect ); + __VTPRINT3( DEBUG_MEDIA, "RVD(DP).GetPostingParams OffsDRect.iTl (%d, %d)", + dispRect.iTl.iX, dispRect.iTl.iY ); + __VTPRINT3( DEBUG_MEDIA, "RVD(DP).GetPostingParams OffsDRect.iBr (%d, %d)", + dispRect.iBr.iX, dispRect.iBr.iY ); + + aParams.iScaleToRect = TRect( aParams.iDisplayedRect.Size() ); + + aParams.iInputCrop = iSourceSize; + + __VTPRINT3( DEBUG_MEDIA, "RVD(DP).GetPostingParams InputCrop.iTl (%d, %d)", + aParams.iInputCrop.iTl.iX, aParams.iInputCrop.iTl.iY ); + __VTPRINT3( DEBUG_MEDIA, "RVD(DP).GetPostingParams InputCrop.iBr (%d, %d)", + aParams.iInputCrop.iBr.iX, aParams.iInputCrop.iBr.iY ); + + aParams.iBackGround = iConfig.iBackGround; + __VTPRINTEXIT( "RVD(DP).GetPostingParams" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::SupportsFormat +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngDrawDP::SupportsFormat( + const CPostingSurface::TPostingFormat& aFormat ) const + { + return iPostingSurface->FormatSupported( aFormat ); + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::SupportsSize +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngDrawDP::SupportsSize( const TSize& aSize ) const + { + return ( iPostingCaps.iMaxPixelSize.iWidth >= aSize.iWidth ) && + ( iPostingCaps.iMaxPixelSize.iHeight >= aSize.iHeight ); + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::SupportsRotation +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngDrawDP::SupportsRotation( + CPostingSurface::TRotationType aRotation ) const + { + return ( ( aRotation & iPostingCaps.iSupportedRotations ) == aRotation ); + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::SupportsMirroring +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngDrawDP::SupportsMirroring() const + { + return iPostingCaps.iSupportsMirroring; + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::SupportsScaling +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngDrawDP::SupportsScaling() const + { + return iPostingCaps.iSupportsScaling; + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::SupportsBrightness +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngDrawDP::SupportsBrightness() const + { + return iPostingCaps.iSupportsBrightnessControl; + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::SupportsContrast +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngDrawDP::SupportsContrast() const + { + return iPostingCaps.iSupportsContrastControl; + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::GetFrameBufferSize +// Returns size of frame buffer in bytes for given pixel size and current +// posting format. +// ----------------------------------------------------------------------------- +// +TInt CVtEngDrawDP::GetFrameBufferSize( const TSize& aSize ) const + { + TInt size( -1 ); + __VTPRINTENTER( "RVD(DP).GetFrameBufferSize" ) + switch( iPostingFormat ) + { + case KDefaultPostingFormat420: + size = ( aSize.iWidth * aSize.iHeight * 3 ) >> 1; + break; + + case KDefaultPostingFormat422: + size = ( aSize.iWidth * aSize.iHeight ) * 2; + break; + + default: + break; + } + __VTPRINTEXITR( "RVD(DP).GetFrameBufferSize %d", size ) + return size; + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::RecalculateClipRegionL +// Updates clipregion. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::RecalculateClipRegionL() + { + __VTPRINTENTER( "RVD(DP).RecalculateClipRegionL" ) + // Clip region needs to be updated + iClipRegionUpdated = ETrue; + iClipRegion.Clear(); + TRect clippingRect( iConfig.iClipRect ); + clippingRect.Move( iConfig.iOffset ); + FixRectForDP( clippingRect ); + iClipRegion.AddRect( clippingRect ); + if ( iClipRegion.CheckError() ) + { + __VTPRINT( DEBUG_MEDIA , + "RVD(DP).RecalculateClipRegionL failed to add cliprect" ) + User::Leave( KErrNoMemory ); + } + + if ( IsFlag( EStarted ) && iDSA && iDSA->DrawingRegion() ) + { + iClipRegion.Intersect( *iDSA->DrawingRegion() ); + if ( iClipRegion.CheckError() ) + { + __VTPRINT( DEBUG_MEDIA , + "RVD(DP).RecalculateClipRegionL failed to intersect" ) + User::Leave( KErrNoMemory ); + } + +#ifdef VTDEBUG + + TRect bRect( iClipRegion.BoundingRect() ); + __VTPRINT3( DEBUG_MEDIA, "RVD(DP).RecalculateClipRegionL BRect.iTl (%d, %d)", + bRect.iTl.iX, bRect.iTl.iY ); + __VTPRINT3( DEBUG_MEDIA, "RVD(DP).RecalculateClipRegionL BRect.iBr (%d, %d)", + bRect.iBr.iX, bRect.iBr.iY ); +#endif // VTDEBUG + } + __VTPRINTEXIT( "RVD(DP).RecalculateClipRegionL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::FixRectForDP +// Fixes rect for DP (i.e. width is made even and starting X coordinate is made +// even as well) +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::FixRectForDP( TRect& aRect ) const + { + __VTPRINTENTER( "RVD(DP).FixRectForDP" ) + if ( aRect.iTl.iX & 1 ) + { + aRect.Move( 1, 0 ); + aRect.SetWidth( Max( 0, aRect.Width() - 1 ) ); + } + if ( aRect.Width() & 1 ) + { + aRect.SetWidth( aRect.Width() - 1 ); + } + __VTPRINTEXIT( "RVD(DP).FixRectForDP" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::RecalculateClipRegionL +// Fills sink params. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::GetSinkParams( TDisplaySinkParamsDP& aSinkParams ) + { + __VTPRINTENTER( "RVD(DP).GetSinkParams" ) + Mem::FillZ( &aSinkParams, sizeof( TDisplaySinkParamsDP ) ); + aSinkParams.iThreadId = RThread().Id(); + aSinkParams.iRequestStatusPtr = &iStatus; + aSinkParams.iObserver = iObserver; + aSinkParams.iPostingBuffer1 = &iBuffers[ 0 ].Buffer(); + aSinkParams.iPostingBuffer2 = &iBuffers[ 1 ].Buffer(); + aSinkParams.iFrameSize = iSourceSize; + aSinkParams.iPostingFormat = iPostingFormat; + aSinkParams.iFlags = TDisplaySinkParams::EDisplaySinkDP; + __VTPRINTEXITR( "RVD(DP).GetSinkParams flags=%d", + (TInt) aSinkParams.iFlags ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::DisplaySink +// Returns reference to sink. +// ----------------------------------------------------------------------------- +// +MDisplaySink& CVtEngDrawDP::DisplaySink() + { + return *iDisplaySink; + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::StoreFrameBuffer +// Stores given frame buffer. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::StoreFrameBuffer( + CPostingSurface::TPostingBuff* aPostingBuffer ) + { + __VTPRINTENTER( "RVD(DP).StoreFrameBuffer" ) + if ( iPostingFormat == KDefaultPostingFormat422 ) + { + const TInt height( iSourceSize.iHeight ); + const TInt srcStride( aPostingBuffer->GetStride() ); + const TInt dstStride( iSourceSize.iWidth * 2 ); + TUint8* dst = + const_cast< TUint8* >( iFrameBuffer->Des().Ptr() ); + const TUint8* src = + reinterpret_cast< const TUint8* >( aPostingBuffer->GetBuffer() ); + for ( TInt y = height - 1; y >= 0; y-- ) + { + dst = Mem::Copy( dst, src, dstStride ); + src += srcStride; + } + } + else + { + TInt frameBufferSizeInBytes( GetFrameBufferSize( iSourceSize ) ); + TPtrC8 postingBufferDesC( + reinterpret_cast< const TUint8* >( aPostingBuffer->GetBuffer() ), + frameBufferSizeInBytes ); + *iFrameBuffer = postingBufferDesC; + } + SetFlag( EFrameBufferFilled | EFrameBufferNeedsConvertAndScale ); + __VTPRINTEXIT( "RVD(DP).StoreFrameBuffer" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::CreateFrameBufferL +// Creates frame buffer. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::CreateFrameBufferL( const TSize& aSize ) + { + __VTPRINTENTER( "RVD(DP).CreateFrameBufferL" ) + delete iFrameBuffer; iFrameBuffer = NULL; + iFrameBuffer = HBufC8::NewL( GetFrameBufferSize( aSize ) ); + ClearFlag( EFrameBufferFilled | EFrameBufferNeedsConvertAndScale ); + __VTPRINTEXIT( "RVD(DP).CreateFrameBufferL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::SetAvailableToSink +// Sets posting buffer available to sink. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::SetAvailableToSink( CPostingSurface::TPostingBuff* aBuffer ) + { + __VTPRINTENTER( "RVD(DP).SetAvailableToSink" ) + for ( TInt i = MDisplaySink::EFirstBitmap; + i < MDisplaySink::EFirstBitmap + KVtEngMaxBuffers; i++ ) + { + if ( !iBuffers[ i ].IsSet() ) + { + __VTPRINT3( DEBUG_MEDIA, + "RVD(DP).SetAvailableToSink buffer %d: $%x", + i, reinterpret_cast< TUint >( aBuffer->GetBuffer() ) ); + iBuffers[ i ].Set( aBuffer ); + Activate(); + DisplaySink().SetBitmapAvailable( + static_cast< MDisplaySink::TBitmapNo >( i ) ); + break; + } + } + __VTPRINTEXIT( "RVD(DP).SetAvailableToSink" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::SetAvailableToSink +// Sets posting buffer available to sink. +// ----------------------------------------------------------------------------- +// +CPostingSurface* CVtEngDrawDP::CreatePostingSurfaceL() + { + __VTPRINTENTER( "RVD(DP).CreatePostingSurfaceL" ) + CPostingSurface* postingSurface = NULL; + CPostingSurfaceFactory* ( *createFactoryL )() = + reinterpret_cast< CPostingSurfaceFactory*(*)() >( iDPLib->Lookup( 1 ) ); + if ( createFactoryL ) + { + CPostingSurfaceFactory* factory = createFactoryL(); + CleanupStack::PushL( factory ); + postingSurface = factory->NewPostingSurfaceL( EMainDisplay ); + CleanupStack::PopAndDestroy(); // factory + } + __VTPRINTEXIT( "RVD(DP).CreatePostingSurfaceL" ) + return postingSurface; + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::CloseDPLibrary +// Close the DP API library and free the allocated instance. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::CloseDPLibrary() + { + if ( iDPLib ) + { + iDPLib->Close(); + delete iDPLib; + iDPLib = NULL; + } + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::LoadDPLibraryL +// Loads DP API library. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::LoadDPLibraryL() + { + CloseDPLibrary(); + iDPLib = new ( ELeave ) RLibrary(); + TInt error( iDPLib->Load( KDPAPIDLLName() ) ); + if ( error ) + { + delete iDPLib; + iDPLib = NULL; + User::Leave( error ); + } + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::Convert420ToVtImg +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::Convert420ToVtImg( HBufC8* aSource, + CVtImageBitmap& aTarget ) + { + __VTPRINTENTER( "RVD(DP).Convert420ToVtImg" ) + + CFbsBitmap& bitmap( aTarget.Bitmap() ); + TSize size( bitmap.SizeInPixels() ); + TInt height( size.iHeight ); + TInt width( size.iWidth ); + TInt bytes( bitmap.ScanLineLength( width, bitmap.DisplayMode() ) ); + + const TUint8* y1ptr = aSource->Ptr(); + const TUint8* y2ptr = y1ptr + width; + const TUint8* uptr = y1ptr + ( width * height ); + const TUint8* vptr = uptr + ( width * height ) / 4; + + bitmap.LockHeap(); + + TUint8* d1ptr = reinterpret_cast< TUint8* >( bitmap.DataAddress() ); + TUint8* d2ptr = d1ptr + bytes; + + height /= 2; // divide by 2 because we process to rows at time + bytes *= 2; // multiply by 2 so we don't need to do it in loop + + while ( height-- ) + { + DoConvertYuv420toXRGB0888( width, y1ptr, y2ptr, uptr, vptr, d1ptr, + d2ptr ); + y1ptr = y2ptr; + y2ptr += width; + d1ptr += bytes; + d2ptr += bytes; + } + + bitmap.UnlockHeap(); + + __VTPRINTEXIT( "RVD(DP).Convert420ToVtImg" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::Convert422ToVtImg +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::Convert422ToVtImg( HBufC8* aSource, CVtImageBitmap& aTarget ) + { + __VTPRINTENTER( "RVD(DP).Convert422ToVtImg" ) + CFbsBitmap& bitmap( aTarget.Bitmap() ); + TSize size( bitmap.SizeInPixels() ); + TInt height( size.iHeight ); + TInt width( size.iWidth ); + TInt bytes( bitmap.ScanLineLength( width, bitmap.DisplayMode() ) ); + + const TUint8* sptr = aSource->Ptr(); + + bitmap.LockHeap(); + + TUint8* dptr = reinterpret_cast< TUint8* >( bitmap.DataAddress() ); + while ( height-- ) + { + DoConvertYuv422toXRGB0888( width, sptr, dptr ); + dptr += bytes; + } + + bitmap.UnlockHeap(); + + __VTPRINTEXIT( "RVD(DP).Convert422ToVtImg" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::UpdateVtFrame +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::UpdateVtFrame() + { + __VTPRINTENTER( "RVD(DP).UpdateVtFrame" ) + if ( IsFlag( EFrameBufferFilled ) ) + { + CFbsBitmap* bitmap = NULL; + if ( IsFlag( EFrameBufferNeedsConvertAndScale ) ) + { + if ( iPostingFormat == KDefaultPostingFormat422 ) + { + Convert422ToVtImg( iFrameBuffer, *iSource ); + } + else + { + Convert420ToVtImg( iFrameBuffer, *iSource ); + } + TRAPD( error, iImageScaler->ScaleNowL( *iSource, *iTarget ) ); + if ( !error ) + { + bitmap = &iTarget->Bitmap(); + } + ClearFlag( EFrameBufferNeedsConvertAndScale ); + } + else + { + bitmap = &iTarget->Bitmap(); + } + Config().iObserver->vtSetFrame( MVtEngFrameObserver::ERemoteVideoFrame, + bitmap ); + } + __VTPRINTEXIT( "RVD(DP).UpdateVtFrame" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::ScalingFinished +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::ScalingFinished( TInt ) + { + } + +// Implementation for CVtEngDrawDP::TVtEngBuffer + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::TVtEngBuffer::TVtEngBuffer +// +// ----------------------------------------------------------------------------- +// +CVtEngDrawDP::TVtEngBuffer::TVtEngBuffer() + : iBuffer( 0 ) + { + __VTPRINTENTER( "RVD(DP).Buffer.Ctor" ) + __VTPRINTEXIT( "RVD(DP).Buffer.Ctor" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::TVtEngBuffer::Set +// +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::TVtEngBuffer::Set( CPostingSurface::TPostingBuff* aBuffer ) + { + __VTPRINTENTER( "RVD(DP).Buffer.Set" ) + __VTPRINT2( DEBUG_MEDIA, "RVD(DP).Buffer.Set $%x", + reinterpret_cast< TUint >( aBuffer->GetBuffer() ) ) + iBuffer = aBuffer; + __VTPRINTEXIT( "RVD(DP).Buffer.Set" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::TVtEngBuffer::UnSet +// +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::TVtEngBuffer::UnSet() + { + __VTPRINTENTER( "RVD(DP).Buffer.UnSet" ) + iBuffer = 0; + __VTPRINTEXIT( "RVD(DP).Buffer.UnSet" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::TVtEngBuffer::IsSet +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngDrawDP::TVtEngBuffer::IsSet() const + { + return ( iBuffer != 0 ); + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::TVtEngBuffer::Buffer +// +// ----------------------------------------------------------------------------- +// +CPostingSurface::TPostingBuff*& CVtEngDrawDP::TVtEngBuffer::Buffer() + { + return iBuffer; + } + +// Implementation for CVtEngDrawDP::CVtEngBufferWaiter + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::CVtEngBufferWaiter::CVtEngBufferWaiter +// ----------------------------------------------------------------------------- +// +CVtEngDrawDP::CVtEngBufferWaiter::CVtEngBufferWaiter + ( CPostingSurface& aPostingSurface, MVtEngBufferWaiterObserver& aObserver ) + : CActive( CActive::EPriorityStandard ), + iPostingSurface( &aPostingSurface ), iObserver( &aObserver ) + { + __VTPRINTENTER( "RVD(DP).BufferWaiter.Ctor" ) + CActiveScheduler::Add( this ); + __VTPRINTEXIT( "RVD(DP).BufferWaiter.Ctor" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::CVtEngBufferWaiter::~CVtEngBufferWaiter +// ----------------------------------------------------------------------------- +// +CVtEngDrawDP::CVtEngBufferWaiter::~CVtEngBufferWaiter() + { + __VTPRINTENTER( "RVD(DP).BufferWaiter.~" ) + Cancel(); + __VTPRINTEXIT( "RVD(DP).BufferWaiter.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::CVtEngBufferWaiter::Activate +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::CVtEngBufferWaiter::Activate() + { + __VTPRINTENTER( "RVD(DP).BufferWaiter.Activate" ) + iStatus = KRequestPending; + SetActive(); + __VTPRINTEXIT( "RVD(DP).BufferWaiter.Activate" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::CVtEngBufferWaiter::FetchBuffer +// ----------------------------------------------------------------------------- +// +TInt CVtEngDrawDP::CVtEngBufferWaiter::FetchBuffer() + { + __VTPRINTENTER( "RVD(DP).BufferWaiter.FetchBuffer" ) + // do nothing if we're already active + if ( IsActive() ) + { + __VTPRINTEXIT( "RVD(DP).BufferWaiter.FetchBuffer" ) + return KErrNone; + } + // else start fetching + Activate(); + __VTPRINTEXIT( "RVD(DP).BufferWaiter.FetchBuffer" ) + return iPostingSurface->WaitForNextBuffer( iStatus ); + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::CVtEngBufferWaiter::RunL +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::CVtEngBufferWaiter::RunL() + { + __VTPRINTENTER( "RVD(DP).BufferWaiter.RunL" ) + __VTPRINT2( DEBUG_MEDIA, "RVD(DP).BufferWaiter.RunL %d", iStatus.Int() ); + TInt result( iStatus.Int() ); + if ( result == KErrNone ) + { + iObserver->BufferReady( iPostingSurface->NextBuffer() ); + } + else + { + iObserver->FetchError( result ); + } + __VTPRINTEXIT( "RVD(DP).BufferWaiter.RunL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDP::CVtEngBufferWaiter::DoCancel +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDP::CVtEngBufferWaiter::DoCancel() + { + __VTPRINTENTER( "RVD(DP).BufferWaiter.DoCancel" ) + iPostingSurface->CancelBuffer(); + __VTPRINTEXIT( "RVD(DP).BufferWaiter.DoCancel" ) + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Media/CVtEngDrawDSA.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Media/CVtEngDrawDSA.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,586 @@ +/* +* 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: Remote video handler. +* +*/ + + +// INCLUDE FILES + +#include "CVtEngDrawDSA.h" +#include "CVtEngEventManager.h" +#include "VtEngPanic.h" +#include "MVtEngFrameObserver.h" +#include "CVtEngSettings.h" +#include "VtEngUtils.h" +#include +#include +#include + +// LOCAL CONSTANTS + +// Default display mode. +const TDisplayMode KVtEngDefaultDisplayMode( EColor64K ); + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::NewL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +CVtEngDrawDSA* CVtEngDrawDSA::NewL( + MDisplaySinkObserver* aObserver ) + { + CVtEngDrawDSA* self = new ( ELeave ) CVtEngDrawDSA( aObserver ); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::~CVtEngDrawDSA +// Destructor. Cannot leave. +// ----------------------------------------------------------------------------- +// +CVtEngDrawDSA::~CVtEngDrawDSA() + { + __VTPRINTENTER( "RVD(DSA).~" ) + Cancel(); + delete iBitmap1; + delete iBitmap2; + if ( iImageScaler ) + { + iImageScaler->Release(); + } + __VTPRINTEXIT( "RVD(DSA).~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::CVtEngDrawDSA +// C++ constructor. Cannot leave. +// ----------------------------------------------------------------------------- +// +CVtEngDrawDSA::CVtEngDrawDSA( MDisplaySinkObserver* aObserver ) : + CVtEngDraw( aObserver ), iBitmapSetAvail( ETrue ) + { + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::BaseConstructL +// Base construction. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDSA::BaseConstructL( ) + { + __VTPRINTENTER( "RVD(DSA).BaseConstructL" ) + TSize vtEngRemoteVideoDefaultSize( KVtEngRemoteVideoDefaultWidth, + KVtEngRemoteVideoDefaultHeight ); + + iBitmap1 = new ( ELeave ) CFbsBitmap(); + User::LeaveIfError( iBitmap1->Create( + vtEngRemoteVideoDefaultSize, KVtEngDefaultDisplayMode ) ); + iBitmap2 = new ( ELeave ) CFbsBitmap(); + User::LeaveIfError( iBitmap2->Create( + vtEngRemoteVideoDefaultSize, KVtEngDefaultDisplayMode ) ); + iImageScaler = VtEngScalerFactory::CreateScalerL( *this ); + __VTPRINT2( DEBUG_MEDIA | DEBUG_CONSTRUCT, + "RVD.ConL scaler ok %d", iImageScaler != NULL ) + __VTPRINTEXIT( "RVD(DSA).BaseConstructL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::CreateSinkL +// Instantiates display sink. +// ----------------------------------------------------------------------------- +// +MDisplaySink* CVtEngDrawDSA::CreateSinkL() + { + __VTPRINTENTER( "RVD(DSA).CreateSinkL" ) + TDisplaySinkParamsDSA params; + GetSinkParams( params ); + MDisplaySink* sink = ::CreateSinkL( params, KNullDesC8 ); + __VTPRINTEXITR( "RVD(DSA).CreateSinkL flags=%d", params.iFlags ) + return sink; + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::BaseDoCancel +// DoCancel for derived class. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDSA::BaseDoCancel() + { + __VTPRINTENTER( "RVD(DSA).BaseDoCancel" ) + __VTPRINTEXIT( "RVD(DSA).BaseDoCancel" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::BaseVerifyConfigL +// Checks current configuration against DSA implementation. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDSA::BaseVerifyConfigL() + { + __VTPRINTENTER( "RVD(DSA).BaseVerifyConfigL" ) + __VTPRINTEXIT( "RVD(DSA).BaseVerifyConfigL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::BaseRestartL +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDSA::BaseRestartL() + { + __VTPRINTENTER( "RVD(DSA).BaseRestartL" ) + __VTPRINTEXIT( "RVD(DSA).BaseRestartL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::BaseAbortNow +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDSA::BaseAbortNow() + { + __VTPRINTENTER( "RVD(DSA).BaseAbortNow" ) + __VTPRINTEXIT( "RVD(DSA).BaseAbortNow" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::BaseStartDrawL +// Starts the drawing. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDSA::BaseStartDrawL() + { + __VTPRINTENTER( "RVD(DSA).BaseStartDrawL" ) + if ( iDSA ) + { + SetFlag( EReadyInternal ); + if ( !IsActive() ) + { + Activate(); + iDisplaySink->SetBitmapAvailable( MDisplaySink::EFirstBitmap ); + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + "RVD(DSA).BaseStartDrawL bmp avail done" ) + iWatcher->Start( KVtEngWatcherTimeout, KVtEngWatcherTimeout, + iCallback ); + } + SetFlag( ERemoteVideoDrawing ); + } + else + { + User::Leave( KErrNotReady ); + } + __VTPRINTEXIT( "RVD(DSA).BaseStartDrawL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::BaseStopDraw +// Stop the drawing. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDSA::BaseStopDraw() + { + // Cancel the timer in any case. + __VTPRINTENTER( "RVD(DSA).BaseStopDraw" ) + iWatcher->Cancel(); + if ( iDSA ) + { + ClearFlag( ERemoteVideoDrawing | EStarted ); + iDSA->Cancel(); + } + + // Stop also scaling + if ( iImageScaler ) + { + iImageScaler->Cancel(); + } + + Cancel(); + __VTPRINTEXIT( "RVD(DSA).BaseStopDraw" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::BaseSetConfigL +// Sets new configuration. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDSA::BaseSetConfigL( const TVtEngRenderConfig& aConfig ) + { + __VTPRINTENTER( "RVD(DSA).BaseSetConfigL" ) + Mem::FillZ( &iConfig, sizeof( TVtEngRenderConfigDSA ) ); + iConfig = aConfig; + ConfigUpdatedL(); + __VTPRINTEXIT( "RVD(DSA).BaseSetConfigL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::BaseSetUIForegroundL +// Sets UI foreground status. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDSA::BaseSetUIForegroundL( TBool aForeground ) + { + __VTPRINTENTER( "RVD(DSA).BaseSetUIForegroundL" ) + if ( aForeground ) + { + TBool wasSentToBackground( IsFlag( ESentToBackground ) ); + SetFlag( EFlagUIForeground ); + ClearFlag( ESentToBackground ); + if ( wasSentToBackground ) + { + BaseRefreshBitmapsL(); + Restart( RDirectScreenAccess::ETerminateCancel ); + BaseStartDrawL(); + } + } + else + { + BaseStopDraw(); + ClearFlag( EFlagUIForeground ); + SetFlag( ESentToBackground ); + } + __VTPRINTEXIT( "RVD(DSA).BaseSetUIForegroundL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::BaseVideoFrameSizeChangedL +// Called when incoming frame buffer size changes. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDSA::BaseVideoFrameSizeChangedL( const TSize& /*aTo*/ ) + { + __VTPRINTENTER( "RVD(DSA).BaseVideoFrameSizeChangedL" ) + __VTPRINTEXIT( "RVD(DSA).BaseVideoFrameSizeChangedL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::BaseRequestLastFrame +// Request update last remote video frame through MVtEngFrameObserver::vtSetFrame +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDSA::BaseRequestLastFrame() + { + __VTPRINTENTER( "RVD(DSA).BaseRequestLastFrame" ) + __VTPRINTEXIT( "RVD(DSA).BaseRequestLastFrame" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::Config +// Returns current configuration. +// ----------------------------------------------------------------------------- +// +TVtEngRenderConfig& CVtEngDrawDSA::Config() + { + return iConfig; + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::RunL +// CActive heir execution method. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDSA::RunL() + { + __VTPRINTENTER( "RVD(DSA).RunL" ) + __VTPRINT2( DEBUG_MEDIA, " bmpNo=%d", iBitmapNo ) + iBitmapNo = iStatus.Int() == 0 ? + MDisplaySink::ESecondBitmap : + MDisplaySink::EFirstBitmap ; + + iBitmapSetAvail = EFalse; + + TBool dropFrame( EFalse ); + + if ( !iDSUpdated ) + { + __VTPRINT( DEBUG_MEDIA, "RVD(DSA).RunL !Updated" ) + dropFrame = ETrue; + } + else if ( !IsFlag( EFlagUIForeground ) ) + { + __VTPRINT( DEBUG_MEDIA, "RVD(DSA).RunL !Flag( EFlagUIForeground )" ) + dropFrame = ETrue; + } + + if ( dropFrame ) + { + iBitmapSetAvail = ETrue; + Activate(); + iDisplaySink->SetBitmapAvailable( iBitmapNo ); + __VTPRINTEXIT( "RVD(DSA).RunL" ) + return; + } + + // Image received, reset counter. + iCheckpoint = KVtEngWatcherThreshold; + + __VTPRINT2( DEBUG_MEDIA, "RVD(DSA).RunL iStatus=%d", iStatus.Int() ) + if ( iStatus >= KErrNone ) + { + __VTPRINT2( DEBUG_MEDIA, "RVD(DSA).RunL flags=%d", iFlags ) + TBool firstFrame( !IsFlag ( EFirstFrameReceived ) ); + SetFlag( EFirstFrameReceived ); + + // Remote video is about to start? + if ( !IsFlag( EStarted ) && IsFlag( EReadyInternal ) ) + { + SetFlag( EStarted ); + iDSA->StartL(); + if ( !iConfig.iClipRect.IsEmpty() ) + { + SetFlag( EReadyForeground ); + iDSA->Gc()->SetClippingRect( iConfig.iClipRect ); + } + __VTPRINT( DEBUG_MEDIA, "RVD(DSA).RunL notify rvd start" ) + //CVtEngEventManager::NotifyEvent( KVtEngRemoteVideoStarted ); + } + if ( firstFrame ) + { + CVtEngEventManager::NotifyEvent( KVtEngRemoteVideoStarted ); + } + if ( IsFlag( EStarted ) ) + { + __VTPRINT( DEBUG_MEDIA, "RVD(DSA).RunL refresh" ) + BaseRefreshL(); + } + } + else + { + __VTPRINT( DEBUG_MEDIA, "RVD.RunL notify rvd problem" ) + CVtEngEventManager::NotifyEvent( KVtEngRemoteRenderingProblem ); + __VTPRINTEXIT( "RVD(DSA).RunL" ) + return; + } + + __VTPRINT( DEBUG_MEDIA, "RVD.RunL setting active" ) + Activate(); + + // Set bitmap only if not to be scaled + if( !iImageScaler ) + { + if ( !iBitmapSetAvail ) + { + iDisplaySink->SetBitmapAvailable( iBitmapNo ); + iBitmapSetAvail = ETrue; + } + __VTPRINT( DEBUG_MEDIA, "RVD(DSA).ScalingCompleted set bmp available" ) + } + + __VTPRINTEXIT( "RVD(DSA).RunL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::ScalingCompleted +// Callback to receive scaled images. +// Draws received image. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDSA::ScalingCompleted( + CFbsBitmap* aBitmap, + TInt aError ) + { + __VTPRINTENTER( "RVD(DSA).ScalingCompleted" ) + __VTPRINT2( DEBUG_MEDIA, "RVD(DSA).ScalingReady %d", aError ) + __VTPRINT2( DEBUG_MEDIA, "RVD(DSA).ScalingReady image %d", aBitmap ? 1 : 0 ) + if ( aError == KErrNone && + aBitmap != NULL ) + { + DrawBitmap( *aBitmap ); + if ( !iBitmapSetAvail ) + { + // Set bitmap available if not already set + __VTPRINT( DEBUG_MEDIA, "RVD(DSA).ScalingCompleted set bmp available" ) + Activate(); + iDisplaySink->SetBitmapAvailable( iBitmapNo ); + iBitmapSetAvail = ETrue; + } + __VTPRINT( DEBUG_MEDIA, "RVD(DSA).ScalingCompleted available?" ) + } + else if ( aError != KErrCancel ) + { + // Notification of failed scaling. + CVtEngEventManager::NotifyEvent( KVtEngRemoteRenderingProblem ); + __VTPRINT( DEBUG_MEDIA, "RVD(DSA).ScalingReady problems" ) + } + __VTPRINTEXITR( "RVD(DSA).ScalingCompleted err=%d", aError ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::BaseRefreshL +// If using scaler, start the scaling otherwise draw a bitmap. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDSA::BaseRefreshL() + { + __VTPRINTENTER( "RVD(DSA).BaseRefreshL" ) + if ( iConfig.iWindow ) + { + if ( IsFlag( EReady ) && IsFlag( EFirstFrameReceived ) && + IsFlag( EFlagUIForeground ) ) + { + CFbsBitmap* current = iBitmapNo != 0 ? iBitmap1 : iBitmap2; + if ( current ) + { + if ( iImageScaler ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + "RVD(DSA).BaseRefreshL scaling" ) + TInt index = 0; + if ( current == iBitmap2 ) + { + index = 1; + } + iImageScaler->Cancel(); + iImageScaler->ScaleL( index ); + } + else + { + DrawBitmap( *current ); + } + } + } + } + __VTPRINTEXIT( "RVD(DSA).BaseRefreshL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::BaseRefreshBitmapsL +// Refreshes bitmaps sizes and display mode if needed. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDSA::BaseRefreshBitmapsL() + { + __VTPRINTENTER( "RVD(DSA).BaseRefreshBitmapsL" ) + const TDisplayMode currentMode( iConfig.iWsSreenDevice->DisplayMode() ); + TBool refreshDisplayMode = EFalse; + TSize newSize( KVtEngRemoteVideoDefaultWidth, + KVtEngRemoteVideoDefaultHeight ); + + // Use new size if supplied + if ( iSourceSize.iHeight > 0 && iSourceSize.iWidth > 0 ) + { + newSize = iSourceSize; + iSourceSize.iHeight = 0; + iSourceSize.iWidth = 0; + } + + __VTPRINT( DEBUG_MEDIA , "================== RVD.RFBM ==================" ) + __VTPRINT2( DEBUG_MEDIA , " newSize.iWidth: %d", newSize.iWidth) + __VTPRINT2( DEBUG_MEDIA , " newSize.iHeight: %d ", newSize.iHeight ) + __VTPRINT( DEBUG_MEDIA , "================== RVD.RFBM ==================" ) + + TBool refreshSize = EFalse; + if ( iBitmap1 ) + { + refreshDisplayMode = ( iBitmap1->DisplayMode() != currentMode ); + refreshSize = ( newSize != iBitmap1->SizeInPixels() ); + } + + // Delete and create the bitmaps + if ( refreshDisplayMode || refreshSize || !iBitmap1 || !iBitmap2 ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + "RVD(DSA).BaseRefreshBitmapsL bmp create" ) + if ( iImageScaler ) + { + iImageScaler->Cancel(); + } + + iConfig.iObserver->vtSetFrame( + MVtEngFrameObserver::ERemoteVideoFrame, 0 ); + delete iBitmap1; + iBitmap1 = NULL; + delete iBitmap2; + iBitmap2 = NULL; + + iBitmap1 = new ( ELeave ) CFbsBitmap(); + User::LeaveIfError( iBitmap1->Create( + newSize, currentMode ) ); + iBitmap2 = new ( ELeave ) CFbsBitmap(); + User::LeaveIfError( iBitmap2->Create( + newSize, currentMode ) ); + ClearFlag( EFirstFrameReceived ); + } + + // set the params for DS + TDisplaySinkParamsDSA params; + GetSinkParams( params ); + + // Update the scaler + if ( iImageScaler ) + { + // Try to configure first, if returns true + // configure again + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + "RVD(DSA).BaseRefreshBitmapsL cnfg" ) + + iImageScaler->ConfigureL( currentMode, + iConfig.iRect.Size(), params.iBitmap1Handle, + params.iBitmap2Handle ); + + if ( IsFlag( EFirstFrameReceived ) ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + "CVtEngDrawDSA::RefreshBitmapsL RFR" ) + BaseRefreshL(); + } + + } + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + "RVD(DSA).BaseRefreshBitmapsL USP" ) + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + "RVD(DSA).BaseRefreshBitmapsL USP flag" ) + iDisplaySink->UpdateSinkParamsL( params, iDSUpdated ); + Activate(); + iDisplaySink->SetBitmapAvailable( MDisplaySink::EFirstBitmap ); + __VTPRINTEXIT( "RVD(DSA).BaseRefreshBitmapsL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::DrawBitmap +// Draws bitmap +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDSA::DrawBitmap( CFbsBitmap& aBitmap ) + { + __VTPRINTENTER( "RVD(DSA).DrawBitmap" ) + __ASSERT_ALWAYS( aBitmap.Handle(), + Panic( EVtEngPanicInvalidBitmapHandle ) ); + __ASSERT_ALWAYS( iDSA, Panic( EVtEngPanicInvalidPointer ) ); + iDSA->Gc()->SetFaded( iConfig.iWindow->IsFaded() ); + iDSA->Gc()->BitBlt( iConfig.iRect.iTl, &aBitmap ); + iDSA->ScreenDevice()->Update(); + iConfig.iObserver->vtSetFrame( MVtEngFrameObserver::ERemoteVideoFrame, + &aBitmap ); + __VTPRINTEXITR( "RVD(DSA).DrawBitmap h=%d", aBitmap.Handle() ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::GetSinkParams +// ----------------------------------------------------------------------------- +// +void CVtEngDrawDSA::GetSinkParams( TDisplaySinkParamsDSA& aSinkParams ) + { + __VTPRINTENTER( "RVD(DSA).GetSinkParams" ) + aSinkParams.iThreadId = RThread().Id(); + aSinkParams.iRequestStatusPtr = &iStatus; + aSinkParams.iObserver = iObserver; + aSinkParams.iBitmap1Handle = iBitmap1->Handle(); + aSinkParams.iBitmap2Handle = iBitmap2->Handle(); + aSinkParams.iFlags = TDisplaySinkParams::EDisplaySinkDSA; + __VTPRINTEXIT( "RVD(DSA).GetSinkParams" ) + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Media/CVtEngDrawNGA.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Media/CVtEngDrawNGA.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,1221 @@ +/* +* Copyright (c) 2004-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: Class for NGA Drawer. +* +*/ + +// INCLUDE FILES + +#include "CVtEngDrawNGA.h" +#include "CVtEngEventManager.h" +#include "VtEngPanic.h" +#include "MVtEngFrameObserver.h" +#include "CVtEngSettings.h" +#include "VtEngUtils.h" +#include +#include +#include +#include +#include + +// Reversed enumeration for the bitmaps. +static const MDisplaySink::TBitmapNo KVtEngBitmapNoReversed[] = + { + MDisplaySink::ESecondBitmap, + MDisplaySink::EFirstBitmap + }; + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::TVTSurfaceBuffer::TVTSurfaceBuffer +// +// ----------------------------------------------------------------------------- +// +TVTSurfaceBuffer::TVTSurfaceBuffer( TUint8* aBuffer, TInt aSurfaceNo ) + : iBuffer( aBuffer ), iSurfaceBufferNo(aSurfaceNo) + { + __VTPRINTENTER( "RVD(NGA).TVTSurfaceBuffer.Ctor" ) + __VTPRINTEXIT( "RVD(NGA).TVTSurfaceBuffer.Ctor" ) + } +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::TVTSurfaceBuffer::Buffer +// +// ----------------------------------------------------------------------------- +// +TUint8*& TVTSurfaceBuffer::Buffer() + { + return iBuffer; + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::TVTSurfaceBuffer::SurfaceNo +// +// ----------------------------------------------------------------------------- +// +TInt TVTSurfaceBuffer::SurfaceNo() + { + return iSurfaceBufferNo; + } + +void TVTSurfaceBuffer::Set( TUint8* aBuffer, TInt aSurfaceNo ) + { + iBuffer = aBuffer; + iSurfaceBufferNo = aSurfaceNo; + } + +void TVTSurfaceBuffer::UnSet() + { + iBuffer = NULL; + iSurfaceBufferNo = KErrNotFound; + } +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::NewL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +CVtEngDrawNGA* CVtEngDrawNGA::NewL( + MDisplaySinkObserver* aObserver ) + { + CVtEngDrawNGA* self = new ( ELeave ) CVtEngDrawNGA( aObserver ); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::~CVtEngDrawNGA +// Destructor. Cannot leave. +// ----------------------------------------------------------------------------- +// +CVtEngDrawNGA::~CVtEngDrawNGA() + { + __VTPRINTENTER( "RVD(NGA).~" ) + Cancel(); + + if(iSurfaceCreated) + { + + if (iSurfaceManager) + { + iConfig.iRemoteWindow->RemoveBackgroundSurface(ETrue); + iConfig.iWsSession->UnregisterSurface(0, iSurfaceId); + if ( iSurfaceChunk != NULL ) + { + iSurfaceChunk->Close(); + } + delete iSurfaceChunk; + iSurfaceChunk = NULL; + iSurfaceManager->CloseSurface(iSurfaceId); + iSurfaceUpdateSession.CancelAllUpdateNotifications(); + iSurfaceUpdateSession.Close(); + + /* Close the surface manager handle */ + if ( iSurfaceManager != NULL ) + { + iSurfaceManager->Close(); + } + + delete iSurfaceManager; + iSurfaceManager = NULL; + } + + for ( TInt i = KVtEngMaxSurfaceBuffers-1; i >= 0 ; i-- ) + { + if (iCallBackTable[i]) + { + iCallBackTable[i]->Cancel(); + delete iCallBackTable[i]; + iCallBackTable[i] = NULL; + } + } + + iSurfaceBuffers[ 0 ].UnSet(); + iSurfaceBuffers[ 1 ].UnSet(); + iSurfaceBuffer0.UnSet(); + iSurfaceBuffer1.UnSet(); + } + delete iBufferWaiter; + iBufferWaiter = NULL; + iWaitingBuffers.Reset(); + + __VTPRINTEXIT( "RVD(NGA).~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::CVtEngDrawNGA +// C++ constructor. Cannot leave. +// ----------------------------------------------------------------------------- +// +CVtEngDrawNGA::CVtEngDrawNGA( MDisplaySinkObserver* aObserver ) : + CVtEngDraw( aObserver ), + iSurfaceFormat( EUidPixelFormatYUV_420Planar ) + + { + iConfig.iRemoteWindow = NULL; + iConfig.iWsSession = NULL; + iSurfaceCreated = EFalse; + iWaitingBuffers.Reset(); + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::BaseConstructL +// Base construction. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::BaseConstructL( ) + { + __VTPRINTENTER( "RVD(NGA).BaseConstructL" ) + DoBaseConstructL(); + __VTPRINTEXIT( "RVD(NGA).BaseConstructL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::CreateSinkL +// Instantiates display sink. +// ----------------------------------------------------------------------------- +// +MDisplaySink* CVtEngDrawNGA::CreateSinkL() + { + __VTPRINTENTER( "RVD(NGA).CreateSinkL" ) + TDisplaySinkParamsNGA params; + GetSinkParams( params ); + MDisplaySink* sink = ::CreateSinkL( params, KNullDesC8 ); + if ( IsFlag( EBaseConstructCalled ) ) + { + sink->Pause(); + SetFlag( ESinkParamUpdateRequired | ESinkResumeRequired ); + } + __VTPRINTEXITR( "RVD(NGA).CreateSinkL flags=%d", params.iFlags ) + return sink; + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::BaseRefreshL +// If using scaler, start the scaling otherwise draw a bitmap. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::BaseRefreshL() + { + __VTPRINTENTER( "RVD(NGA).BaseRefreshL" ) + __VTPRINTEXIT( "RVD(NGA).BaseRefreshL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::BaseRefreshBitmapsL +// Refreshes bitmaps sizes and display mode if needed. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::BaseRefreshBitmapsL() + { + __VTPRINTENTER( "RVD(NGA).BaseRefreshBitmapsL" ) + BaseConstructL(); + CreateSurfaceL(); + // set the params for DS + UpdateSinkParamsL(); + ClearFlag( EFirstFrameReceived ); + __VTPRINTEXIT( "RVD(NGA).BaseRefreshBitmapsL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::BaseDoCancel +// DoCancel for derived class. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::BaseDoCancel() + { + __VTPRINTENTER( "RVD(NGA).BaseDoCancel" ) + __VTPRINTEXIT( "RVD(NGA).BaseDoCancel" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::BaseVerifyConfigL +// Checks current configuration against DSA implementation. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::BaseVerifyConfigL() + { + __VTPRINTENTER( "RVD(NGA).BaseVerifyConfigL" ) + __VTPRINTEXIT( "RVD(NGA).BaseVerifyConfigL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::BaseRestartL +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::BaseRestartL() + { + __VTPRINTENTER( "RVD(NGA).BaseRestartL" ) + __VTPRINTEXIT( "RVD(NGA).BaseRestartL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::BaseAbortNow +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::BaseAbortNow() + { + __VTPRINTENTER( "RVD(NGA).BaseAbortNow" ) + __VTPRINTEXIT( "RVD(NGA).BaseAbortNow" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::BaseStartDrawL +// Starts the drawing. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::BaseStartDrawL() + { + __VTPRINTENTER( "RVD(NGA).BaseStartDrawL" ) + if ( IsFlag( EBaseConstructCalled ) ) + { + SetFlag( EBaseBaseStartDrawCalled ); + } + else + { + DoBaseStartDrawL(); + } + __VTPRINTEXIT( "RVD(NGA).BaseStartDrawL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::BaseStopDraw +// Stop the drawing. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::BaseStopDraw() + { + // Cancel the timer in any case. + __VTPRINTENTER( "RVD(NGA).BaseStopDraw" ) + ClearFlag( EBaseBaseStartDrawCalled ); + iWatcher->Cancel(); + iBufferWaiter->Cancel(); + ClearFlag( ERemoteVideoDrawing | EStarted ); + for ( TInt i = KVtEngMaxSurfaceBuffers-1; i >= 0 ; i-- ) + { + if (iCallBackTable[i]) + { + iCallBackTable[i]->Cancel(); + } + } + Cancel(); + + __VTPRINTEXIT( "RVD(NGA).BaseStopDraw" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::BaseSetConfigL +// Sets new configuration. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::BaseSetConfigL( const TVtEngRenderConfig& aConfig ) + { + __VTPRINTENTER( "RVD(NGA).BaseSetConfigL" ) + Mem::FillZ( &iConfig, sizeof( TVtEngRenderConfigNGA ) ); + iConfig = aConfig; + if ( IsFlag( EBaseConstructCalled ) ) + { + SetFlag( EBaseSetConfigCalled ); + } + else + { + ConfigUpdatedL(); + } + __VTPRINTEXIT( "RVD(NGA).BaseSetConfigL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::BaseSetUIForegroundL +// Sets UI foreground status. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::BaseSetUIForegroundL( TBool aForeground ) + { + __VTPRINTENTER( "RVD(NGA).BaseSetUIForegroundL" ) + __VTPRINTEXIT( "RVD(NGA).BaseSetUIForegroundL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::BaseRequestLastFrame +// Request update last remote video frame through MVtEngFrameObserver::vtSetFrame +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::BaseRequestLastFrame() + { + __VTPRINTENTER( "RVD(NGA).BaseRequestLastFrame" ) + __VTPRINTEXIT( "RVD(NGA).BaseRequestLastFrame" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::BaseVideoFrameSizeChangedL +// Called when incoming frame buffer size changes. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::BaseVideoFrameSizeChangedL( const TSize& /*aTo*/ ) + { + __VTPRINTENTER( "RVD(NGA).BaseVideoFrameSizeChangedL" ) + BaseConstructL(); + + TInt err; + + iConfig.iRemoteWindow->RemoveBackgroundSurface(ETrue); + iConfig.iWsSession->UnregisterSurface(0, iSurfaceId); + + iSurfaceChunk->Close(); + delete iSurfaceChunk; + iSurfaceChunk = NULL; + iSurfaceManager->CloseSurface(iSurfaceId); + iSurfaceUpdateSession.CancelAllUpdateNotifications(); + iSurfaceUpdateSession.Close(); + + /* Close the surface manager handle */ + iSurfaceManager->Close(); + delete iSurfaceManager; + iSurfaceManager = 0; + + for ( TInt i = KVtEngMaxSurfaceBuffers-1; i >= 0 ; i-- ) + { + if (iCallBackTable[i]) + { + iCallBackTable[i]->Cancel(); + delete iCallBackTable[i]; + iCallBackTable[i] = NULL; + } + } + iSurfaceBuffers[ 0 ].UnSet(); + iSurfaceBuffers[ 1 ].UnSet(); + iSurfaceBuffer0.UnSet(); + iSurfaceBuffer1.UnSet(); + iWaitingBuffers.Reset(); + + err = iSurfaceUpdateSession.Connect(); + User::LeaveIfError(err); + + iSurfaceManager = new RSurfaceManager(); + + User::LeaveIfNull(iSurfaceManager); + err = iSurfaceManager->Open(); + User::LeaveIfError(err); + + RSurfaceManager::TSurfaceCreationAttributesBuf attributes; + attributes().iPixelFormat = iSurfaceFormat; + attributes().iSize = iSourceSize; + attributes().iBuffers = KVtEngMaxSurfaceBuffers; + + //attributes().iStride = iSourceSize.iWidth*2; + attributes().iStride = iSourceSize.iWidth*3/2; + + 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); + iSurfaceBuffer0.Set(iSurfaceChunk->Base() + offset, 0 ); + iSurfaceManager->GetBufferOffset(iSurfaceId, 1, offset); + iSurfaceBuffer1.Set(iSurfaceChunk->Base() + offset, 1 ); + + iConfig.iWsSession->RegisterSurface(0, iSurfaceId); + TSurfaceConfiguration surfaceConfig; + surfaceConfig.SetSurfaceId( iSurfaceId ); + surfaceConfig.SetOrientation( CFbsBitGc::EGraphicsOrientationRotated270); + iConfig.iRemoteWindow->SetBackgroundSurface( surfaceConfig, ETrue ); + //iConfig.iRemoteWindow->SetBackgroundSurface(iSurfaceId); + + iCallBackTable[0] = new(ELeave) CActiveCallBack( + TCallBack(SurfaceBuffer0Ready, this), + CActive::EPriorityStandard-1); + CActiveScheduler::Add(iCallBackTable[0]); + + iCallBackTable[1] = new(ELeave) CActiveCallBack( + TCallBack(SurfaceBuffer1Ready, this), + CActive::EPriorityStandard-1); + CActiveScheduler::Add(iCallBackTable[1]); + + iSurfaceCreated = ETrue; + + ClearFlag( EInitializePostingSurfaceCalled ); + + // set the params for DS + UpdateSinkParamsL(); + ClearFlag( EFirstFrameReceived ); + + __VTPRINTEXIT( "RVD(NGA).BaseVideoFrameSizeChangedL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawDSA::Config +// Returns current configuration. +// ----------------------------------------------------------------------------- +// +TVtEngRenderConfig& CVtEngDrawNGA::Config() + { + return iConfig; + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::RunL +// CActive heir execution method. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::RunL() + { + __VTPRINTENTER( "RVD(NGA).RunL" ) + + TInt bitmapNo( iStatus.Int() ); + + if ( bitmapNo < KErrNone ) + { + __VTPRINT( DEBUG_MEDIA, "RVD(NGA).RunL notify rvd problem" ) + CVtEngEventManager::NotifyEvent( KVtEngRemoteRenderingProblem ); + return; + } + + TVtEngBuffer& buffer = iSurfaceBuffers[ bitmapNo ]; + + if ( !iDSUpdated ) + { + __VTPRINT( DEBUG_MEDIA, "RVD(NGA).RunL !Updated" ) + __VTPRINTEXIT( "RVD(NGA).RunL" ) + return; + } + else if ( buffer.SurfaceBuffer() == NULL ) + { + __VTPRINT( DEBUG_MEDIA, "RVD(NGA).RunL signalled with NULL buffer" ) + TInt result( iBufferWaiter->FetchBuffer() ); + User::LeaveIfError( result ); + __VTPRINTEXIT( "RVD(NGA).RunL" ) + return; + } + + // Image received, reset counter. + iCheckpoint = KVtEngWatcherThreshold; + + __VTPRINT2( DEBUG_MEDIA, "RVD(NGA).RunL flags=%d", iFlags ) + TBool firstFrame( !IsFlag ( EFirstFrameReceived ) ); + SetFlag( EFirstFrameReceived ); + if ( firstFrame ) + { + CVtEngEventManager::NotifyEvent( KVtEngRemoteVideoStarted ); + } + + TInt surfaceno = buffer.SurfaceBuffer()->SurfaceNo(); + __VTPRINT2( DEBUG_MEDIA, "RVD(NGA).RunL received buffer surface id %d", surfaceno ) + if ( iSubmitPending ) + { + __VTPRINT( DEBUG_MEDIA, "RVD(NGA).RunL submit pending") + iWaitingBuffers.AddLast(buffer); + } + else + { + iCallBackTable[surfaceno]->iStatus = KRequestPending; + iCallBackTable[surfaceno]->SetActive(); + iSurfaceUpdateSession.NotifyWhenDisplayed(iCallBackTable[surfaceno]->iStatus, iTimeStamp); + iSubmitPending = ETrue; + iSurfaceUpdateSession.SubmitUpdate( KAllScreens, iSurfaceId, surfaceno, NULL ); + buffer.UnSet(); + } + if ( iSurfaceBuffers[ KVtEngBitmapNoReversed[ bitmapNo ] ].IsSet() ) + { + __VTPRINT2( DEBUG_MEDIA, "RVD(NGA).RunL reactivating for buffer %d", + KVtEngBitmapNoReversed[ bitmapNo ] ) + Activate(); + DisplaySink().NextFrame(); + } + TInt result = iBufferWaiter->FetchBuffer(); + User::LeaveIfError( result ); + + __VTPRINTEXIT( "RVD(NGA).RunL" ) + } + + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::BufferReadyL +// BufferReadyL +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::BufferReadyL( TVTSurfaceBuffer* aBuffer ) + { + __VTPRINTENTER( "RVD(NGA).BufferReadyL" ) + SetAvailableToSink( aBuffer ); + __VTPRINTEXIT( "RVD(NGA).BufferReadyL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::FetchError +// Buffer fetching error +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::FetchError( TInt ) + { + __VTPRINTENTER( "RVD(NGA).FetchError" ) + CVtEngEventManager::NotifyEvent( KVtEngRemoteRenderingProblem ); + __VTPRINTEXIT( "RVD(NGA).FetchError" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::DoBaseConstructL +// Base construction implementation +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::DoBaseConstructL() + { + __VTPRINTENTER( "RVD(NGA).DoBaseConstructL" ) + delete iBufferWaiter; + iBufferWaiter = NULL; + + iBufferWaiter = + new ( ELeave ) CVtEngBufferWaiter( *this ); + + for ( TInt i = MDisplaySink::EFirstBitmap; + i < MDisplaySink::EFirstBitmap + KVtEngMaxSurfaceBuffers; i++ ) + { + iSurfaceBuffers[ i ].UnSet(); + } + ClearFlag( EBaseConstructCalled ); + __VTPRINTEXIT( "RVD(NGA).DoBaseConstructL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::UpdateSinkParamsL +// Updates sink params +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::UpdateSinkParamsL() + { + __VTPRINTENTER( "RVD(NGA).UpdateSinkParamsL" ) + if ( IsFlag( EBaseConstructCalled ) ) + { + SetFlag( ESinkParamUpdateRequired ); + } + else + { + DoUpdateSinkParamsL(); + } + __VTPRINTEXIT( "RVD(NGA).UpdateSinkParamsL" ) + } + + + // ----------------------------------------------------------------------------- +// CVtEngDrawNGA::DoBaseStartDrawL +// +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::DoBaseStartDrawL() + { + __VTPRINTENTER( "RVD(NGA).DoBaseStartDrawL" ) + SetFlag( EReadyInternal ); + if ( !iWatcher->IsActive() ) + { + iWatcher->Start( KVtEngWatcherTimeout, KVtEngWatcherTimeout, + iCallback ); + } + + DoSurfaceBuffer0Ready(); + DoSurfaceBuffer1Ready(); + + User::LeaveIfError( iBufferWaiter->FetchBuffer() ); + + + SetFlag( ERemoteVideoDrawing ); + ClearFlag( EBaseBaseStartDrawCalled ); + __VTPRINTEXIT( "RVD(NGA).DoBaseStartDrawL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::DoCreateSurfaceL +// Create surface implementation. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::DoCreateSurfaceL() + { + __VTPRINTENTER( "RVD(NGA).DoCreateSurfaceL" ) + TInt err; + + if(iSurfaceCreated) + { + + if (iSurfaceManager) + { + /* Change log for recreate surface objects + * Surface staffs should NOT be recreated once created, + * but unregister and register needs to be done since the + * bounding window change its position and size. At this + * moment, reset the iWaitingBuffers and reset the callbacks + * are recommended. + */ + iConfig.iRemoteWindow->RemoveBackgroundSurface(ETrue); + iConfig.iWsSession->UnregisterSurface(0, iSurfaceId); + + /* Comment out below code to prevent delete the surface objects + * at this current stage, code below should NOT be removed due to + * potential future uses. + */ + /* + iSurfaceChunk->Close(); + delete iSurfaceChunk; + iSurfaceChunk = NULL; + iSurfaceManager->CloseSurface(iSurfaceId); + iSurfaceUpdateSession.CancelAllUpdateNotifications(); + iSurfaceUpdateSession.Close(); + */ + + /* Close the surface manager handle */ + /* + iSurfaceManager->Close(); + delete iSurfaceManager; + iSurfaceManager = 0; + */ + } + for ( TInt i = KVtEngMaxSurfaceBuffers-1; i >= 0 ; i-- ) + { + if (iCallBackTable[i]) + { + iCallBackTable[i]->Cancel(); + delete iCallBackTable[i]; + iCallBackTable[i] = NULL; + } + } + /* Comment out below code to prevent delete the surface buffers, + * otherwise the last buffer would not store the last frame. + * Code below should NOT be removed due to potential future uses. + */ + /* + iSurfaceBuffers[ 0 ].UnSet(); + iSurfaceBuffers[ 1 ].UnSet(); + iSurfaceBuffer0.UnSet(); + iSurfaceBuffer1.UnSet(); + */ + iWaitingBuffers.Reset(); + } + /* Add else branch to escape the recreate of the surface objects, + * it could be changed in future. + */ + else + { + err = iSurfaceUpdateSession.Connect(); + User::LeaveIfError(err); + + iSurfaceManager = new RSurfaceManager(); + + User::LeaveIfNull(iSurfaceManager); + err = iSurfaceManager->Open(); + User::LeaveIfError(err); + + RSurfaceManager::TSurfaceCreationAttributesBuf attributes; + attributes().iPixelFormat = iSurfaceFormat; + attributes().iSize = iSourceSize; + attributes().iBuffers = KVtEngMaxSurfaceBuffers; + + //attributes().iStride = iSourceSize.iWidth*2; + attributes().iStride = iSourceSize.iWidth*3/2; + + 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 infoBuf; + err = iSurfaceManager->SurfaceInfo( iSurfaceId, infoBuf ); + User::LeaveIfError(err); + RSurfaceManager::TSurfaceInfoV01 info = infoBuf(); + + __VTPRINT2( DEBUG_MEDIA, "chunk size=%d", iSurfaceChunk->Size() ) + + TRgb color( 0, 0, 0 ); + + TInt offset; + + iSurfaceManager->GetBufferOffset( iSurfaceId, 0, offset ); + __VTPRINT2( DEBUG_MEDIA, "offset0=%d", offset ) + ClearSurfacebuffer( iSurfaceChunk->Base(), offset, info, color ); + iSurfaceBuffer0.Set(iSurfaceChunk->Base() + offset, 0 ); + + iSurfaceManager->GetBufferOffset( iSurfaceId, 1, offset ); + __VTPRINT2( DEBUG_MEDIA, "offset1=%d", offset ) + ClearSurfacebuffer( iSurfaceChunk->Base(), offset, info, color ); + iSurfaceBuffer1.Set(iSurfaceChunk->Base() + offset, 1 ); + } + + iConfig.iWsSession->RegisterSurface(0, iSurfaceId); + TSurfaceConfiguration surfaceConfig; + surfaceConfig.SetSurfaceId( iSurfaceId ); + surfaceConfig.SetOrientation( CFbsBitGc::EGraphicsOrientationRotated270); + iConfig.iRemoteWindow->SetBackgroundSurface( surfaceConfig, ETrue ); + //iConfig.iRemoteWindow->SetBackgroundSurface(iSurfaceId); + + iConfig.iRemoteWindow->BeginRedraw(); + iConfig.iRemoteWindow->EndRedraw(); + + iCallBackTable[0] = new(ELeave) CActiveCallBack( + TCallBack(SurfaceBuffer0Ready, this), + CActive::EPriorityStandard-1); + CActiveScheduler::Add(iCallBackTable[0]); + + iCallBackTable[1] = new(ELeave) CActiveCallBack( + TCallBack(SurfaceBuffer1Ready, this), + CActive::EPriorityStandard-1); + CActiveScheduler::Add(iCallBackTable[1]); + + iSurfaceCreated = ETrue; + + ClearFlag( EInitializePostingSurfaceCalled ); + __VTPRINTEXIT( "RVD(NGA).DoCreateSurfaceL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::ClearSurface +// clearing a surface buffer to given colour +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::ClearSurfacebuffer( + TUint8* aStartAddr, + TInt aOffset, + const RSurfaceManager::TSurfaceInfoV01 aInfo, + TRgb &aColor ) +{ + TUint8 red = aColor.Red(); + TUint8 green = aColor.Green(); + TUint8 blue = aColor.Blue(); + + // formulae borrowed from http://msdn.microsoft.com/en-us/library/ms893078.aspx + TUint8 yval = ( ( 66 * (TInt32)red + 129 * (TInt32)green + 25 * (TInt32)blue + 128) >> 8) + 16; + TUint8 uval = ( ( -38 * (TInt32)red - 74 * (TInt32)green + 112 * (TInt32)blue + 128) >> 8) + 128; + TUint8 vval = ( ( 112 * (TInt32)red - 94 * (TInt32)green - 18 * (TInt32)blue + 128) >> 8) + 128; + + TInt i = 0; + + aStartAddr += aOffset; + + while ( i < (aInfo.iSize.iHeight*aInfo.iSize.iWidth) ) + { + *aStartAddr = yval; + aStartAddr++; + i++; + } + i=0; + + while ( i < ((aInfo.iSize.iHeight*aInfo.iSize.iWidth)>>2) ) + { + *aStartAddr = uval; + aStartAddr++; + i++; + } + i=0; + + while ( i < ((aInfo.iSize.iHeight*aInfo.iSize.iWidth)>>2) ) + { + *aStartAddr = vval; + aStartAddr++; + i++; + } +} + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::DoUpdateSinkParamsL +// Updates sink params +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::DoUpdateSinkParamsL() + { + __VTPRINTENTER( "RVD(NGA).DoUpdateSinkParamsL" ) + TDisplaySinkParamsNGA params; + GetSinkParams( params ); + DisplaySink().UpdateSinkParamsL( params, iDSUpdated ); + ClearFlag( ESinkParamUpdateRequired ); + if ( IsFlag( ESinkResumeRequired ) ) + { + DisplaySink().Resume(); + ClearFlag( ESinkResumeRequired ); + } + __VTPRINTEXIT( "RVD(DP).DoUpdateSinkParamsL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::CreateSurfaceL +// Create surface. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::CreateSurfaceL() + { + __VTPRINTENTER( "RVD(NGA).CreateSurfaceL" ) + if ( IsFlag( EBaseConstructCalled ) ) + { + SetFlag( EInitializePostingSurfaceCalled ); + } + else + { + DoCreateSurfaceL(); + } + __VTPRINTEXIT( "RVD(NGA).CreateSurfaceL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::GetSinkParams +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::GetSinkParams( TDisplaySinkParamsNGA& aSinkParams ) + { + __VTPRINTENTER( "RVD(NGA).GetSinkParams" ) + Mem::FillZ( &aSinkParams, sizeof( TDisplaySinkParamsNGA ) ); + aSinkParams.iThreadId = RThread().Id(); + aSinkParams.iRequestStatusPtr = &iStatus; + aSinkParams.iObserver = iObserver; + aSinkParams.iSurfaceBuffer1 = &iSurfaceBuffers[ 0 ].Buffer(); + aSinkParams.iSurfaceBuffer2 = &iSurfaceBuffers[ 1 ].Buffer(); + aSinkParams.iFrameSize = iSourceSize; + aSinkParams.iSurfaceFormat = iSurfaceFormat; + aSinkParams.iFlags = TDisplaySinkParams::EDisplaySinkNGA; + __VTPRINTEXITR( "RVD(NGA).GetSinkParams flags=%d", + (TInt) aSinkParams.iFlags ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::DisplaySink +// Returns reference to sink. +// ----------------------------------------------------------------------------- +// +MDisplaySink& CVtEngDrawNGA::DisplaySink() + { + return *iDisplaySink; + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::SetToSink +// Sets posting buffer to sink. +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::SetAvailableToSink( TVTSurfaceBuffer* aBuffer ) + { + __VTPRINTENTER( "RVD(NGA).SetAvailableToSink" ) + for ( TInt i = MDisplaySink::EFirstBitmap; + i < MDisplaySink::EFirstBitmap + KVtEngMaxSurfaceBuffers; i++ ) + { + if ( !iSurfaceBuffers[ i ].IsSet() ) + { + iSurfaceBuffers[ i ].Set( aBuffer ); + Activate(); + DisplaySink().SetBitmapAvailable( + static_cast< MDisplaySink::TBitmapNo >( i ) ); + break; + } + } + __VTPRINTEXIT( "RVD(NGA).SetAvailableToSink" ) + } + +TInt CVtEngDrawNGA::SurfaceBuffer0Ready( TAny* aAny ) + { + __VTPRINTENTER( "RVD(NGA).SurfaceBuffer0Ready" ) + __VTPRINTEXIT( "RVD(NGA).SurfaceBuffer0Ready" ) + return ((CVtEngDrawNGA*)aAny)->DoSurfaceBuffer0Ready(); + } + +TBool CVtEngDrawNGA::DoSurfaceBuffer0Ready() + { + __VTPRINTENTER( "RVD(NGA).DoSurfaceBuffer0Ready" ) + if ( iSubmitPending ) + { + iSubmitPending = EFalse; + } + if (!iWaitingBuffers.IsEmpty()) + { + TVtEngBuffer* buffer = iWaitingBuffers.First(); + TInt surfaceno = buffer->SurfaceBuffer()->SurfaceNo(); + __VTPRINT2( DEBUG_MEDIA, "RVD(NGA).DoSurfaceBuffer0Ready, surface buffer %d is in waitingqueue", surfaceno ) + iCallBackTable[surfaceno]->iStatus = KRequestPending; + iCallBackTable[surfaceno]->SetActive(); + iSurfaceUpdateSession.NotifyWhenDisplayed(iCallBackTable[surfaceno]->iStatus, iTimeStamp); + iSubmitPending = ETrue; + iSurfaceUpdateSession.SubmitUpdate( KAllScreens, iSurfaceId, surfaceno, NULL ); + iWaitingBuffers.Remove(*buffer); + buffer->UnSet(); + } + iBufferWaiter->BufferAvailable(iSurfaceBuffer0); + __VTPRINTEXIT( "RVD(NGA).DoSurfaceBuffer0Ready" ) + return ETrue; + } + +TInt CVtEngDrawNGA::SurfaceBuffer1Ready( TAny* aAny ) + { + __VTPRINTENTER( "RVD(NGA).SurfaceBuffer1Ready" ) + __VTPRINTEXIT( "RVD(NGA).SurfaceBuffer1Ready" ) + return ((CVtEngDrawNGA*)aAny)->DoSurfaceBuffer1Ready(); + } + +TBool CVtEngDrawNGA::DoSurfaceBuffer1Ready() + { + __VTPRINTENTER( "RVD(NGA).DoSurfaceBuffer1Ready" ) + if ( iSubmitPending ) + { + iSubmitPending = EFalse; + } + + if (!iWaitingBuffers.IsEmpty()) + { + TVtEngBuffer* buffer = iWaitingBuffers.First(); + TInt surfaceno = buffer->SurfaceBuffer()->SurfaceNo(); + __VTPRINT2( DEBUG_MEDIA, "RVD(NGA).DoSurfaceBuffer0Ready, surface buffer %d is in waitingqueue", surfaceno ) + iCallBackTable[surfaceno]->iStatus = KRequestPending; + iCallBackTable[surfaceno]->SetActive(); + iSurfaceUpdateSession.NotifyWhenDisplayed(iCallBackTable[surfaceno]->iStatus, iTimeStamp); + iSubmitPending = ETrue; + iSurfaceUpdateSession.SubmitUpdate( KAllScreens, iSurfaceId, surfaceno, NULL ); + iWaitingBuffers.Remove(*buffer); + buffer->UnSet(); + } + iBufferWaiter->BufferAvailable(iSurfaceBuffer1); + __VTPRINTEXIT( "RVD(NGA).DoSurfaceBuffer1Ready" ) + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::TVtEngBuffer::TVtEngBuffer +// +// ----------------------------------------------------------------------------- +// +CVtEngDrawNGA::TVtEngBuffer::TVtEngBuffer() + : iBuffer( 0 ), iSurfaceBuffer(0) + { + __VTPRINTENTER( "RVD(NGA).Buffer.Ctor" ) + __VTPRINTEXIT( "RVD(NGA).Buffer.Ctor" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::TVtEngBuffer::Set +// +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::TVtEngBuffer::Set( TVTSurfaceBuffer* aBuffer ) + { + __VTPRINTENTER( "RVD(NGA).Buffer.Set" ) + iSurfaceBuffer = aBuffer; + iBuffer = aBuffer->Buffer(); + __VTPRINTEXIT( "RVD(NGA).Buffer.Set" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::TVtEngBuffer::UnSet +// +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::TVtEngBuffer::UnSet() + { + __VTPRINTENTER( "RVD(NGA).Buffer.UnSet" ) + iSurfaceBuffer = 0; + iBuffer = 0; + __VTPRINTEXIT( "RVD(NGA).Buffer.UnSet" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::TVtEngBuffer::IsSet +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngDrawNGA::TVtEngBuffer::IsSet() const + { + return ( iSurfaceBuffer != NULL ); + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::TVtEngBuffer::Buffer +// +// ----------------------------------------------------------------------------- +// +TVTSurfaceBuffer* &CVtEngDrawNGA::TVtEngBuffer::SurfaceBuffer() + { + return iSurfaceBuffer; + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::TVtEngBuffer::Buffer +// +// ----------------------------------------------------------------------------- +// +TUint8* &CVtEngDrawNGA::TVtEngBuffer::Buffer() + { + return iBuffer; + } +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::CVtEngBufferWaiter::CVtEngBufferWaiter +// ----------------------------------------------------------------------------- +// +CVtEngDrawNGA::CVtEngBufferWaiter::CVtEngBufferWaiter + //( CVideoRenderer& aVideoRenderer, MVtEngNGABufferWaiterObserver& aObserver ) + ( MVtEngNGABufferWaiterObserver& aObserver ) + : CActive( CActive::EPriorityStandard ), + iObserver( &aObserver ) + { + __VTPRINTENTER( "RVD(NGA).BufferWaiter.Ctor" ) + for ( TInt i = 0; i < KVtEngMaxSurfaceBuffers; i++ ) + { + this->iBuffers[ i ] = NULL; + } + CActiveScheduler::Add( this ); + __VTPRINTEXIT( "RVD(NGA).BufferWaiter.Ctor" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::CVtEngBufferWaiter::~CVtEngBufferWaiter +// ----------------------------------------------------------------------------- +// +CVtEngDrawNGA::CVtEngBufferWaiter::~CVtEngBufferWaiter() + { + __VTPRINTENTER( "RVD(NGA).BufferWaiter.~" ) + Cancel(); + __VTPRINTEXIT( "RVD(NGA).BufferWaiter.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::CVtEngBufferWaiter::Activate +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::CVtEngBufferWaiter::Activate() + { + __VTPRINTENTER( "RVD(NGA).BufferWaiter.Activate" ) + iStatus = KRequestPending; + SetActive(); + __VTPRINTEXIT( "RVD(NGA).BufferWaiter.Activate" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::CVtEngBufferWaiter::FetchBuffer +// ----------------------------------------------------------------------------- +// +TInt CVtEngDrawNGA::CVtEngBufferWaiter::FetchBuffer() + { + __VTPRINTENTER( "RVD(NGA).BufferWaiter.FetchBuffer" ) + if ( IsActive() ) + { + __VTPRINTEXIT( "RVD(NGA).BufferWaiter.FetchBuffer 1" ) + return KErrNone; + } + + Activate(); + if (iStatus == KRequestPending) + { + for ( TInt i = 0; i < KVtEngMaxSurfaceBuffers; i++ ) + { + if(this->iBuffers[ i ] != NULL) + { + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + break; + } + } + } + __VTPRINTEXIT( "RVD(NGA).BufferWaiter.FetchBuffer 2" ) + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::CVtEngBufferWaiter::BufferAvailable +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::CVtEngBufferWaiter::BufferAvailable(TVTSurfaceBuffer& aBuffer) +{ + __VTPRINTENTER( "RVD(NGA).BufferWaiter.BufferAvailable" ) + for ( TInt i = 0; i < KVtEngMaxSurfaceBuffers; i++ ) + { + if(this->iBuffers[ i ] == NULL ) + { + this->iBuffers[ i ]= &aBuffer; + break; + } + } + + if(iStatus == KRequestPending ) + { + for ( TInt i = 0; i < KVtEngMaxSurfaceBuffers; i++ ) + { + if(this->iBuffers[ i ] != NULL) + { + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + break; + } + } + } + + __VTPRINTEXIT( "RVD(NGA).BufferWaiter.BufferAvailable" ) +} + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::CVtEngBufferWaiter::RunL +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::CVtEngBufferWaiter::RunL() + { + __VTPRINTENTER( "RVD(NGA).BufferWaiter.RunL" ) + TInt result( iStatus.Int() ); + if ( result == KErrNone ) + { + for ( TInt i = 0; i < KVtEngMaxSurfaceBuffers; i++ ) + { + if(this->iBuffers[ i ] != NULL) + { + TRAP_IGNORE( iObserver->BufferReadyL( this->iBuffers[ i ] ) ); + this->iBuffers[ i ] = NULL; + break; + } + } + } + else + { + iObserver->FetchError( result ); + } + __VTPRINTEXIT( "RVD(NGA).BufferWaiter.RunL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDrawNGA::CVtEngBufferWaiter::DoCancel +// ----------------------------------------------------------------------------- +// +void CVtEngDrawNGA::CVtEngBufferWaiter::DoCancel() + { + __VTPRINTENTER( "RVD(NGA).BufferWaiter.DoCancel" ) + + if ( iStatus == KRequestPending ) + { + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrCancel); + } + + __VTPRINTEXIT( "RVD(NGA).BufferWaiter.DoCancel" ) + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Media/CVtEngDtmfHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Media/CVtEngDtmfHandler.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,363 @@ +/* +* Copyright (c) 2004 - 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: Handler for DTMF sending. +* +*/ + + +// INCLUDE FILES +#include "CVtEngDtmfHandler.h" +#include "CVtEngMediaHandler.h" +#include "VtEngPanic.h" +#include "cvtlogger.h" + +// LOCAL MACROS +#define DTMF_STATES_COUNT 3 +const TInt KProtoDtmfCommandId = -1; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngDtmfHandler::NewL +// +// ----------------------------------------------------------------------------- +// +CVtEngDtmfHandler* CVtEngDtmfHandler::NewL( MVtH324ConfigCommand& aH324Config ) + { + __VTPRINTENTER( "DTMF.New" ) + CVtEngDtmfHandler* self = new ( ELeave ) CVtEngDtmfHandler( aH324Config ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); // self + __VTPRINTEXIT( "DTMF.New" ) + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfHandler::~CVtEngDtmfHandler +// +// ----------------------------------------------------------------------------- +// +CVtEngDtmfHandler::~CVtEngDtmfHandler() + { + __VTPRINTENTER( "DTMF.~" ) + if ( iDtmfStates ) + { + iDtmfStates->ResetAndDestroy(); + } + delete iDtmfStates; + if( iProtoDtmf ) + { + VTProtocolFactory::DeleteUserInputIndication(iProtoDtmf); + } + iProtoDtmf = NULL; + __VTPRINTEXIT( "DTMF.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfHandler::HandleL +// +// ----------------------------------------------------------------------------- +// +void CVtEngDtmfHandler::HandleL( CVtEngOperation& aOp ) + { + __VTPRINTENTER( "DTMF.HandleL" ) + + const TVtEngCommandId cmdId( aOp.Command() ); + switch ( cmdId ) + { + case KVtEngStartDtmfTone: + { + __VTPRINT( DEBUG_MEDIA , "DTMF. start tone" ) + TChar tone; + TVtEngOpParamUtil::Set( tone, aOp ); + CVtEngDtmfState* state = (*iDtmfStates)[iCurrentState]; + if ( state ) + { + TVtEngDtmfTone dtmfTone( tone ); + state->SendDtmfL( dtmfTone ); + } + } + break; + case KVtEngStopDtmfTone: + __VTPRINT( DEBUG_MEDIA , "DTMF. stop tone (no op)" ) + break; + // Handling of different UIIs + case KVtEngSetUIIDtmfSupport: + SetUIISupport( EDTMFString ); + __VTPRINT( DEBUG_MEDIA , "DTMF Support enabled" ) + break; + case KVtEngSetUIIBasicStringSupport: + SetUIISupport( EBasicString ); + __VTPRINT( DEBUG_MEDIA , "Basic string Support enabled" ) + break; + case KVtEngSetUIIIA5StringSupport: + SetUIISupport( EIA5String ); + __VTPRINT( DEBUG_MEDIA , "IA5 String Support enabled" ) + break; + case KVtEngSetUIIGeneralStringSupport: + SetUIISupport( EGeneralString ); + __VTPRINT( DEBUG_MEDIA , "General String Support enabled" ) + break; + default: + __VTPRINT( DEBUG_MEDIA , "DTMF.Handle cmd not supported" ) + User::Leave( KErrNotSupported ); + } + __VTPRINTEXIT( "DTMF.HandleL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfHandler::ActivateState +// +// ----------------------------------------------------------------------------- +// +CVtEngDtmfState& CVtEngDtmfHandler::ActivateState( TVtEngDtmfState aNewState ) + { + __VTPRINTENTER( "DTMF.ActivateState" ) + __VTPRINT2( DEBUG_MEDIA , " new state=%d", aNewState ) + __ASSERT_ALWAYS( aNewState >= EVtDtmfStateIdle && + aNewState <= EVtDtmfStateBuffered, + Panic( EVtEngPanicInvalidDtmfState) ); + iCurrentState = aNewState; + __VTPRINTEXIT( "DTMF.ActivateState" ) + return *(*iDtmfStates)[iCurrentState]; + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfHandler::SendComplete +// +// ----------------------------------------------------------------------------- +// +void CVtEngDtmfHandler::SendComplete( TInt aError ) + { + __VTPRINTENTER( "DTMF.SendComplete" ) +#ifdef VTDEBUG + TRAPD( ignore, HandleSendCompleteL( aError ) ); + __VTPRINT2( DEBUG_MEDIA , "DTMF.SendComplete err=%d", ignore ) +#else + TRAP_IGNORE( HandleSendCompleteL( aError ) ); +#endif // VTDEBUG + __VTPRINTEXIT( "DTMF.SendComplete" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfHandler::ProtoDtmf +// +// ----------------------------------------------------------------------------- +// +MVTUserInput& CVtEngDtmfHandler::ReserveProtoDtmfL( + const TVtEngDtmfTone& aTone ) + { + __VTPRINTENTER( "DTMF.ReserveProtoDtmfL" ) + if ( iProtoDtmf != NULL ) + { + __VTPRINT( DEBUG_MEDIA , "DTMF.ReserveProtoDtmfL IN USE" ) + User::Leave( KErrInUse ); + } + TUint8 val = (TUint8) aTone.iTone; + +#ifdef VTDEBUG + if ( CVtLogger::Flags() & CVtLogger::ELogMedia ) + { + const TChar ch( val ); + _LIT( KVtDtmfBufferTrace, "VT: DTMF. tone value=" ); + TBuf<25> buffer( KVtDtmfBufferTrace() ); + buffer.Append( ch ); + RDebug::Print( buffer ); + } +#endif + + + + // NOTE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // IT MUST BE CHECKED IS GIVEN LETTER SUPPORTED BY + // USED ENCODING SCHEME. NOW WE PASS ONLY NUMBERS AND * AND # + // AND THEY ARE SAFE TO USE BUT USING POWERFULL UIIs GIVE POSSIBILITY + // TO SEND ALL DIGITS AND NUMBERS. IN THAT CASE SET OF CHARS MUST BE CHECKED + // IN VTENGINE. (THAT IS THE REASON WHY THERE IS SEPARATE IF ELSEs) + // NOTE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + __VTPRINT2( DEBUG_MEDIA , "DTMF. Proto USERINPUT %d", iUIISupport ) + switch ( iUIISupport ) + { + case EBasicString: + case EIA5String: + case EGeneralString: + __VTPRINT( DEBUG_MEDIA , "DTMF. Proto USERINPUT alphanumeric" ) + iProtoDtmf = VTProtocolFactory::CreateUserInputIndication( EVtUiiAlphaNumeric, val ); + break; + case EDTMFString: + __VTPRINT( DEBUG_MEDIA , "DTMF. Proto USERINPUT iDTMFString" ) + iProtoDtmf = VTProtocolFactory::CreateUserInputIndication( EVtUiiDTMF, val); + break; + default: + __VTPRINT( DEBUG_MEDIA , "DTMF. Proto USERINPUT unsupported" ) + break; + } + __VTPRINTEXIT( "DTMF.ReserveProtoDtmfL" ) + return *iProtoDtmf; + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfHandler::ReleaseProtoDtmf +// +// ----------------------------------------------------------------------------- +// +void CVtEngDtmfHandler::ReleaseProtoDtmf() + { + __VTPRINTENTER( "DTMF.ReleaseProtoDtmf" ) + if( iProtoDtmf ) + { + VTProtocolFactory::DeleteUserInputIndication(iProtoDtmf); + } + iProtoDtmf = NULL; + __VTPRINTEXIT( "DTMF.ReleaseProtoDtmf" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfHandler::CVtEngDtmfHandler +// +// ----------------------------------------------------------------------------- +// +CVtEngDtmfHandler::CVtEngDtmfHandler( MVtH324ConfigCommand& aH324Config ) : + iCurrentState( EVtDtmfStateIdle ), iH324Config( aH324Config ), + iUIISupport( EIA5String ), iIssuedDtmfCommandId(KProtoDtmfCommandId) + { + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfHandler::ConstructL +// +// ----------------------------------------------------------------------------- +// +void CVtEngDtmfHandler::ConstructL() + { + __VTPRINTENTER( "DTMF.ConstructL" ) + iDtmfStates = new ( ELeave ) + CArrayPtrFlat( DTMF_STATES_COUNT ); + + for ( TInt state = EVtDtmfStateIdle; + state <= EVtDtmfStateBuffered; + state++ ) + { + CreateStateL( state ); + } + __VTPRINTEXIT( "DTMF.ConstructL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfHandler::HandleSendCompleteL +// +// ----------------------------------------------------------------------------- +// +void CVtEngDtmfHandler::HandleSendCompleteL( TInt aError ) + { + __VTPRINTENTER( "DTMF.HandleSendCompleteL" ) + + __VTPRINT2( DEBUG_MEDIA , " HandleSendCompleteL err=%d", aError ) + if ( iDtmfStates ) + { + CVtEngDtmfState* state = (*iDtmfStates)[iCurrentState]; + if ( state ) + { + __VTPRINT2( DEBUG_MEDIA | DEBUG_DETAIL, + "DTMF. complete on state %d", iCurrentState ) + state->DtmfSendCompleteL( aError ); + } + } + __VTPRINTEXIT( "DTMF.HandleSendCompleteL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfHandler::CreateState +// +// ----------------------------------------------------------------------------- +// +void CVtEngDtmfHandler::CreateStateL( TInt aState ) + { + __VTPRINTENTER( "DTMF.CreateStateL" ) + CVtEngDtmfState* dtmfState = NULL; + switch ( aState ) + { + case EVtDtmfStateIdle: + dtmfState = CVtEngDtmfIdle::NewL( *this, iH324Config ); + break; + case EVtDtmfStateSending: + dtmfState = CVtEngDtmfSending::NewL( *this, iH324Config ); + break; + case EVtDtmfStateBuffered: + dtmfState = CVtEngDtmfBuffered::NewL( *this, iH324Config ); + break; + default: + Panic( EVtEngPanicInvalidDtmfState ); + break; + } + CleanupStack::PushL( dtmfState ); + iDtmfStates->AppendL( dtmfState ); + CleanupStack::Pop(); + __VTPRINTEXIT( "DTMF.CreateStateL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfHandler::GetUIISupport +// returns the current UII support +// ----------------------------------------------------------------------------- +// +CVtEngDtmfHandler::TUIISupport CVtEngDtmfHandler::GetUIISupport() const + { + __VTPRINT2( DEBUG_MEDIA , "DTMF. GETUSERINPUT support=%d", iUIISupport ) + return iUIISupport; + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfHandler::SetUIISupport +// Sets the UII support mode +// ----------------------------------------------------------------------------- +// +void CVtEngDtmfHandler::SetUIISupport( CVtEngDtmfHandler::TUIISupport aValue ) + { + __VTPRINT2( DEBUG_MEDIA , "DTMF. SETUSERINPUT support=%d", aValue ) + iUIISupport = aValue; + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfHandler::CheckCommandId +// Compares last issued DTMF command ID to parameter given command ID +// ----------------------------------------------------------------------------- +// +TBool CVtEngDtmfHandler::CheckCommandId( TInt aCheckCommandId ) const + { + __VTPRINT3( DEBUG_MEDIA , "DTMF. CHKCMID aCheckCommandId=%d iIssuedDtmfCommandId=%d",\ + aCheckCommandId, iIssuedDtmfCommandId ) + + if( iIssuedDtmfCommandId == aCheckCommandId ) + { + return ETrue; + } + + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfHandler::StoreCommandId +// Stores given command ID +// ----------------------------------------------------------------------------- +// +void CVtEngDtmfHandler::StoreCommandId( TInt aStoreCommandId ) + { + __VTPRINT2( DEBUG_MEDIA , "DTMF. STORECOMMANDID aStoreCommandId=%d", aStoreCommandId ) + + iIssuedDtmfCommandId = aStoreCommandId; + } +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Media/CVtEngImageScaler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Media/CVtEngImageScaler.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,314 @@ +/* +* Copyright (c) 2004 - 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: Image scaler +* +*/ + + + +// INCLUDE FILES +#include "CVtEngSettings.h" +#include "VtEngUtils.h" +#include "CVtEngImageScaler.h" +#include +#include +#include +#include + +// CONSTANTS +// The number of used bitmaps as scaling targets. +const TInt KVtEngTargetBitmapCount = 2; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngImageScaler::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +MVtEngImageScaler* CVtEngImageScaler::NewL( + MVtEngScalerObserver& aObserver ) + { + __VTPRINTENTER( "Scaler.NewL" ) + CVtEngImageScaler* scaler = new ( ELeave ) CVtEngImageScaler( aObserver ); + CleanupStack::PushL( scaler ); + scaler->ConstructL(); + CleanupStack::Pop( scaler ); + __VTPRINTEXIT( "Scaler.NewL" ) + return scaler; + } + +// ----------------------------------------------------------------------------- +// CVtEngImageScaler::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVtEngImageScaler::ConstructL() + { + iVtScaler = CVtImageScaler::NewL( *this ); + GetScalingMethodL(); + iVtScaler->SetQualityL( iScalingMethod ); + } + +// ----------------------------------------------------------------------------- +// CVtEngImageScaler::ScaleL +// Scaling method. +// ----------------------------------------------------------------------------- +// +void CVtEngImageScaler::ScaleL( + TInt aSourceIndex ) + { + __VTPRINTENTER( "Scaler.ScaleL" ) + __VTPRINT2( DEBUG_MEDIA | DEBUG_DETAIL, "Scaler:ScaleL index=%d", + aSourceIndex ) + __VTPRINT2( DEBUG_MEDIA | DEBUG_DETAIL, "Scaler:ScaleL target index=%d", + iTargetBitmapInUse ) + if ( iVtScaler->IsActive() ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "Scaler:ScaleL NActive" ) + User::Leave( KErrInUse ); + } + + // If there is no bitmaps done, do leave. + // The caller should call ConfigureL. + if ( iSources.Count() <= 0 || iTargets.Count() <= 0 ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "Scaler:ScaleL: not conf" ) + User::Leave( KErrNotReady ); + } + iVtScaler->ScaleL( *iSources[ aSourceIndex ] , + *iTargets[iTargetBitmapInUse] ); + __VTPRINTEXIT( "Scaler.ScaleL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngImageScaler::Configure +// Configure scaling. +// ----------------------------------------------------------------------------- +// +TBool CVtEngImageScaler::ConfigureL( + TDisplayMode aDisplayMode, + TSize aSize, + TInt aSourceHandle1, + TInt aSourceHandle2 ) + { + __VTPRINTENTER( "Scaler.ConfigureL" ) + __VTPRINT( DEBUG_MEDIA , "================== Scaler.Config ==================" ) + __VTPRINT2( DEBUG_MEDIA, " aSize.iWidth:%d ", aSize.iWidth) + __VTPRINT2( DEBUG_MEDIA, " aSize.iHeight:%d ", aSize.iHeight ) + __VTPRINT2( DEBUG_MEDIA, " aDisplayMode:%d", aDisplayMode ) + __VTPRINT( DEBUG_MEDIA , "================== Scaler.Config ==================" ) + + TInt sourceHandle1( 0 ); + if ( iSources.Count() > 0 ) + { + CVtImageBitmap* bmp = iSources[ EFirstBitmap ]; + if ( bmp ) + { + sourceHandle1 = bmp->Bitmap().Handle(); + } + } + TInt sourceHandle2( 0 ); + if ( iSources.Count() > 1 ) + { + CVtImageBitmap* bmp = iSources[ ESecondBitmap ]; + if ( bmp ) + { + sourceHandle2 = bmp->Bitmap().Handle(); + } + } + + // Do we have to cancel scaling first? + TBool cancelled( iVtScaler->IsActive() ); + + if ( aSourceHandle1 != sourceHandle1 || aSourceHandle2 != sourceHandle2 + || aSize != iSize || iMode != aDisplayMode ) + { + if ( cancelled ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "Scaler:Config cancel" ) + Cancel(); + } + } + else + { + // Do we need the update => NO + __VTPRINTEXITR( "Scaler.ConfigureL %d", EFalse ) + return EFalse; + } + + // Store new mode and size. + iMode = aDisplayMode; + iSize = aSize; + + // The RVD source images have changed. + if ( aSourceHandle1 != sourceHandle1 || aSourceHandle2 != sourceHandle2 ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + "Scaler:ConfigureL create bitmaps" ) + CVtImageBitmap* vtBitmap = CVtImageBitmap::NewL( aSourceHandle1 ); + CleanupStack::PushL( vtBitmap ); + CVtImageBitmap* vtBitmap2 = CVtImageBitmap::NewL( aSourceHandle2 ); + CleanupStack::PushL( vtBitmap2 ); + + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "Scaler:ConfigureL source reset" ) + iSources.ResetAndDestroy(); + iSources.AppendL( vtBitmap ); + iSources.AppendL( vtBitmap2 ); + CleanupStack::Pop( KVtEngTargetBitmapCount ); // vtBitMaps + } + + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "Scaler:ConfigureL create targets" ) + CVtImageBitmap* vtBitmapT = CVtImageBitmap::NewL( aSize, aDisplayMode ); + CleanupStack::PushL( vtBitmapT ); + CVtImageBitmap* vtBitmapT2 = CVtImageBitmap::NewL( aSize, aDisplayMode ); + CleanupStack::PushL( vtBitmapT2 ); + + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "Scaler:ConfigureL target reset" ) + iTargets.ResetAndDestroy(); + iTargets.AppendL( vtBitmapT ); + iTargets.AppendL( vtBitmapT2 ); + CleanupStack::Pop( KVtEngTargetBitmapCount ); // vtBitMapTs + + __VTPRINTEXITR( "Scaler.ConfigureL %d", cancelled ) + return cancelled; + } + +// ----------------------------------------------------------------------------- +// CVtEngImageScaler::ScalingFinished +// Callback telling that scaling is done. +// ----------------------------------------------------------------------------- +// +void CVtEngImageScaler::ScalingFinished( TInt aError ) + { + __VTPRINTENTER( "Scaler.ScalingFinished" ) + + __VTPRINT2( DEBUG_MEDIA | DEBUG_DETAIL, "Scaler:ScaleFin ", aError ) + + if ( aError == KErrNone ) + { + CFbsBitmap& bitmap = iTargets [ iTargetBitmapInUse ]->Bitmap(); + __VTPRINT2( DEBUG_MEDIA, "Scaler.ScalingFin index", iTargetBitmapInUse ) + + if ( iTargetBitmapInUse == EFirstBitmap ) + { + iTargetBitmapInUse = ESecondBitmap; + } + else + { + iTargetBitmapInUse = EFirstBitmap; + } + // Notify client of done scaling + iObserver.ScalingCompleted( &bitmap, aError ); + } + else + { + iObserver.ScalingCompleted( NULL, aError ); + } + __VTPRINTEXIT( "Scaler.ScalingFinished" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngImageScaler::~CVtEngImageScaler +// Destructor. +// ----------------------------------------------------------------------------- +// +CVtEngImageScaler::~CVtEngImageScaler() + { + __VTPRINTENTER( "Scaler.~" ) + + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "Scaler:Dtor" ) + iTargets.ResetAndDestroy(); + iTargets.Close(); + iSources.ResetAndDestroy(); + iSources.Close(); + delete iVtScaler; + __VTPRINTEXIT( "Scaler.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngImageScaler::CVtEngImageScaler +// C++ constructor. +// ----------------------------------------------------------------------------- +// +CVtEngImageScaler::CVtEngImageScaler( + MVtEngScalerObserver& aObserver ) : + iObserver( aObserver ), iTargetBitmapInUse ( EFirstBitmap ), + iScalingMethod( CVtImageScaler::EWeightedAverage ) + { + } + +// ----------------------------------------------------------------------------- +// CVtEngImageScaler::Release +// Interface function implementation to delete the implementation. +// ----------------------------------------------------------------------------- +// +void CVtEngImageScaler::Release() + { + // Delete myself + __VTPRINTENTER( "Scaler.Release" ) + delete this; + __VTPRINTEXIT( "Scaler.Release" ) + } + +// ----------------------------------------------------------------------------- +// VtEngScalerFactory::CreateScalerL +// Creates the image scaler. +// ----------------------------------------------------------------------------- +// +MVtEngImageScaler* VtEngScalerFactory::CreateScalerL( + MVtEngScalerObserver& aObserver ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + "VtEngScalerFactory::CreateScalerL" ) + return CVtEngImageScaler::NewL( aObserver ); + } + +// ----------------------------------------------------------------------------- +// CVtEngImageScaler::Cancel +// Cancels the conversion. +// ----------------------------------------------------------------------------- +// +TInt CVtEngImageScaler::Cancel() + { + __VTPRINTENTER( "Scaler.Cancel" ) + iVtScaler->Cancel(); + __VTPRINTEXIT( "Scaler.Cancel" ) + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngImageScaler::GetScalingMethodL +// Gets the used scaling method from local variation. +// ----------------------------------------------------------------------------- +// +void CVtEngImageScaler::GetScalingMethodL() + { + __VTPRINTENTER( "Scaler.GetScalingMethodL" ) + // Check if the scaling method is non-default + CVtEngSettings& settings = CVtEngUtility::Settings(); + if( settings.CheckBits( + KVTLVFlagScalingMethodENearest ) ) + { + iScalingMethod = CVtImageScaler::ENearest; + } + else if ( settings.CheckBits( + KVTLVFlagScalingMethodEBilinear ) ) + { + iScalingMethod = CVtImageScaler::EBilinear; + } + __VTPRINTEXITR( "Scaler.GetScalingMethodL %d", (TInt) iScalingMethod ) + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Media/CVtEngLocalVideo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Media/CVtEngLocalVideo.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,4796 @@ +/* +* Copyright (c) 2004-2007 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: Local video configuration +* +*/ + + + +// INCLUDE FILES +#include "CVtEngLocalVideo.h" +#include "CVtEngMediaHandler.h" +#include "VtEngPanic.h" +#include "MVtEngFrameObserver.h" +#include "CVtEngStateManager.h" +#include "CVtEngEventManager.h" +#include "MVtEngMedia.h" +#include "CVtEngSettings.h" +#include "VtEngUtils.h" +#include "VtEngEvents.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "CVtEngCameraPreferences.h" + +// LOCAL CONSTANTS AND MACROS + +// Maximum count of providers stored (cameras, still, blank) +const TInt KVtEngProviderCountMax = 4; + +// Max zoom step count. +const TInt KVtMaxZoomStep = 10; + +// If prepare camera is called when provider is ready signal +// immediately back with positive value. +const TInt KVtEngAlreadySelected = 1; + +// If source is already active signal with this. +const TInt KVtEngAlreadyActive = 2; + +// Number of providers buffered in image sharer +const TInt KVtEngNumProvidersBuffered = 2; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngLocalVideo +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngLocalVideo::CVtEngLocalVideo( + CVtEngMediaHandler& aObserver ) + + /** priority is high to ensure that this AO gets scheduled as soon as + * possible after signaling. If local video is requested a service, e.g. + * source switch while its signaled but not yet scheduled, local video's + * internal state may be compromised (signal AO => start selecting new source + * => RunL [this would break ongoing source selection] + */ + : CActive( EPriorityHigh ), + iRenderingMethod( EUnspecified ), + iObserver( aObserver ), + iCurrentCamera( MVtEngMedia::ESecondaryCamera ), + iLayoutChangeHandler( *this ) + { + ResetIndices(); + __VTPRINT( DEBUG_MEDIA | DEBUG_CONSTRUCT, "LocVideo.c++") + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::ConstructL() + { + __VTPRINTENTER( "LocVideo.ConstructL" ) + + iAsyncCallBack = new ( ELeave ) CAsyncCallBack( + TCallBack( CallBackFunc, this ), EPriorityStandard ); + + iNGARender = CVtEngVFBitmapNGARender::NewL(); + + TInt indexMobile( KErrNotFound ); + iShareImage = CVtEngShareImage::NewL( *this ); + iSourceController = CVSController::NewL( this ); + iVideoProviders = + new ( ELeave ) CArrayFixFlat( KVtEngProviderCountMax ); + iSource = iSourceController->CreateDataSourceL( this ); + PauseVideoSending(); + TInt providers( iSourceController->ProvidersAvailable() ); + iNumSupportedCameras = providers - 1; + ResetIndices(); + __VTPRINT2( DEBUG_MEDIA | DEBUG_CONSTRUCT, "LocVideo.providers=%d",providers) + // Get the device specified default camera. + TInt cameraId( iCurrentCamera ); + TInt err( SetCameraTrackingL( cameraId ) ); + if ( err == KErrNone && cameraId != EPSPreferredCameraUnknown ) + { + // Only if valid camera. + iCurrentCamera = MapCameraInternally( cameraId ); + err = KErrAlreadyExists; + } + + while ( providers-- ) + { + CVSDataProvider* provider = NULL; + TRAP_IGNORE( provider = + iSourceController->CreateDataProviderL( providers, this, iSource ) ); + if ( provider ) + { + CleanupStack::PushL( provider ); + TProviderItem item; + TVSDataProviderInfo info; + provider->ProviderInfo( info ); + TBool destroy( ETrue ); + __VTPRINT2( DEBUG_MEDIA | DEBUG_CONSTRUCT, "LocVideo.Orient=%d", + info.iOrientation ) + switch ( info.iOrientation ) + { + case TCameraInfo::EOrientationInwards: + SetFlag( EFlagCamera1Available ); + item.iType = KVtEngProviderCam1; + if ( err != KErrAlreadyExists ) + { + // Set only if value not obtained from PubSub + iCurrentCamera = MVtEngMedia::EPrimaryCamera; + } + iProviderInfoIndexCam1 = providers; + __VTPRINT2( DEBUG_MEDIA | DEBUG_CONSTRUCT, "LocVideo.ConL ID C1=%d", + iProviderInfoIndexCam1 ) + break; + case TCameraInfo::EOrientationOutwards: + // Configures outwards camera, it is treated as camera 1 + // if there is only one camera in the device. + ConfigureOutwardsCameraItem( item, providers ); + break; + case TCameraInfo::EOrientationMobile: + __VTPRINT( DEBUG_MEDIA | DEBUG_CONSTRUCT, "LocVideo.Mobile") + item.iType = KVtEngProviderTempImage; + indexMobile = providers; + __VTPRINT2( DEBUG_MEDIA | DEBUG_CONSTRUCT, "LocVideo.Mobile ID=%d", + indexMobile ) + break; + case TCameraInfo::EOrientationUnknown: + { + item.iType = KVtEngProviderImage; + item.iProvider = provider; + item.iProviderState = EPermanent; + destroy = EFalse; // don't delete still provider + CreateBlankProviderL( providers ); + + if ( CVtEngUtility::Settings(). + IsDefaultStillImageDefined() ) + { + CreateDefaultStillImageProviderL( providers ); + } + + iProviderInfoIndexStill = providers; + __VTPRINT2( DEBUG_MEDIA | DEBUG_CONSTRUCT, + "LocVideo.ConL ID Still=%d",iProviderInfoIndexStill ) + } + break; + default: + break; + } + iVideoProviders->AppendL( item ); + CleanupStack::Pop(); + if ( destroy ) + { + delete provider; + provider = NULL; + } + } + } + iObserver.SetSelectedCameraId( iCurrentCamera ); + // Check if mobile is there, and either 1 or 2 is not. + + if ( indexMobile != KErrNotFound ) + { + TProviderItem* item = NULL; + const TInt err = GetProviderByType( KVtEngProviderTempImage, item ); + __ASSERT_ALWAYS( err != KErrNotFound, + Panic( EVtEngPanicInvalidInitializationState ) ); + if ( iProviderInfoIndexCam1 == KErrNotFound ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_CONSTRUCT, "LocVideo.ConL Switch 1" ) + item->iType = KVtEngProviderCam1; + iProviderInfoIndexCam1 = indexMobile; + SetFlag( EFlagCamera1Available ); + } + else + { + __VTPRINT( DEBUG_MEDIA | DEBUG_CONSTRUCT, "LocVideo.ConL Switch 2" ) + DeleteProvider( KVtEngProviderCam2 ); + item->iType = KVtEngProviderCam2; + iProviderInfoIndexCam2 = indexMobile; + SetFlag( EFlagCamera2Available ); + } + } + __VTPRINTEXIT( "LocVideo.ConstructL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::ConfigureOutwardsCameraItem +// Creates providers item for outwards camera type. It is treated as +// a) primary camera in single camera configurations +// b) secondary camera in two camera configurations +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::ConfigureOutwardsCameraItem( + TProviderItem& aItem, + const TInt aCurrentIndex ) + { + __VTPRINTENTER( "LocVideo.ConfigureOutwardsCameraItem" ) + if ( iNumSupportedCameras == 1 ) + { + SetFlag( EFlagCamera1Available ); + aItem.iType = KVtEngProviderCam1; + iProviderInfoIndexCam1 = aCurrentIndex; + iCurrentCamera = MVtEngMedia::EPrimaryCamera; + __VTPRINT2( DEBUG_MEDIA, + "LocVideo.ConL ID C1=%d", iProviderInfoIndexCam1 ) + } + else + { + SetFlag( EFlagCamera2Available ); + aItem.iType = KVtEngProviderCam2; + iProviderInfoIndexCam2 = aCurrentIndex; + __VTPRINT2( DEBUG_MEDIA, + "LocVideo.ConL ID C2=%d", iProviderInfoIndexCam2 ) + } + __VTPRINTEXITR( "LocVideo.ConfigureOutwardsCameraItem iCurrentCamera=%d", + iCurrentCamera ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CallBackFunc +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::CompleteOperation( const TInt aResult ) + { + __VTPRINTENTER( "LocVideo.CompleteOperation" ) + SetResult( aResult ); + iAsyncCallBack->CallBack(); + __VTPRINTEXITR( "LocVideo.CompleteOperation %d", aResult ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::VideoChannelOpenedL +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::VideoChannelOpenedL() + { + __VTPRINTENTER( "LocVideo.VideoChannelOpenedL" ) + if ( iDelayedSelect.IsDelayedSelectPending() ) + { + SelectSourceL( iDelayedSelect.DelayedSelectTarget() ); + } + __VTPRINTEXIT( "LocVideo.VideoChannelOpenedL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CallBackFunc +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo::CallBackFunc( TAny* aPtr ) + { + __VTPRINTENTER( "LocVideo.CallBackFunc" ) + CVtEngLocalVideo* self = reinterpret_cast< CVtEngLocalVideo* >( aPtr ); + TInt result( KErrNone ); + TRAP( result, + self->iObserver.HandleLocalVideoOperationCompleteL( + self->Result() ) ); + __VTPRINTEXITR( "LocVideo.CallBackFunc %d", result ) + return result; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::Result +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo::Result() const + { + __VTPRINTENTER( "LocVideo.Result" ) + __VTPRINTEXITR( "LocVideo.Result %d", iResult ) + return iResult; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::SetResult +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::SetResult( const TInt aResult ) + { + __VTPRINTENTER( "LocVideo.SetResult" ) + iResult = aResult; + __VTPRINTEXITR( "LocVideo.SetResult %d", iResult ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtEngLocalVideo* CVtEngLocalVideo::NewL( + CVtEngMediaHandler& aObserver ) + { + __VTPRINTENTER( "LocVid.NewL" ) + CVtEngLocalVideo* self = new( ELeave ) + CVtEngLocalVideo( aObserver ); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop(); + __VTPRINTEXIT( "LocVid.NewL" ) + return self; + } + + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::~CVtEngLocalVideo +// Destructor. Cannot leave. +// ----------------------------------------------------------------------------- +// +CVtEngLocalVideo::~CVtEngLocalVideo() + { + __VTPRINTENTER( "LocVid.~" ) + // Cancel the object + if ( iActiveProvider ) + { + iActiveProvider->DetachFromCameraPreferences(); + } + if ( iAsyncCallBack ) + { + iAsyncCallBack->Cancel(); + delete iAsyncCallBack; + } + Cancel(); + if ( iVideoProviders ) + { + while ( iVideoProviders->Count() ) + { + TProviderItem& item = (*iVideoProviders)[0]; + CVSDataProvider* provider = item.iProvider; + delete provider; + iVideoProviders->Delete( 0 ); + } + delete iVideoProviders; + } + + delete iCameraListener; + iCameraListener = NULL; + + delete iSource; + delete iSourceController; + DeleteAudioSource(); + delete iShareImage; + + delete iNGARender; + + __VTPRINTEXIT( "LocVid.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::vsProviderError +// Handles error in provider. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::vsProviderError( TInt aError ) + { + if( aError == KErrCancel ) + { + vsProviderReady(); + return; + } + __VTPRINTENTER( "LocVid.vsProviderError" ) + __VTPRINT2( DEBUG_MEDIA, "LocVideo.ProviderError=%d", aError ) + iInitializingProvider = NULL; + if ( aError != KErrNone ) + { + iShareImage->Error( aError ); + if ( !iLayoutChangeHandler.ProviderError( aError ) ) + { + const TState previousState = iState; + iState = ELocNone; + __VTPRINT( DEBUG_MEDIA, " STATE TO NONE" ) + + // If the error indicates that camera is in use + if ( aError == KErrInUse && previousState == ELocInitializing ) + { + // Store the error to be used later + if( iSelectedProvider ) + { + __VTPRINT( DEBUG_MEDIA, + "LocVideo.ProviderError in use") + iSelectedProvider->iErrorCode = aError; + if ( iSelectedProvider->iType == KVtEngProviderCam1 ) + { + ClearFlag( EFlagCamera1Available ); + } + else if ( iSelectedProvider->iType == KVtEngProviderCam2 ) + { + ClearFlag( EFlagCamera2Available ); + } + } + } + // Camera has been lost + if ( aError == KVsErrCameraNoLongerReserved ) + { + if ( !IsActive() ) + { + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, aError ); + __VTPRINT( DEBUG_MEDIA, + "LocVideo.ProviderError AO start" ) + __VTPRINTEXITR( + "LocVid.vsProviderError err=%d", aError ) + + __VTPRINT( DEBUG_MEDIA, + "LocVideo.ProviderError iSelectedProvider NULL" ) + if ( iSelectedProvider ) + { + __VTPRINT( DEBUG_MEDIA, + "LocVideo.ProviderError iSelectedProvider NULL" ) + iSelectedProvider->iInitialized = EFalse; + iSelectedProvider->iProviderState = + (CVtEngLocalVideo::TProviderState) aError; + __VTPRINT( DEBUG_MEDIA, + "LocVideo.ProviderError iSelectedProvider NULL" ) + } + return; + } + } + if ( iSelectedProvider ) + { + // Try to select the last known to function camera + if ( iSelectedProvider->iType == KVtEngProviderCam1 || + iSelectedProvider->iType == KVtEngProviderCam2 ) + { + if ( !IsActive() ) + { + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, aError ); + __VTPRINT( DEBUG_MEDIA, + "LocVideo.ProviderError AO start" ) + __VTPRINTEXITR( + "LocVid.vsProviderError err=%d", aError ) + return; + } + } + //Error code needed later + iSelectedProvider->iInitialized = EFalse; + iSelectedProvider->iProviderState = + (CVtEngLocalVideo::TProviderState) aError; + iSelectedProvider = NULL; + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + " selected provider nulled" ) + } + else if ( iActiveProvider && + !IsFlag( EFlagInitializeOnly ) && + previousState == ELocSwichingProvider ) + { + iActiveProvider = iFadingProvider; + iFadingProvider = NULL; + } + if ( IsFlag( EFlagSignalSourceSelection ) ) + { + ClearFlag( EFlagSignalSourceSelection ); + TRAP_IGNORE( + iObserver.HandleLocalVideoOperationCompleteL( aError ) ); + } + } + } + __VTPRINTEXIT( "LocVid.vsProviderError" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::vsProviderReady +// Provider is ready to be taken into use. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::vsProviderReady() + { + __VTPRINTENTER( "LocVid.vsProviderReady" ) + + __VTPRINT3( DEBUG_MEDIA, "LocVideo.ProviderReady state=%d, initOnly=%d", + iState, IsFlag( EFlagInitializeOnly ) ) + const TState prevState( iState ); + + if ( iInitializingProvider ) + { + iInitializingProvider->iInitialized = ETrue; + + // Set camera flags in order to recover + // error situation (error occured during init) + if ( iInitializingProvider->iType == KVtEngProviderCam1 ) + { + __VTPRINT( DEBUG_MEDIA, " LocVid.vsProviderReady KVtEngProviderCam1" ) + SetFlag( EFlagCamera1Available ); + } + else if ( iInitializingProvider->iType == KVtEngProviderCam2 ) + { + __VTPRINT( DEBUG_MEDIA, " LocVid.vsProviderReady KVtEngProviderCam2" ) + SetFlag( EFlagCamera2Available ); + } + + iInitializingProvider = NULL; + } + + iState = ELocReady; + __VTPRINT( DEBUG_MEDIA, " STATE TO READY" ) + + if ( iLayoutChangeHandler.ProviderReady() ) + { + __VTPRINTEXIT( "LocVid.vsProviderReady" ) + return; + } + + if ( prevState == ELocInitializing && !IsFlag( EFlagInitializeOnly ) ) + { + TProviderItem* switchTo = iActiveProvider; + if ( iSelectedProvider ) + { + iSelectedProvider->iErrorCode = KErrNone; + switchTo = iSelectedProvider; + iSelectedProvider = NULL; + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, " selected provider nulled" ) + } + __VTPRINT( DEBUG_MEDIA, "LocVideo.ProviderReady switching") + SwitchProvider( switchTo ); + __VTPRINTEXIT( "LocVid.vsProviderReady" ) + return; + } + else + { + iSelectedProvider = NULL; + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "Selected provider nulled, UDS" ) + UpdateState(); + __VTPRINT( DEBUG_MEDIA, + "LocVideo.vsProviderReady KVtEngSourceCapsChanged") + CVtEngEventManager::NotifyEvent( KVtEngSourceCapsChanged ); + } + + if ( IsFlag( EFlagSignalSourceSelection ) ) + { + ClearFlag( EFlagSignalSourceSelection ); + TRAP_IGNORE( iObserver.HandleLocalVideoOperationCompleteL( KErrNone ) ); + } + __VTPRINTEXIT( "LocVid.vsProviderReady" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::vsProviderSwitchDone +// Provider switched. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::vsProviderSwitchDone( CVSDataProvider* aOldProvider ) + { + __VTPRINTENTER( "LocVid.vsProviderSwitchDone" ) + iState = ELocReady; + __VTPRINT( DEBUG_MEDIA, " STATE TO READY" ) + + iFadingProvider = NULL; + + if ( iActiveProvider && iActiveProvider->iProvider ) + { + iActiveProvider->iProvider->ProviderInfo( iProviderInfo ); + TInt error( iActiveProvider->RestoreZoomFactor() ); + if ( error ) + { + __VTPRINT2( DEBUG_MEDIA, + "LocVid.vsProviderSwitchDone restoring stored zoom FAILED %d", + error ) + } + } + + iShareImage->ProviderSwitchDone( aOldProvider ); + + if ( iActiveProvider && iActiveProvider->iType == KVtEngProviderCam1 ) + { + iCurrentCamera = MVtEngMedia::EPrimaryCamera; + iObserver.SetSelectedCameraId( iCurrentCamera ); + } + else if ( iActiveProvider && iActiveProvider->iType == KVtEngProviderCam2 ) + { + iCurrentCamera = MVtEngMedia::ESecondaryCamera; + iObserver.SetSelectedCameraId( iCurrentCamera ); + } + + // Let layout change handler handle providerswitch + if ( iLayoutChangeHandler.ProviderSwitchDone( aOldProvider ) ) + { + CVtEngEventManager::NotifyEvent( KVtEngLCHProviderSwitchDone ); + __VTPRINTEXIT( "LocVid.vsProviderSwitchDone" ) + return; + } + + ClearFlag( EFlagFrozen ); + + // If initilization of the waiting provider fails fall back to the last one. + TVtEngProviderType backupProviderType( KVtEngProviderNone ); + + // Delete non-permanent old provider + const TInt indexI( ProviderIndexByInstance( aOldProvider ) ); + + // delete provider that became unavailable + if ( indexI != KErrNotFound ) + { + __VTPRINT2( DEBUG_MEDIA | DEBUG_DETAIL, + "LocVideo.providerSwitchDone indexInstance=%d", indexI ) + TProviderItem& item( ( *iVideoProviders )[ indexI ] ); + if ( item.iProviderState != EPermanent && + item.iProviderState != ERefreshing ) + { + DeleteProvider( item ); + } + } + + // Uninitialize fading provider + const TInt indexF = ProviderIndexByState( EFading ); + if ( indexF != KErrNotFound ) + { + __VTPRINT2( DEBUG_MEDIA | DEBUG_DETAIL, + "LocVideo.providerSwitchDone fading indexFading=%d", indexF ) + TProviderItem& item = (*iVideoProviders)[indexF]; + + // Mark up type of the last provider. + backupProviderType = item.iType; + + DeleteProvider( item ); + __VTPRINT2( DEBUG_MEDIA | DEBUG_DETAIL, + "LocVideo.providerSwitchDone fading=%d", item.iType ) + TRAP_IGNORE( item.iProvider = CreateDataProviderL( item.iType ) ); + } + + // Initialize waiting provider + TInt err( KErrNone ); + const TInt indexW( ProviderIndexByState( EWaiting ) ); + if ( indexW != KErrNotFound ) + { + __VTPRINT2( DEBUG_MEDIA | DEBUG_DETAIL, + "LocVideo.providerSwitchDone waiting=%d", indexW ) + TProviderItem& item = (*iVideoProviders)[indexW]; + item.iProviderState = EUndefined; + TRAP( err, InitializeProviderL( item ) ); + if ( err == KErrNone) + { + iSelectedProvider = &item; + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, " selected provider set" ) + backupProviderType = KVtEngProviderNone; + } + else + { + iState = ELocNone; + __VTPRINT( DEBUG_MEDIA, " STATE TO NONE" ) + __VTPRINT2( DEBUG_MEDIA, "failed initializing provider=%d", err ) + // If initialization failed indicate that provider is not available + if ( item.iType == KVtEngProviderCam1 ) + { + ClearFlag( EFlagCamera1Available ); + } + else if ( item.iType == KVtEngProviderCam2 ) + { + ClearFlag( EFlagCamera2Available ); + } + else if( item.iType == KVtEngProviderShareImage ) + { + iShareImage->Error( err ); + } + CVtEngEventManager::NotifyEvent( KVtEngMediaInitFailure ); + } + } + + // Reconstruct refreshing (new still image) provider. + const TInt indexR( ProviderIndexByState( ERefreshing ) ); + if ( indexR != KErrNotFound ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + "LocVideo.providerSwitchDone refreshing") + TProviderItem& item = (*iVideoProviders)[indexR]; + DeleteProvider( item ); + + // If still image disabled in settings. + CVtEngSettings& settings = CVtEngUtility::Settings(); + const CVtEngSettings::TVtEngVideoCallConfig& config = + settings.Config(); + const TBool stillImageValid( config.iVideo.iImageIsValid ); + TRAP( err, + { + item.iProvider = CreateDataProviderL( item.iType ); + if ( stillImageValid ) + { + InitializeProviderL( item ); + } + else + { + item.iProviderState = EPermanent; // change back to original + } + } ); + if ( err == KErrNone && stillImageValid ) + { + iSelectedProvider = &item; + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, " selected provider set" ) + } + else + { + iState = ELocNone; + __VTPRINT2( DEBUG_MEDIA, " STATE TO NONE initerr=%d", err ) + } + } + + // If we have delayed select pending -> initiate new switch and return + if ( iDelayedSelect.IsDelayedSelectPending() ) + { + ClearFlag( EFlagCheckRevertToPrevious ); + TVtEngProviderType pending = iDelayedSelect.DelayedSelectTarget(); + __VTPRINT2( DEBUG_MEDIA, " delayed select pending type = %d", pending ) + if( iActiveProvider && iActiveProvider->iType == pending ) + { + // clear the iDelayedSelect to KVtEngProviderUndefined + // and no need to select again,continue complete this vsProviderSwitchDone + iDelayedSelect.DelayedSelectTarget(); + } + else + { + TRAP_IGNORE( SelectSourceL( pending ) ); + __VTPRINTEXIT( "LocVid.vsProviderSwitchDone" ) + return; + } + } + + if ( IsFlag( EFlagSignalSourceSelection ) && + iState != ELocInitializing && // Set in InitializeProviderL if called + err == KErrNone && // but not if init (or create provider in + // there) failed. + !IsFlag( EFlagCheckRevertToPrevious ) ) + { + // Signal only if we're in final state (i.e. not if blank provider + // was switched and just started initializing a camera). + ClearFlag( EFlagSignalSourceSelection ); + TRAP_IGNORE( iObserver.HandleLocalVideoOperationCompleteL( KErrNone ) ); + } + else if ( IsFlag( EFlagCheckRevertToPrevious ) && + ( iState == ELocReady || iState == ELocNone ) ) + { + ClearFlag( EFlagCheckRevertToPrevious ); + MVtEngMedia::TCameraId currentCam( MVtEngMedia::EPrimaryCamera ); + iObserver.GetCurrentCameraId( currentCam ); + backupProviderType = + ( currentCam==MVtEngMedia::EPrimaryCamera ) ? + KVtEngProviderCam1 : KVtEngProviderCam2; + } + + __VTPRINT2( DEBUG_MEDIA, " switch done iState=%d", iState ) + + //Inform camera preferences that valid provider is set + // Check that valid provider exist + // and set it as provider to camera + // preferences + if ( iActiveProvider ) + { + __VTPRINT2( DEBUG_MEDIA, "switch done prov.state=%d", + iActiveProvider->iProviderState ) + // Set provider to camera preferences + // only if camera preferences exist + if ( iCameraPref) + { + __VTPRINT2( DEBUG_MEDIA, + "LocVideo.providerSwitchDone iCameraPref->SetProvider type=%d", + iActiveProvider->iType ) + iCameraPref->SetProvider( iActiveProvider->iProvider, + *iActiveProvider ); + + TInt error( iActiveProvider->RestorePreferences() ); + if ( error ) + { + __VTPRINT2( DEBUG_MEDIA, " restoring preferences FAILED %d", + error ) + } + } + else + { + __VTPRINT( DEBUG_MEDIA, + "LocVideo.providerSwitchDone camera pref not created" ) + } + } + + if ( IsFlag( EFlagInitialized ) && iState != ELocInitializing ) + { + __VTPRINT( DEBUG_MEDIA, + "LocVideo.providerSwitchDone KVtEngSourceCapsChanged" ) + CVtEngEventManager::NotifyEvent( KVtEngSourceChanged ); + } + + TRAP( err, StartViewFinderIfWasStartedL() ); // err is ignored + + if ( backupProviderType != KVtEngProviderNone ) + { + // Initialization of new provider failed, + // try reverting back to last one. + __VTPRINT2( DEBUG_MEDIA, + "LocVideo.providerSwitchDone revert to %d", backupProviderType ) + TRAP( err, SelectSourceL( backupProviderType ) ); + if ( err != KErrNone ) + { + CVtEngEventManager::NotifyEvent( KVtEngMediaInitFailure ); + } + } + + __VTPRINTEXIT( "LocVid.vsProviderSwitchDone" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::vsViewFinderFrameReady +// View finder image can be set. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::vsViewFinderFrameReady( CFbsBitmap& aFrame ) + { + __VTPRINTENTER( "LocVid.vsViewFinderFrameReady" ) + if ( iActiveProvider && + iActiveProvider->iType != KVtEngProviderNone ) + { +#if 0 + TRAP_IGNORE( iOptions.iObserver->vtHandleFrameL( + MVtEngFrameObserver::ELocalVideoFrame, &aFrame ) ); +#endif + iNGARender->UpdateBitmapL( aFrame ); + } + __VTPRINTEXIT( "LocVid.vsViewFinderFrameReady" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::vsProvidersChanged +// Provider state has changed. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::vsProvidersChanged( TBool aAttached ) + { + __VTPRINTENTER( "LocVid.vsProvidersChanged" ) + + __VTPRINT2( DEBUG_MEDIA, " vsProvidersChanged attached=%d", aAttached ) + __VTPRINT2( DEBUG_MEDIA, " vsProvidersChanged state=%d",iState ) + if ( iAudioSource == NULL ) + { + // If this is called from ConstructL (indirectly) return immediately + if ( aAttached || iCurrentCamera == MVtEngMedia::EPrimaryCamera ) + { + SetFlag( EFlagCamera1Available ); + iObserver.SetSelectedCameraId( MVtEngMedia::EPrimaryCamera, ETrue ); + } + else + { + ClearFlag( EFlagCamera1Available ); + iObserver.SetSelectedCameraId( + MVtEngMedia::ESecondaryCamera, ETrue ); + } + __VTPRINTEXIT( "LocVid.vsProvidersChanged" ) + return; + } + + // If primary camera was not available and state is not "open" + // UI should be requested for answer. Precondition is also that + // primary camera is now available. + TBool notifyAnswer( EFalse ); + TInt activeMedia( 0 ); + + const MVtEngSessionInfo::TSessionState state( + CVtEngUtility::StateManager()->SessionState() ); + + __VTPRINT2( DEBUG_MEDIA, " vsProvidersChanged, call state=%d", state ) + if ( state == MVtEngSessionInfo::EReceiving ) + { + __VTPRINT2( DEBUG_MEDIA, " vsProvidersChanged attached=%d", aAttached ) + if ( !IsFlag( EFlagCamera1Available ) && aAttached ) + { + notifyAnswer = ETrue; + } + } + + __VTPRINT2( DEBUG_MEDIA, + " vsProvidersChanged answer=%d", notifyAnswer ) + CVtEngLocalVideo::TVtEngProviderType providerToSelect( KVtEngProviderNone ); + TRAPD( err, providerToSelect = UpdateAvailableProvidersL() ); + if ( err == KErrNone ) + { + // Now get the state to check if video has been disabled + GetMediaState( activeMedia ); + __VTPRINT2( DEBUG_MEDIA, + " vsProvidersChanged mediastate=%d", activeMedia ) + __VTPRINT2( DEBUG_MEDIA, + " vsProvidersChanged iState=%d", iState ) + + // values for checking if switch is allowed + TBool activeIsStillOrBlank ( EFalse ); + TBool activeIsBlankAndNewCam1( EFalse ); + if ( iActiveProvider ) + { + __VTPRINT2( DEBUG_MEDIA, + " vsProvidersChanged iActivePType=%d", iActiveProvider->iType ) + if ( iActiveProvider->iType == KVtEngProviderImage || + iActiveProvider->iType == KVtEngProviderNone ) + { + activeIsStillOrBlank = ETrue; + if ( providerToSelect == KVtEngProviderCam1 && + iActiveProvider->iType == KVtEngProviderNone ) + { + activeIsBlankAndNewCam1 = ETrue; + } + } + } + __VTPRINT2( DEBUG_MEDIA, + " vsProvidersChanged blank active new cam1=%d", + activeIsBlankAndNewCam1 ) + + __VTPRINT2( DEBUG_MEDIA, + " vsProvidersChanged provider=%d", providerToSelect ) + + if ( providerToSelect == KVtEngProviderCam1 ) + { + iObserver.SetSelectedCameraId( MVtEngMedia::EPrimaryCamera ); + } + else if ( providerToSelect == KVtEngProviderCam2 ) + { + // delete provider that became unavailable + iObserver.SetSelectedCameraId( MVtEngMedia::ESecondaryCamera ); + } + + // Check if SelectSource should be called + if ( !notifyAnswer && // for incoming calls automatic switch not allowed + ( iState == ELocNone || iState == ELocReady ) && + IsFlag( EFlagInitialized ) ) + { + __VTPRINT( DEBUG_MEDIA, " vsProvidersChanged ok to select" ) + // Allow switch if video disabled (still/blank active) + // and cam1 available. + ClearFlag( EFlagInitializeOnly ); + ClearFlag( EFlagCheckRevertToPrevious ); + if ( activeIsStillOrBlank && + providerToSelect == KVtEngProviderCam2 ) + { + SetFlag( EFlagInitializeOnly ); + } + else if ( activeIsBlankAndNewCam1 ) + { + iObserver.AutoEnableVideo(); + } + else if ( providerToSelect == KVtEngProviderNone ) + { + iObserver.AutoEnableVideo( EFalse ); + } + SetFlag( EFlagAutomaticSwitchCallback ); + TRAP( err, SelectSourceL( providerToSelect ) ); + ClearFlag( EFlagAutomaticSwitchCallback ); + + if ( err != KErrNone ) + { + __VTPRINT2( DEBUG_MEDIA, + " vsProvidersChanged,select failed=%d", err ) + if ( providerToSelect == KVtEngProviderCam1 && + iNumSupportedCameras > 1 ) + { + __VTPRINT( DEBUG_MEDIA, "LocVideo.vsProvidersChanged 2 2" ) + SetFlag( EFlagCamera2Available ); + ClearFlag( EFlagCamera1Available ); + TRAP( err, SelectSourceL( KVtEngProviderCam2 ) ); + } + else if ( providerToSelect == KVtEngProviderCam2 ) + { + __VTPRINT( DEBUG_MEDIA, + "LocVideo.vsProvidersChanged 2 still") + ClearFlag( EFlagCamera2Available ); + TRAP( err, SelectSourceL( KVtEngProviderImage ) ); + } + } + } + else + { + __VTPRINT( DEBUG_MEDIA, " vsProvidersChanged Not Changed" ) + if ( iState == ELocInitializing && + iSelectedProvider && + iSelectedProvider->iType != providerToSelect ) + { + SetFlag( EFlagCheckRevertToPrevious ); + } + } + + CVtEngStateManager* states = CVtEngUtility::StateManager(); + states->Update(); + + if ( IsFlag( EFlagCamera1Available ) || + IsFlag( EFlagCamera2Available ) ) + { + if ( notifyAnswer ) + { + __VTPRINT( DEBUG_MEDIA, + "LocVideo.vsProvidersChanged KVtEngSessionAnswerPossible") + CVtEngEventManager::NotifyEvent( KVtEngSessionAnswerPossible ); + } + else if ( !notifyAnswer && + // Don't notify before selection is done. + ( iState == ELocReady || + iState == ELocNone ) ) + { + __VTPRINT( DEBUG_MEDIA, + "LocVideo.vsProvidersChanged KVtEngSourceCapsChanged" ) + CVtEngEventManager::NotifyEvent( KVtEngSourceCapsChanged ); + } + } + else if ( !IsFlag( EFlagCamera1Available ) && + !IsFlag( EFlagCamera2Available ) ) + { + __VTPRINT( DEBUG_MEDIA, "LocVideo.vsProvidersChanged NO CAMS" ) + CVtEngEventManager::NotifyEvent( KVtEngSourceCapsChanged ); + } + } + else + { + __VTPRINT( DEBUG_MEDIA, + "LocVideo.vsProvidersChanged KVtEngResourceMemAllocFailure" ) + CVtEngEventManager::NotifyEvent( KVtEngResourceMemAllocFailure ); + } + __VTPRINTEXITR( "LocVid.vsProvidersChanged err=%d", err ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::SetViewFinderParameters +// Configures parameters for rendering via window server. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::SetViewFinderParameters( + const TVtEngRenderingOptions& aParams ) + { + __VTPRINTENTER( "LocVid.SetViewFinderParameters" ) + + // Before setting the params, stop VF + if( ViewFinderStarted() ) + { + StopViewFinder(); + } + + iOptions.iSize = aParams.iSize; + __VTPRINT2( DEBUG_MEDIA, + " width = %d", iOptions.iSize.iWidth ); + __VTPRINT2( DEBUG_MEDIA, + " height = %d", iOptions.iSize.iHeight ); + + iOptions.iObserver = aParams.iObserver; + iRenderingMethod = EWindowServer; + __VTPRINTEXIT( "LocVid.SetViewFinderParameters" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::SetViewFinderParameters +// Configures parameters for rendering with direct screen access. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::SetViewFinderParameters( + const TVtEngRenderingOptionsDSA& aDSA ) + { + __VTPRINTENTER( "LocVid.SetVFParamsDSA" ) + + // Before setting the params, stop VF + if( ViewFinderStarted() ) + { + StopViewFinder(); + } + + iRenderingMethod = EDSA; + iDsaOptions.iClipRect = aDSA.iClipRect; + iDsaOptions.iRect = aDSA.iRect; + iDsaOptions.iWindow = &aDSA.iWindow; + iDsaOptions.iWs = &aDSA.iWs; + iDsaOptions.iWsSD = &aDSA.iWsSD; + __VTPRINTEXIT( "LocVid.SetVFParamsDSA" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::SetViewFinderParameters +// Configures parameters for rendering with display posting. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::SetViewFinderParameters( + const TVtEngRenderingOptionsDP& aDP ) + { + __VTPRINTENTER( "LocVid.SetVFParamsDP" ) + + // Before setting the params, stop VF + if( ViewFinderStarted() ) + { + StopViewFinder(); + } + + iRenderingMethod = EDP; + iDsaOptions.iClipRect = aDP.iClipRect; + iDsaOptions.iRect = aDP.iRect; + iDsaOptions.iWindow = &aDP.iWindow; + iDsaOptions.iWs = &aDP.iWs; + iDsaOptions.iWsSD = &aDP.iWsSD; + __VTPRINTEXIT( "LocVid.SetVFParamsDP" ) + } + +// ----------------------------------------------------------------------------- +// 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. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::SetDefaultStillImageL() + { + __VTPRINTENTER( "LocVid.SetDefaultStillImageL" ) + + TProviderItem* item = NULL; + GetProviderByType( KVtEngProviderDefaultStillImage, item ); + if ( item ) + { + CVSDataProvider* provider = item->iProvider; + + if ( provider && item->iType == KVtEngProviderDefaultStillImage ) + { + if ( item->iInitialized ) + { + StopViewFinder(); + + TInt providerIndex = + ProviderIndex( KVtEngProviderDefaultStillImage ); + + TProviderItem* defaultStillProviderItem = + &( *iVideoProviders )[providerIndex]; + SwitchProvider( defaultStillProviderItem ); + } + else + { + InitializeProviderL( *item ); + iSelectedProvider = item; + } + } + } + __VTPRINTEXIT( "LocVid.SetDefaultStillImageL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::SetStillImageL +// Sets still image. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::SetStillImageL( TBool aSetAsActive ) + { + __VTPRINTENTER( "LocVid.SetStillImageL" ) + + CVtEngSettings& settings = CVtEngUtility::Settings(); + const CVtEngSettings::TVtEngVideoCallConfig& config = + settings.Config(); + const TBool stillImageValid( config.iVideo.iImageIsValid ); + if ( iState == ELocInitializing && stillImageValid ) + { + __VTPRINT( DEBUG_MEDIA, " setStill failed" ) + User::Leave( KErrNotReady ); + } + + TInt count( iVideoProviders->Count() ); + TBool done( EFalse ); + while ( count-- ) + { + TProviderItem& item = ( *iVideoProviders )[count]; + CVSDataProvider* provider = item.iProvider; + + if ( item.iType == KVtEngProviderImage ) + { + if ( provider && item.iInitialized ) + { + // If still image provider is active change to temp provider + if ( iActiveProvider && + ( iActiveProvider->iType == KVtEngProviderImage ) ) + { + __VTPRINT( DEBUG_MEDIA, "Act.prov. must be deleted" ) + StopViewFinder(); + iActiveProvider->iProviderState = ERefreshing; + TInt providerIndex = ProviderIndex( KVtEngProviderNone ); + TProviderItem* blankProviderItem = + &( *iVideoProviders )[providerIndex]; + SwitchProvider( blankProviderItem ); + __VTPRINTEXIT( "LocVideo.SetStillImageL" ) + return; + } + + //Only way to change image is first delete the provider + delete provider; + item.iProvider = NULL; + + // Create it again. + // If there is a provider info for still. + if ( iProviderInfoIndexStill != KErrNotFound ) + { + item.iProvider = iSourceController->CreateDataProviderL( + iProviderInfoIndexStill, + this, iSource ); + item.iType = KVtEngProviderImage; + item.iInitialized = EFalse; + } + } + // Do initialization only if valid image (still not + // cleared in settings). + if ( stillImageValid ) + { + InitializeProviderL( item ); + if ( aSetAsActive ) + { + iSelectedProvider = &item; + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + " selected provider set" ) + } + } + done = ETrue; + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + "LocVideo.SetStillImageL ok" ) + } + } + if ( !done ) + { + __VTPRINT( DEBUG_MEDIA, "LocVideo.SetStillImageL fail") + User::Leave( KErrGeneral ); + } + __VTPRINTEXIT( "LocVid.SetStillImageL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::InitializeL +// Initializes default blank provider. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::InitializeL() + { + __VTPRINTENTER( "LocVid.InitializeL" ) + const TInt index( ProviderIndex( KVtEngProviderNone ) ); + TProviderItem* item = &(*iVideoProviders)[index]; + if ( iActiveProvider && + iActiveProvider->iType == KVtEngProviderImage ) + { + // Blank provider is set to active only + // if there is not valid still image. + SetFlag( EFlagInitializeOnly ); + iSelectedProvider = item; + } + else + { + iActiveProvider = item; + } + InitializeProviderL( *item ); + SetFlag( EFlagSignalSourceSelection ); + SetFlag( EFlagInitialized ); + __VTPRINTEXIT( "LocVid.InitializeL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::SelectSourceL +// Selects source. +// ----------------------------------------------------------------------------- +// +TBool CVtEngLocalVideo::SelectSourceL( TVtEngProviderType aSource ) + { + __VTPRINTENTER( "LocVid.SelectSourceL" ) + + __VTPRINT2( DEBUG_MEDIA, " source=%d", aSource ) + + if ( iDelayedSelect.IsDelayedSelectPending() && + ( aSource != KVtEngProviderShareImage ) && + ( aSource == KVtEngProviderCam1 || + aSource == KVtEngProviderCam2 || + aSource == KVtEngProviderImage ) ) + { + TVtEngProviderType delayedSelect( iDelayedSelect.DelayedSelectTarget() ); + if ( delayedSelect != KVtEngProviderNone && + delayedSelect != KVtEngProviderImage ) + { + aSource = delayedSelect; + } + } + + if( IsProviderWaiting( aSource ) ) + { + // If waiting for provide switch and a provider initialization + // don't allow selection. + __VTPRINT( DEBUG_MEDIA, "LocVideo.SelectSourceL already waiting" ) + User::Leave( KErrNotReady ); + } + + // To be selected source is already active + if ( IsActiveProvider( aSource ) ) + { + Cancel(); + TRequestStatus* status = &iStatus; + SetActive(); + User::RequestComplete( status, KVtEngAlreadyActive ); + SetFlag( EFlagSignalSourceSelection ); + __VTPRINT2( DEBUG_MEDIA, "LocVideo.SelectSourceL start AO=%d", + KVtEngAlreadyActive ) + if ( iActiveProvider ) + { + __VTPRINT2( DEBUG_MEDIA, "LocVideo. activeProv type=%d", + iActiveProvider->iType ) + } + // In case there were errors, NULL the selected provider + // to be able to initialize it when needed + if( iSelectedProvider ) + { + if( iSelectedProvider->iErrorCode ) + { + iSelectedProvider->iInitialized = EFalse; + iSelectedProvider->iProviderState = + (CVtEngLocalVideo::TProviderState) + iSelectedProvider->iErrorCode; + iSelectedProvider = NULL; + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, " selprovider nulled" ) + } + } + // Not actually switching but virtually doing it because + // async callback will be made. + __VTPRINTEXITR( "LocVid.SelectSourceL %d", ETrue ) + return ETrue; + } + __VTPRINT2( DEBUG_MEDIA, "LocVideo.Selectsource iState=%d", iState ) + if ( iState == ELocInitializing && + aSource == KVtEngProviderImage && + iActiveProvider && + iActiveProvider->iType != KVtEngProviderNone ) + { + __VTPRINT( DEBUG_MEDIA, + "LocVideo.SelectSource initialization pending" ) + User::Leave( KErrNotReady ); + } + // We have switch pending + else if ( iState == ELocSwichingProvider ) + { + __VTPRINT( DEBUG_MEDIA, + "LocVideo.SelectSource switching -> set delayed select" ) + iDelayedSelect.NotifyDelayedSelect( aSource ); + __VTPRINTEXITR( "LocVid.SelectSourceL %d", ETrue ) + return ETrue; + } + + TBool initialized( EFalse ); + TProviderItem item; + TInt providerIndex( GetProviderByType( aSource, item ) ); + + if ( providerIndex != KErrNotFound ) + { + // requested provider found, set initialization status + __VTPRINT2( DEBUG_MEDIA, "LocVideo.SelectSource index=%d", providerIndex ) + initialized = item.iInitialized; + } + else + { // requested provider not found + __VTPRINT( DEBUG_MEDIA, "LocVideo.SelectSource create provider" ) + // Try to create provider + TInt index = KErrNotFound; + switch ( aSource ) + { + case KVtEngProviderCam2: + index = iProviderInfoIndexCam2; + break; + case KVtEngProviderNone: + case KVtEngProviderImage: + case KVtEngProviderDefaultStillImage: + // Image sharing + case KVtEngProviderShareImage: + index = iProviderInfoIndexStill; + break; + case KVtEngProviderCam1: + index = iProviderInfoIndexCam1; + default: + break; + } + + __VTPRINT2( DEBUG_MEDIA, + "LocVideo.SelectSource create provider ID=%d", index ) + if ( index != KErrNotFound ) + { + TProviderItem newItem; + newItem.iProvider = + iSourceController->CreateDataProviderL( + index, this, iSource ); + newItem.iType = aSource; + CleanupStack::PushL( newItem.iProvider ); + iVideoProviders->AppendL( newItem ); + CleanupStack::Pop(); + providerIndex = iVideoProviders->Count() - 1; + __VTPRINT2( DEBUG_MEDIA | DEBUG_DETAIL, + "LocVideo.SelectSource create provider ok=%d", + newItem.iProvider != NULL ) + } + } + + TBool initOrSwitch = EFalse; + + // Initialize provider + if ( providerIndex != KErrNotFound && !initialized ) + { + if ( iActiveProvider->iProviderState != EPermanent ) + { + // Active provider must be destroyed and new one initialized + __VTPRINT( DEBUG_MEDIA, "LocVideo.SelectSource del Act.prov" ) + (*iVideoProviders)[providerIndex].iProviderState = EWaiting; + iActiveProvider->iProviderState = EFading; + StopViewFinder(); + providerIndex = ProviderIndex( KVtEngProviderNone ); + __VTPRINT2( DEBUG_MEDIA, "LocVideo.SelectSource index for none=%d", + providerIndex ) + } + else + { + __VTPRINT( DEBUG_MEDIA, "LocVideo.SelectSource do init" ) + UninitializeProviderL(); + TProviderItem& initItem = ( *iVideoProviders )[providerIndex]; + InitializeProviderL( initItem ); + // This item is stored, make it initialized only when callback + // received. + iSelectedProvider = &initItem; + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, " selected provider set" ) + initOrSwitch = InitializingOrSwitching(); + __VTPRINTEXITR( "LocVid.SelectSourceL %d", initOrSwitch ) + return initOrSwitch; + } + } + + // Switch provider + if ( providerIndex != KErrNotFound ) + { + if ( !IsFlag( EFlagInitializeOnly ) ) + { + __VTPRINT( DEBUG_MEDIA, "LocVideo.SelectSource ready for switch") + StopViewFinder(); + TProviderItem* switchItem = &(*iVideoProviders)[providerIndex]; + __VTPRINT2( DEBUG_MEDIA, + "LocVideo.SelectSource switchItem %d", switchItem->iType ) + SwitchProvider( switchItem ); + } + else if ( initialized && IsFlag( EFlagInitializeOnly ) ) + { + __VTPRINT2( DEBUG_MEDIA, + "LocVideo.SelectSource already initialized start AO %d", + KVtEngAlreadySelected ) + TProviderItem* switchItem = &( *iVideoProviders )[providerIndex]; + iActiveProvider = switchItem; + Cancel(); + TRequestStatus* status = &iStatus; + SetActive(); + User::RequestComplete( status, KVtEngAlreadySelected ); + } + else + { + __VTPRINT3( DEBUG_MEDIA, " initialized=%d,flags=%d", + initialized, iFlags ) + } + } + + // Error + if ( iActiveProvider == NULL ) + { + __VTPRINT( DEBUG_MEDIA, "LocVideo.SelectSource leave" ) + User::Leave( KErrNotFound ); + } + + initOrSwitch = InitializingOrSwitching(); + __VTPRINTEXITR( "LocVid.SelectSourceL %d", initOrSwitch ) + return initOrSwitch; + } + +// ---------------------------------------------------------------------------- +// CVtEngLocalVideo::InitializeProviderL +// Initializes a provider. +// ---------------------------------------------------------------------------- +// +void CVtEngLocalVideo::InitializeProviderL( + TProviderItem& aProviderItem ) + { + __VTPRINTENTER( "LocVid.InitializeProviderL" ) + + __VTPRINT2( DEBUG_MEDIA, "LocVideo.InitProv type=%d", aProviderItem.iType ) + + if ( iInitializingProvider ) + { + __VTPRINT( DEBUG_MEDIA, + "LocVideo.InitProv ERROR, already initializing" ) + User::Leave( KErrNotReady ); + } + + iInitializingProvider = &aProviderItem; + + CVtEngSettings& settings = CVtEngUtility::Settings(); + const CVtEngSettings::TVtEngVideoCallConfig& config = + settings.Config(); + TPckgBuf< TVSStillImageDataProviderParams > pckg; + + __VTPRINT2( DEBUG_MEDIA, "LocVideo.InitProv type=%d", aProviderItem.iType ) + CVSDataProvider* provider = aProviderItem.iProvider; + if ( provider == NULL ) + { + aProviderItem.iInitialized = EFalse; + aProviderItem.iProvider = CreateDataProviderL( aProviderItem.iType ); + provider = aProviderItem.iProvider; + } + else if ( aProviderItem.iInitialized ) + { + __VTPRINT2( DEBUG_MEDIA, "LocVideo.InitProv AO start %d", KErrNone ) + Cancel(); + TRequestStatus* status = &iStatus; + SetActive(); + User::RequestComplete( status, KErrNone ); + __VTPRINTEXIT( "LocVid.InitializeProviderL" ) + return; + } + User::LeaveIfNull( provider ); + switch ( aProviderItem.iType ) + { + case KVtEngProviderCam1: + case KVtEngProviderCam2: + provider->InitializeL( KNullDesC8 ); + iState = ELocInitializing; + __VTPRINT( DEBUG_MEDIA, " STATE TO INITIALIZING" ) + __VTPRINT2( DEBUG_MEDIA, "LocVideo.InitProv type=%d", + aProviderItem.iType ) + break; + case KVtEngProviderNone: + // Blank provider. + pckg().iInitialize = + TVSStillImageDataProviderParams::EInitializeAsBlankImage; + provider->InitializeL( pckg ); + iState = ELocInitializing; + __VTPRINT( DEBUG_MEDIA, " STATE TO INITIALIZING" ) + __VTPRINT2( DEBUG_MEDIA, "LocVideo.InitProv type=%d", + aProviderItem.iType ) + break; + case KVtEngProviderImage: + { + if ( config.iVideo.iImageIsValid ) + { + pckg().iInitialize = + TVSStillImageDataProviderParams::EInitializeFromGeneralSettings; + provider->InitializeL( pckg ); + iState = ELocInitializing; + __VTPRINT( DEBUG_MEDIA, " STATE TO INITIALIZING" ) + __VTPRINT( DEBUG_MEDIA, "LocVideo.InitProv Still image") + } + else + { + User::Leave( KErrPathNotFound ); + } + } + break; + case KVtEngProviderDefaultStillImage: + pckg().iInitialize = + TVSStillImageDataProviderParams::EInitializeAsDefaultStillImage; + + provider->InitializeL( pckg ); + iState = ELocInitializing; + __VTPRINT( DEBUG_MEDIA, " STATE TO INITIALIZING" ) + __VTPRINT2( DEBUG_MEDIA, "LocVideo.InitProv type=%d", + aProviderItem.iType ) + break; + default: + Panic( EVtEngPanicNoVideoProvider ); + break; + } + //aProviderItem.iInitialized = ETrue; + __VTPRINTEXIT( "LocVid.InitializeProviderL" ) + } + +// ---------------------------------------------------------------------------- +// CVtEngLocalVideo::InitializeShareProviderL +// Initializes a provider that is used for sharing. +// ---------------------------------------------------------------------------- +// +void CVtEngLocalVideo::InitializeShareProviderL( + TProviderItem& aProviderItem, const TDesC8& aParams ) + { + __VTPRINTENTER( "LocVid.InitializeShareProviderL" ) + aProviderItem.iProvider->InitializeL( aParams ); + aProviderItem.iInitialized = ETrue; + iState = ELocInitializing; + SetFlag( EFlagSignalSourceSelection | EFlagInitializeOnly ); + __VTPRINTEXIT( "LocVid.InitializeShareProviderL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::ReCreateProviderL +// ----------------------------------------------------------------------------- +void CVtEngLocalVideo::ReCreateProviderL( + TProviderItem& aProviderItem, const TVtEngProviderType aType ) + { + __VTPRINTENTER( "LocVid.ReCreateProviderL" ) + + TInt index( KErrNotFound ); + + switch ( aType ) + { + case KVtEngProviderShareImage: + index = iProviderInfoIndexStill; + break; + + default: + User::Leave( KErrNotSupported ); + } + + // Delete old instance + DeleteProvider( aProviderItem ); + + // Create new instance + aProviderItem.iProvider = iSourceController->CreateDataProviderL( + index, this, iSource ); + aProviderItem.iType = aType; + + __VTPRINTEXIT( "LocVid.ReCreateProviderL" ) + } + +// ---------------------------------------------------------------------------- +// CVtEngLocalVideo::CameraIdToType +// Camera ID to type mapping. +// ---------------------------------------------------------------------------- +// +CVtEngLocalVideo::TVtEngProviderType CVtEngLocalVideo::CameraIdToType( + MVtEngMedia::TCameraId aId ) + { + TVtEngProviderType type( KVtEngProviderCam2 ); + switch ( aId ) + { + case MVtEngMedia::EPrimaryCamera: + type = KVtEngProviderCam1; + break; + case MVtEngMedia::ESecondaryCamera: + type = KVtEngProviderCam2; + break; + default: + type = KVtEngProviderNone; + break; + } + return type; + } + +// ---------------------------------------------------------------------------- +// CVtEngLocalVideo::RunL +// CActive heir, acts according to status. +// ---------------------------------------------------------------------------- +// +void CVtEngLocalVideo::RunL() + { + __VTPRINTENTER( "LocVid.RunL" ) + + const TInt status( iStatus.Int() ); + TVtEngProviderType providerType = KVtEngProviderNone; + __VTPRINT2( DEBUG_MEDIA, "LocVideo.RunL %d", status ) + switch ( status ) + { + case KVtEngAlreadySelected: + SetFlag( EFlagSignalSourceSelection ); + vsProviderReady(); + break; + case KVtEngAlreadyActive: + TRAP_IGNORE( + iObserver.HandleLocalVideoOperationCompleteL( KErrNone ) ); + break; + case KErrNone: + vsProviderSwitchDone( NULL ); + UpdateState(); + break; + // Camera has been lost during VT + case KVsErrCameraNoLongerReserved: + __VTPRINT2( DEBUG_MEDIA, "LocVideo.status =%d", + status ) + //delete provider here and null pointer + if ( iSelectedProvider ) + { + DeleteProvider( *iSelectedProvider ); + iSelectedProvider = NULL; + } + + // Check if still is in use + providerType = KVtEngProviderImage; + GetHighestSelectableProvider( providerType ); + + __VTPRINT2( DEBUG_MEDIA, "LocVideo.providerType=%d", + providerType ) + + iObserver.AutoEnableVideo( EFalse ); + SetFlag( EFlagAutomaticSwitchCallback ); + TRAPD( err, SelectSourceL( providerType ) ); + ClearFlag( EFlagAutomaticSwitchCallback ); + + if ( err != KErrNone ) + { + TRAP( err, iObserver.HandleLocalVideoOperationCompleteL( err) ); + } + break; + default: + // error + { + switch( iSelectedProvider->iType ) + { + case KVtEngProviderCam1: + ClearFlag( EFlagCamera1Available ); + break; + case KVtEngProviderCam2: + ClearFlag( EFlagCamera2Available ); + break; + default: + break; + } + DeleteProvider( *iSelectedProvider ); + iSelectedProvider = NULL; + MVtEngMedia::TCameraId currentCam( MVtEngMedia::EPrimaryCamera ); + iObserver.GetCurrentCameraId( currentCam ); + TVtEngProviderType providerType( CameraIdToType( currentCam ) ); + GetHighestSelectableProvider( providerType ); + TRAPD( err, SelectSourceL( providerType ) ); + if ( err != KErrNone ) + { + TRAP( err, iObserver.HandleLocalVideoOperationCompleteL( err) ); + } + } + } + __VTPRINTEXIT( "LocVid.RunL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::IsActiveProvider +// Returns ETrue if given provider is already active. +// ----------------------------------------------------------------------------- +// +TBool CVtEngLocalVideo::IsActiveProvider( TVtEngProviderType aType ) const + { + __VTPRINTENTER( "LocVid.IsActiveProvider" ) + const TBool active( + ( iActiveProvider && iActiveProvider->iType == aType ) || + ( iSelectedProvider && iSelectedProvider->iType == aType ) ); + __VTPRINTEXITR( "LocVid.IsActiveProvider %d", active ) + return active; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::DoCancel +// Does nothing. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::DoCancel() + { + __VTPRINTENTER( "LocVid.DoCancel" ) + __VTPRINTEXIT( "LocVid.DoCancel" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::ActiveProvider +// Returns active provider. +// ----------------------------------------------------------------------------- +// +CVtEngLocalVideo::TVtEngProviderType CVtEngLocalVideo::ActiveProvider() const + { + if ( iActiveProvider ) + { + return iActiveProvider->iType; + } + return KVtEngProviderNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::StartViewFinderIfWasStartedL +// View finder image can be set. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::StartViewFinderIfWasStartedL() + { + __VTPRINTENTER( "LocVid.StartViewFinderIfWasStartedL" ) + if ( IsFlag( EFlagUIForeground ) && IsFlag( EFlagVFEnabled ) && + iState == ELocReady ) + { + StartViewFinderL(); + } + __VTPRINTEXIT( "LocVid.StartViewFinderIfWasStartedL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::StartViewFinderL +// Starts view finder. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::StartViewFinderL( TBool aClientRequest ) + { + __VTPRINTENTER( "LocVid.StartViewFinderL" ) + __ASSERT_ALWAYS( iVideoProviders->Count(), + Panic ( EVtEngPanicNoVideoProvider ) ); + + if ( aClientRequest ) + { + SetFlag( EFlagVFEnabled ); + } + if ( iRenderingMethod == EUnspecified || !iActiveProvider ) + { + __VTPRINT( DEBUG_MEDIA, "LocVideo.startVF error") + User::Leave( KErrNotReady ); + } + CVSDataProvider* provider = iActiveProvider->iProvider; + if ( !provider ) + { + __VTPRINT( DEBUG_MEDIA, "LocVideo.startVF error no provider") + User::Leave( KErrNotReady ); + } + else if ( provider->ViewFinderActive() ) + { + __VTPRINT( DEBUG_MEDIA, "LocVideo.startVF already started") + iViewFinderState = ( iRenderingMethod == EWindowServer ) ? + EVFReceivingBitmaps : EVFRenderingDsa; + __VTPRINTEXIT( "LocVid.StartViewFinderL" ) + return; + } + else if ( !IsFlag( EFlagInitialized ) ) + { + __VTPRINT( DEBUG_MEDIA, + "LocVideo.startVF not initialized") + __VTPRINTEXIT( "LocVid.StartViewFinderL" ) + return; + } + else if ( iState != ELocReady ) + { + __VTPRINT2( DEBUG_MEDIA | DEBUG_RETURN, + "LocVideo.startVF incorrect iState=%d", iState ) + } + else + { + // Lint requires this one + __VTPRINT( DEBUG_MEDIA, + "LocVideo.startVF unsupported clause" ) + } + + CheckOthersStopped( *provider ); + if ( iRenderingMethod == EWindowServer ) + { + TSize size( iOptions.iSize ); + provider->StartViewFinderBitmapsL( size ); + iViewFinderState = EVFReceivingBitmaps; + __VTPRINT( DEBUG_MEDIA | DEBUG_RETURN, " started" ) + } + else + { + provider->StartViewFinderDirectL( + *(iDsaOptions.iWs), + *(iDsaOptions.iWsSD), + *(iDsaOptions.iWindow), + iDsaOptions.iRect, + iDsaOptions.iClipRect ); + iViewFinderState = EVFRenderingDsa; + } + + if( iActiveProvider->iType == CVtEngLocalVideo::KVtEngProviderCam1 && + !provider->ViewFinderMirror() ) + { + provider->SetViewFinderMirrorL( ETrue ); + } + + __VTPRINTEXIT( "LocVid.StartViewFinderL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::StopViewFinder +// Stops view finder. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::StopViewFinder( TBool aClientRequest ) + { + __VTPRINTENTER( "LocVid.StopViewFinder" ) + if ( aClientRequest ) + { + __VTPRINT( DEBUG_MEDIA, "LocVideo.stopVF clearing EFlagVFEnabled" ) + ClearFlag( EFlagVFEnabled ); + } + if ( iActiveProvider && + iViewFinderState != EVFNone && + 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 ) || + IsFlag( EFlagUIBackground ) ) + { + // UI needs to be notified if stop done due to automatic + // source switch (from vsProvidersChanged). + ClearFlag( EFlagAutomaticSwitchCallback ); + CVtEngEventManager::NotifyEvent( KVtEngViewFinderStopped ); + __VTPRINT( DEBUG_MEDIA, "LocVideo.stopVF Notified" ) + } + } + iViewFinderState = EVFNone; + __VTPRINTEXIT( "LocVid.StopViewFinder" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::FreezeL +// Freezes provider. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::FreezeL() + { + __VTPRINTENTER( "LocVid.FreezeL" ) + if( OkToFreeze() ) + { + iActiveProvider->iProvider->FreezeL(); + SetFlag( EFlagFrozen ); + } + __VTPRINTEXIT( "LocVid.FreezeL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::UnfreezeL +// Unfreezes provider. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::UnfreezeL() + { + __VTPRINTENTER( "LocVid.UnfreezeL" ) + if( OkToUnfreeze() ) + { + if ( !iLayoutChangeHandler.UnfreezeL() ) + { + iActiveProvider->iProvider->UnfreezeL(); + if ( iDelayedSelect.IsDelayedSelectPending() ) + { + TVtEngProviderType type( iDelayedSelect.DelayedSelectTarget() ); + __VTPRINT2( DEBUG_MEDIA, + "LocVideo.UnfreezeL delayed switch to %d", type ) + SelectSourceL( type ); + } + else + { + CompleteOperation( KErrNone ); + } + } + ClearFlag( EFlagFrozen ); + } + __VTPRINTEXIT( "LocVid.UnfreezeL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CheckOthersStopped +// Stops view finder of other providers than the one given as parameter. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::CheckOthersStopped( const CVSDataProvider& aProvider ) + { + __VTPRINTENTER( "LocVid.CheckOthersStopped" ) + TInt count( iVideoProviders->Count() ); + while ( count-- ) + { + TProviderItem& item = ( *iVideoProviders )[count]; + if ( item.iProvider && + item.iProvider != &aProvider && + item.iProvider->ViewFinderActive() ) + { + item.iProvider->StopViewFinder(); + __VTPRINT( DEBUG_MEDIA | DEBUG_RETURN, "LocVideo.OtherStop" ) + } + } + __VTPRINTEXIT( "LocVid.CheckOthersStopped" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::Source +// Returns video source. +// ----------------------------------------------------------------------------- +// +MVTVideoSource* CVtEngLocalVideo::Source() const + { + return iSource; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::AudioSource +// Returns audio source. +// ----------------------------------------------------------------------------- +// +MVTAudioSource* CVtEngLocalVideo::AudioSource() const + { + return iAudioSource; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::GetMediaState +// Returns media state. +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo::GetMediaState( TInt& aActiveMedia ) + { + aActiveMedia = 0; + if ( !IsFlag( EFlagAudioMuted ) ) + { + aActiveMedia |= MVtEngMedia::EMediaAudio; + // Check if the thing is muted + } + + if ( iActiveProvider ) + { + __VTPRINT2( DEBUG_MEDIA, "LocVideo.GetMediaState provider type=%d", + iActiveProvider->iType ) + switch ( iActiveProvider->iType ) + { + case KVtEngProviderCam1: + case KVtEngProviderCam2: + case KVtEngProviderImage: + case KVtEngProviderShareImage: + aActiveMedia |= MVtEngMedia::EMediaVideo; + break; + default: + break; + } + } + __VTPRINT2( DEBUG_MEDIA | DEBUG_RETURN, + "LocVideo.GetMediaState media state=%d", aActiveMedia ) + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::GetMediaSource +// Returns media source. +// ----------------------------------------------------------------------------- +// +MVtEngMedia::TMediaSource CVtEngLocalVideo::GetMediaSource() + { + MVtEngMedia::TMediaSource source( MVtEngMedia::EMediaNone ); + if ( iActiveProvider ) + { + switch ( iActiveProvider->iType ) + { + case KVtEngProviderCam1: + case KVtEngProviderCam2: + source = MVtEngMedia::EMediaCamera; + break; + case KVtEngProviderShareImage: + source = MVtEngMedia::EMediaShare; + break; + case KVtEngProviderImage: + case KVtEngProviderDefaultStillImage: + source = MVtEngMedia::EMediaStillImage; + break; + default: + source = MVtEngMedia::EMediaNone; + break; + } + } + __VTPRINT2( DEBUG_MEDIA, "LocVideo.GetMediaSource src=%d", (TInt) source ) + return source; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::GetSourceCaps +// Returns capability of providers . +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo::GetSourceCaps( TInt& aCaps ) + { + aCaps = 0; + TInt count( iVideoProviders->Count() ); + __VTPRINT2( DEBUG_MEDIA, "LocVideo.GetSourceCaps count=%d", count ) + while ( count-- ) + { + switch ( iVideoProviders->At(count).iType ) + { + case KVtEngProviderCam1: + __VTPRINT( DEBUG_MEDIA, + "LocVideo.GetSourceCaps cam1" ) + if ( IsFlag( EFlagCamera1Available ) ) + { + __VTPRINT( DEBUG_MEDIA, + "LocVideo.GetSourceCaps cam1 flagged" ) + aCaps |= MVtEngMedia::ESourceCapsPrimaryCamera; + } + break; + case KVtEngProviderCam2: + __VTPRINT( DEBUG_MEDIA, "LocVideo.GetSourceCaps cam2" ) + if ( IsFlag( EFlagCamera2Available ) ) + { + __VTPRINT( DEBUG_MEDIA, + "LocVideo.GetSourceCaps cam2 flagged" ) + aCaps |= MVtEngMedia::ESourceCapsSecondaryCamera; + } + break; + case KVtEngProviderImage: + { + __VTPRINT( DEBUG_MEDIA, + "LocVideo.GetSourceCaps image" ) + // Make sure that image is valid + CVtEngSettings& settings = CVtEngUtility::Settings(); + const CVtEngSettings::TVtEngVideoCallConfig& config = + settings.Config(); + if( config.iVideo.iImageIsValid ) + { + aCaps |= MVtEngMedia::ESourceCapsStillImage; + } + } + break; + default: + break; + } + } + __VTPRINT2( DEBUG_MEDIA, "LocVideo.GetSourceCaps caps=%d", aCaps ) + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::InitializeOnly +// Sets boolean to indicate if the provider is to be initialized only. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::InitializeOnly( TBool aInitOnly ) + { + InitializeOnlyEx( GetMediaSource() != MVtEngMedia::EMediaCamera && + aInitOnly ); + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::InitializeOnlyEx +// Sets boolean to indicate if the provider is to be initialized only. Does +// not check current media source. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::InitializeOnlyEx( TBool aInitOnly ) + { + SetFlag( EFlagSignalSourceSelection ); + ClearFlag( EFlagInitializeOnly ); + if ( aInitOnly ) + { + SetFlag( EFlagInitializeOnly ); + } +#ifdef VTDEBUG + if ( IsFlag( EFlagInitializeOnly ) ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, " initOnly SET" ) + } + else + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, " initOnly CLEARED" ) + } +#endif + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::GetProviderByType +// Return provider of particular type. +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo::GetProviderByType( + TVtEngProviderType aType, + TProviderItem& aItem ) + { + TInt ret( KErrNotFound ); + TInt count( iVideoProviders->Count() ); + while ( count-- ) + { + if ( ( *iVideoProviders )[count].iType == aType ) + { + aItem = ( *iVideoProviders )[count]; + ret = count; + count = 0; + } + } + __VTPRINT2( DEBUG_MEDIA, "LocVideo.GetProviderByType idx=%d", ret ) + return ret; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::GetProviderByType +// Return provider of particular type. +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo::GetProviderByType( + TVtEngProviderType aType, + TProviderItem*& aItem ) + { + TInt ret( KErrNotFound ); + TInt count( iVideoProviders->Count() ); + while ( count-- ) + { + if ( ( *iVideoProviders )[count].iType == aType ) + { + aItem = &( *iVideoProviders )[count]; + ret = count; + count = 0; + } + } + __VTPRINT2( DEBUG_MEDIA, "LocVideo.GetProviderByType* idx=%d", ret ) + return ret; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::GetProviderByInstance +// Return provider with particular provider instance. +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo::GetProviderByInstance( + const CVSDataProvider* aInstance, + TProviderItem*& aItem ) const + { + TInt indexI( ProviderIndexByInstance( aInstance ) ); + if ( indexI != KErrNotFound ) + { + aItem = &( *iVideoProviders )[ indexI ]; + } + else + { + aItem = NULL; + } + __VTPRINT2( DEBUG_MEDIA, "LocVideo.GetProviderByType* idx=%d", indexI ) + return indexI; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::ProviderIndex +// Returns provider index by type. +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo::ProviderIndex( TVtEngProviderType aType ) const + { + for( TInt count = iVideoProviders->Count() - 1; count >= 0; count-- ) + { + if ( ( *iVideoProviders )[ count ].iType == aType ) + { + return count; + } + } + return KErrNotFound; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::ProviderIndexByState +// Gets a provider index by state. +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo::ProviderIndexByState( TProviderState aState ) const + { + for( TInt count = iVideoProviders->Count() - 1; count >= 0; count-- ) + { + if ( ( *iVideoProviders )[ count ].iProviderState == aState ) + { + return count; + } + } + return KErrNotFound; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::ProviderIndexByInstance +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo::ProviderIndexByInstance( + const CVSDataProvider* aInstance) const + { + for( TInt count = iVideoProviders->Count() - 1; count >= 0; count-- ) + { + if ( ( *iVideoProviders )[ count ].iProvider == aInstance ) + { + return count; + } + } + return KErrNotFound; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CreateDataProviderL +// Creates VideoSource provider by type. +// ----------------------------------------------------------------------------- +// +CVSDataProvider* CVtEngLocalVideo::CreateDataProviderL( + TVtEngProviderType aType ) + { + __VTPRINTENTER( "LocVid.CreateDataProviderL" ) + __VTPRINT2( DEBUG_MEDIA, " provider type=%d", aType ) + TInt index = KErrNotFound; + switch ( aType ) + { + case KVtEngProviderNone: + case KVtEngProviderImage: + case KVtEngProviderShareImage: + case KVtEngProviderDefaultStillImage: + __VTPRINT( DEBUG_MEDIA, "LocVideo.CreateDataProviderL Still" ) + index = iProviderInfoIndexStill; + break; + case KVtEngProviderCam1: + __VTPRINT( DEBUG_MEDIA, "LocVideo.CreateDataProviderL Cam1" ) + index = iProviderInfoIndexCam1; + break; + case KVtEngProviderCam2: + __VTPRINT( DEBUG_MEDIA, "LocVideo.CreateDataProviderL Cam2" ) + index = iProviderInfoIndexCam2; + break; + default: + __VTPRINT( DEBUG_MEDIA, "LocVideo.CreateDataProviderL Mobile" ) + break; + } + + CVSDataProvider* provider = NULL; + if ( index != KErrNotFound ) + { + __VTPRINT( DEBUG_MEDIA, "LocVideo.CreateDataProviderL provider is" ) + provider = + iSourceController->CreateDataProviderL( + index, this, iSource ); + } + + __VTPRINT2( DEBUG_MEDIA, " provider created=%d", + ( TInt ) ( provider != NULL ) ) + __VTPRINTEXIT( "LocVid.CreateDataProviderL" ) + return provider; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CreateBlankProvider +// Creates blank provider. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::CreateBlankProviderL( const TInt aIndex ) + { + __VTPRINTENTER( "LocVid.CreateBlankProviderL" ) + __VTPRINT2( DEBUG_MEDIA, "LocVideo.CreateBlankProviderL idx=%d", aIndex ) + CVSDataProvider* provider = NULL; + TRAP_IGNORE( provider = iSourceController->CreateDataProviderL( + aIndex, this, iSource ) ); + CleanupStack::PushL( provider ); + TProviderItem item; + item.iProvider = provider; + item.iType = KVtEngProviderNone; + item.iInitialized = EFalse; + item.iProviderState = EPermanent; + iVideoProviders->AppendL( item ); + CleanupStack::Pop(); + __VTPRINTEXIT( "LocVid.CreateBlankProviderL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CreateDefaultStillImageProviderL +// Creates default still image provider. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::CreateDefaultStillImageProviderL( const TInt aIndex ) + { + __VTPRINTENTER( "LocVid.CreateDefaultStillImageProviderL" ) + __VTPRINT2( DEBUG_MEDIA, "LocVideo.CreateDefaultStillImageProviderL idx=%d", aIndex ) + CVSDataProvider* provider = NULL; + TRAP_IGNORE( provider = iSourceController->CreateDataProviderL( + aIndex, this, iSource ) ); + CleanupStack::PushL( provider ); + TProviderItem item; + item.iProvider = provider; + item.iType = KVtEngProviderDefaultStillImage; + item.iInitialized = EFalse; + item.iProviderState = EPermanent; + iVideoProviders->AppendL( item ); + CleanupStack::Pop(); + __VTPRINTEXIT( "LocVid.CreateDefaultStillImageProviderL" ) + } + + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::UpdateAvailableProvidersL +// Updates current providers and their information. +// ----------------------------------------------------------------------------- +// +CVtEngLocalVideo::TVtEngProviderType + CVtEngLocalVideo::UpdateAvailableProvidersL() + { + __VTPRINTENTER( "LocVid.UpdateAvailableProvidersL" ) + TVtEngProviderType type( KVtEngProviderNone ); + TInt count( iSourceController->ProvidersAvailable() ); + iNumSupportedCameras = count - 1; + TVSDataProviderInfo providerInfo; + TBool primaryAvailable( EFalse ); + TBool secondaryAvailable( EFalse ); + TBool mobileAvailable( EFalse ); + TInt indexMobile( KErrNotFound ); + ClearFlag( EFlagCamera1Available ); + ClearFlag( EFlagCamera2Available ); + ResetIndices(); + while ( count-- ) + { + iSourceController->ProviderInfoL( count, providerInfo ); + if ( providerInfo.iOrientation == TCameraInfo::EOrientationInwards || + // treat outwards camera as primary when only 1 cam in the system + ( providerInfo.iOrientation == TCameraInfo::EOrientationOutwards && + iNumSupportedCameras == 1 ) ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "LocVideo.UAP inw" ) + type = KVtEngProviderCam1; + primaryAvailable = ETrue; + SetFlag( EFlagCamera1Available ); + iProviderInfoIndexCam1 = count; + } + else if ( + providerInfo.iOrientation == TCameraInfo::EOrientationOutwards ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "LocVideo.UAP outw" ) + secondaryAvailable = ETrue; + SetFlag( EFlagCamera2Available ); + iProviderInfoIndexCam2 = count; + } + else if ( providerInfo.iOrientation == TCameraInfo::EOrientationMobile ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "LocVideo.UAP mobile" ) + mobileAvailable = ETrue; + indexMobile = count; + } + else if ( providerInfo.iOrientation == TCameraInfo::EOrientationUnknown ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "LocVideo.UAP still" ) + CVtEngSettings& settings = CVtEngUtility::Settings(); + const CVtEngSettings::TVtEngVideoCallConfig& config = + settings.Config(); + if ( config.iVideo.iImageIsValid ) + { + iProviderInfoIndexStill = count; + } + } + } + if ( !primaryAvailable && mobileAvailable ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "LocVideo.UAP 1 upd" ) + type = KVtEngProviderCam1; + iProviderInfoIndexCam1 = indexMobile; + primaryAvailable = ETrue; + SetFlag( EFlagCamera1Available ); + } + else if ( primaryAvailable && mobileAvailable ) + { + // No 1, 2 and mobile. + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "LocVideo.UAP 2 upd" ) + DeleteProvider( KVtEngProviderCam2 ); + secondaryAvailable = ETrue; + iProviderInfoIndexCam2 = indexMobile; + SetFlag( EFlagCamera2Available ); + } + else if ( !primaryAvailable && secondaryAvailable ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "LocVideo.UAP !1 & 2" ) + type = KVtEngProviderCam2; + } + else if ( type == KVtEngProviderNone ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "LocVideo.UAP none" ) + CVtEngSettings& settings = CVtEngUtility::Settings(); + const CVtEngSettings::TVtEngVideoCallConfig& config = + settings.Config(); + if ( config.iVideo.iImageIsValid ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "LocVideo.UAP valid image" ) + type = KVtEngProviderImage; + } + } + + __VTPRINTEXITR( "LocVid.UpdateAvailableProvidersL %d", type ) + return type; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::SwitchProvider +// Switches to active provider. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::SwitchProvider( TProviderItem* aSwitchToItem ) + { + __VTPRINTENTER( "LocVid.SwitchProvider" ) + + iState = ELocSwichingProvider; + __VTPRINT( DEBUG_MEDIA, " STATE TO SWITCHING" ) + iFadingProvider = iActiveProvider; + iActiveProvider = aSwitchToItem; + TRAPD( err, iSource->SwitchDataProviderL( iActiveProvider->iProvider ) ); + if ( err != KErrNone ) + { + iState = ELocReady; // go to AO + __VTPRINT( DEBUG_MEDIA, " STATE TO READY" ) + } + switch ( iState ) + { + case ELocReady: // Switch done. Sync. + { + // Entered here if SwitchDataProviderL causes direct call to + // vsProviderSwitchDone. Since provider switch should be async + // from client point of view now start AO and signal in RunL. + Cancel(); + TRequestStatus* status = &iStatus; + SetActive(); + User::RequestComplete( status, err ); + __VTPRINT2( DEBUG_MEDIA, + "LocVideo.SwitchProvider AO start %d", err ) + } + // fall through + case ELocSwichingProvider: // Async. + case ELocNone: + SetFlag( EFlagSignalSourceSelection ); + break; + default: + break; + } + __VTPRINTEXIT( "LocVid.SwitchProvider" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::SwitchProvider +// Overloaded method that takes new active provider as a parameter. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::SwitchProvider( TProviderItem& aProviderItem ) + { + __VTPRINTENTER( "LocVid.SwitchProvider by aProviderItem" ) + StopViewFinder( EFalse ); + SwitchProvider( &aProviderItem ); + __VTPRINTEXIT( "LocVid.SwitchProvider by aProviderItem" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::IsInitialized +// Checks if a provider with given id is initialized. +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo::IsInitialized( + MVtEngMedia::TCameraId aId, + TBool& aInitialized ) + { + __VTPRINT2( DEBUG_MEDIA, "LocVideo.IsInitialized ID:%d", aId ) + TInt count( iVideoProviders->Count() ); + TVtEngProviderType type = CameraIdToType( aId ); + aInitialized = EFalse; + TInt err( KErrNotFound ); + while ( count-- ) + { + TProviderItem& item = ( *iVideoProviders )[count]; + if ( item.iType == type ) + { + __VTPRINT( DEBUG_MEDIA, "LocVideo.IsInitialized found" ) + aInitialized = item.iInitialized; + if ( ( !aInitialized && item.iProviderState < KErrNone ) || + item.iErrorCode < KErrNone ) + { + __VTPRINT( DEBUG_MEDIA, "LocVideo.IsInitialized problems" ) + err = item.iErrorCode; + } + else + { + err = KErrNone; + } + count = 0; // break + } + } + __VTPRINT3( DEBUG_MEDIA | DEBUG_RETURN, + "LocVideo.IsInitialized isInitialized=%d,err=%d", aInitialized, err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::UpdateState +// Updates view finder state. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::UpdateState() + { + __VTPRINTENTER( "LocVid.UpdateState" ) + + if ( iActiveProvider ) + { + CVSDataProvider* provider = iActiveProvider->iProvider; + __VTPRINT2 ( DEBUG_MEDIA, "LocVideo.UpdateState, provider active", + provider->ViewFinderActive() ) + if ( provider && provider->ViewFinderActive()) + { + iViewFinderState = ( iRenderingMethod == EWindowServer ) ? + EVFReceivingBitmaps : EVFRenderingDsa; + } + } + ClearFlag( EFlagInitializeOnly ); + __VTPRINT2( DEBUG_MEDIA | DEBUG_RETURN, + "LocVideo.UpdateState iViewFinderState %d", iViewFinderState ) + __VTPRINTEXIT( "LocVid.UpdateState" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::InitializingOrSwitching +// Is either initializing or doing a provider switch. +// ----------------------------------------------------------------------------- +// +TBool CVtEngLocalVideo::InitializingOrSwitching() const + { + return ( iState == ELocInitializing || + iState == ELocSwichingProvider ); + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::UninitializeProviderL +// Uninitializes initialized non-permanent provider. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::UninitializeProviderL() + { + __VTPRINTENTER( "LocVid.UninitializeProviderL" ) + TInt count( iVideoProviders->Count() ); + while ( count-- ) + { + TProviderItem& item = ( *iVideoProviders )[count]; + if ( item.iProviderState == EUndefined && item.iInitialized ) + { + DeleteProvider( item ); + item.iProvider = CreateDataProviderL( item.iType ); + } + } + __VTPRINTEXIT( "LocVid.UninitializeProviderL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::GetCameraInfo +// Gets camera info. +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo::GetCameraInfo( MVtEngMedia::TCameraId aId, + MVtEngMedia::TCameraInfo& aInfo ) + { + TBool initialized( EFalse ); + TInt err( IsInitialized( aId, initialized ) ); + TVSDataProviderInfo info; + if ( initialized && err == KErrNone ) + { + TVtEngProviderType type = CameraIdToType( aId ); + TProviderItem item; + GetProviderByType( type, item ); + item.iProvider->ProviderInfo( info ); + aInfo.iMaxDigitalZoom = info.iMaxDigitalZoom; + aInfo.iMaxZoom = info.iMaxZoom; + aInfo.iMinZoom = info.iMinZoom; + aInfo.iMajorZoomStepCount = + CalculateMajorDigitalZoomStepCount( item.iProvider ); + } + return initialized ? err : KErrNotReady; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::GetDigitalZoomFactor +// Gets current zoom step. +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo::GetDigitalZoomFactor( TInt& aCurrentStep ) + { + if ( !iActiveProvider || + !iActiveProvider->iProvider ) + { + return KErrNotReady; + } + aCurrentStep = iActiveProvider->iProvider->DigitalZoomFactor(); + __VTPRINT2( DEBUG_MEDIA, "LocVideo.GetZ %d", aCurrentStep ) + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::GetMaxDigitalZoomStep +// Gets max. digital zoom step. +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo::GetMaxDigitalZoomStep( TInt& aMaxZoomStep ) + { + if ( !iActiveProvider || + !iActiveProvider->iProvider ) + { + return KErrNotReady; + } + aMaxZoomStep = iProviderInfo.iMaxDigitalZoom; + __VTPRINT2( DEBUG_MEDIA | DEBUG_DETAIL, + "LocVideo.MaxZStep %d", aMaxZoomStep ) + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::GetMajorDigitalZoomStepCount +// Gets number of major zoom level leaps. +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo:: + GetMajorDigitalZoomStepCount( TInt& aCount, TBool /*aProviderSupplied*/ ) + { + /*__VTPRINT2( DEBUG_MEDIA | DEBUG_DETAIL, + "LocVideo.GetMajZStepCount %d", aProviderSupplied )*/ + if ( !iActiveProvider || !iActiveProvider->iProvider ) + { + return KErrNotReady; + } + aCount = CalculateMajorDigitalZoomStepCount( iProviderInfo ); + __VTPRINT2( DEBUG_MEDIA | DEBUG_DETAIL, + "LocVideo.GetMajZStepCount %d", aCount ) + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::GetMajorDigitalZoomStep +// Maps major step to zoom step. Note: aIndex is given in range +// [0 .. CalculateMajorDigitalZoomStepCount() - 1] +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::GetMajorDigitalZoomStep( const TInt aIndex, TInt& aStep ) + { + if ( !iActiveProvider || !iActiveProvider->iProvider ) + { + // No active provider. + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "LocVideo.GetMajZStep NO active") + return; + } + if ( iProviderInfo.iMaxDigitalZoom > KVtMaxZoomStep ) + { + aStep = iProviderInfo.iMaxDigitalZoom * + Min( KVtMaxZoomStep, Max( 0, aIndex ) ) / KVtMaxZoomStep; + } + else + { + aStep = Min( iProviderInfo.iMaxDigitalZoom, Max( 0, aIndex ) ); + } + __VTPRINT3( DEBUG_MEDIA | DEBUG_DETAIL, + "LocVideo.GetMajZStep idx=%d,step=%d", aIndex, aStep ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::GetFreezeSupported +// Gets freeze supported value from provider. +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo::GetFreezeSupported( TBool& aFreezeSupported ) const + { + __VTPRINTENTER( "LocVideo.GetFreezeSupported" ) + if ( !iActiveProvider || + !iActiveProvider->iProvider ) + { + __VTPRINTEXIT( "LocVideo.GetFreezeSupported KErrNotReady") + return KErrNotReady; + } + aFreezeSupported = iProviderInfo.iFreezeSupported; + __VTPRINTEXITR( "LocVideo.GetFreezeSupported %d", aFreezeSupported ) + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::OkToFreeze +// Returns ETrue if it is ok to freeze provider (i.e. freeze is supported AND +// provider is not currently frozen) +// ----------------------------------------------------------------------------- +// +TBool CVtEngLocalVideo::OkToFreeze() const + { + __VTPRINTENTER( "LocVideo.OkToFreeze" ) + TBool isOk( EFalse ); + if ( iActiveProvider && + iActiveProvider->iProvider ) + { + isOk = ( iProviderInfo.iFreezeSupported && !IsFlag( EFlagFrozen ) ); + } + __VTPRINTEXITR( "LocVideo.OkToFreeze %d", isOk ) + return isOk; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::OkToUnfreeze +// Returns ETrue if it is ok to unfreeze provider (i.e. freeze is supported AND +// provider is currently frozen) +// ----------------------------------------------------------------------------- +// +TBool CVtEngLocalVideo::OkToUnfreeze() const + { + __VTPRINTENTER( "LocVideo.OkToUnfreeze" ) + TBool isOk( EFalse ); + if ( iActiveProvider && + iActiveProvider->iProvider ) + { + isOk = ( iProviderInfo.iFreezeSupported && IsFlag( EFlagFrozen ) ); + } + __VTPRINTEXITR( "LocVideo.OkToUnfreeze %d", isOk ) + return isOk; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::Mute +// Sets the audio state as muted. +// ----------------------------------------------------------------------------- +void CVtEngLocalVideo::Mute() + { + SetFlag( EFlagAudioMuted ); + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::UnMute +// Sets the audio state on again. +// ----------------------------------------------------------------------------- +void CVtEngLocalVideo::UnMute() + { + ClearFlag( EFlagAudioMuted ); + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::SetUIForeground +// Sets UI foreground state. +// ----------------------------------------------------------------------------- +void CVtEngLocalVideo::SetUIForeground( TBool aForeground ) + { + __VTPRINTENTER( "LocVideo.SetUIForeground" ) + __VTPRINT2( DEBUG_GEN, " foreground=%d", aForeground ) + + //Error indicator + TInt err = KErrNone; + if ( aForeground ) + { + if ( iDelayedSelect.IsDelayedSelectPending() ) + { + TVtEngProviderType type( iDelayedSelect.DelayedSelectTarget() ); + __VTPRINT2( DEBUG_MEDIA, + "LocVideo.SetUIForeground delayed switch to %d", type ) + SelectSourceL( type ); + } + + SetFlag( EFlagUIForeground ); + ClearFlag( EFlagUIBackground ); + if ( IsFlag( EFlagVFEnabled ) ) + { + //Ignore error + TRAP (err, StartViewFinderL( EFalse )); + } + else + { + MVtEngMedia::TShareObjectState sharingState; + GetObjectSharingState( sharingState ); + if ( sharingState == MVtEngMedia::ESharingImage ) + { + //Ignore error + TRAP (err, StartViewFinderL( ETrue )); + } + } + } + else + { + ClearFlag( EFlagUIForeground ); + SetFlag( EFlagUIBackground ); + StopViewFinder( EFalse ); + ClearFlag( EFlagUIBackground ); + } + __VTPRINTEXIT( "LocVideo.SetUIForeground" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::GetObjectSharingState +// Get current media object sharing state. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::GetObjectSharingState( + MVtEngMedia::TShareObjectState& aObjectSharingState ) const + { + __VTPRINTENTER( "LocVid.GetObjectSharingState" ) + if( iActiveProvider && iActiveProvider->iProvider ) + { + iShareImage->GetObjectSharingState( aObjectSharingState ); + } + else + { + aObjectSharingState = MVtEngMedia::ENotAbleToShare; + } + __VTPRINTEXITR( "LocVid.GetObjectSharingState %d", aObjectSharingState ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::InitializeShareImageL +// Start Image sharing initialization. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::InitializeShareImageL( + const MVtEngMedia::TShareObjectImageParameters& aParameters, + TBool& aFirstTime ) + { + __VTPRINTENTER( "LocVid.InitializeShareImageL" ) + + iShareImage->InitializeL( aParameters, + iActiveProvider->iType, aFirstTime ); + + __VTPRINTEXIT( "LocVid.InitializeShareImageL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::StartShareImageL +// Stop sharing Image. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::StartShareImageL() + { + __VTPRINTENTER( "LocVid.StartShareImageL" ) + const TBool delayed( iDelayedSelect.IsDelayedSelectPending() ); + const TVtEngProviderType type( iDelayedSelect.DelayedSelectTarget() ); + iShareImage->ShareL(); + if ( delayed ) + { + __VTPRINT2( DEBUG_MEDIA, + "LocVid.StartShareImageL IsDelayedSelectPending type = %d", + type ) + iShareImage->NotifyCameraChanged( type ); + } + __VTPRINTEXIT( "LocVid.StartShareImageL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::StopShareImageL +// Stop sharing Image. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::StopShareImageL() + { + __VTPRINTENTER( "LocVid.StopShareImageL" ) + iShareImage->StopL(); + __VTPRINTEXIT( "LocVid.StopShareImageL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::ShareError +// Report error to image sharer. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::ShareError( TInt aError ) + { + __VTPRINTENTER( "LocVid.ShareError" ) + iShareImage->Error( aError ); + __VTPRINTEXIT( "LocVid.ShareError" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::ShareStoredSource +// +// ----------------------------------------------------------------------------- +// +CVtEngLocalVideo::TVtEngProviderType CVtEngLocalVideo::ShareStoredSource() const + { + __VTPRINTENTER( "LocVid.ShareStoredSource" ) + const TVtEngProviderType stored( iShareImage->StoredSource() ); + __VTPRINTEXITR( "LocVid.ShareStoredSource = %d", stored ) + return stored; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::SettingsChanged +// Called when GS settings changed. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::SettingsChanged() + { + __VTPRINTENTER( "LocVid.SettingsChanged" ) + iShareImage->SettingsChanged(); + __VTPRINTEXIT( "LocVid.SettingsChanged" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::SetIsPrepareCameraCalled +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::SetIsPrepareCameraCalled( TBool aCalled ) + { + __VTPRINTENTER( "LocVid.SetIsPrepareCameraCalled" ) + iPrepareCameraCalled = aCalled; + __VTPRINTEXITR( "LocVid.SetIsPrepareCameraCalled %d", iPrepareCameraCalled ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::IsPrepareCameraCalled +// ----------------------------------------------------------------------------- +// +TBool CVtEngLocalVideo::IsPrepareCameraCalled() const + { + __VTPRINTENTER( "LocVid.IsPrepareCameraCalled" ) + __VTPRINTEXITR( "LocVid.IsPrepareCameraCalled %d", iPrepareCameraCalled ) + return iPrepareCameraCalled; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::HandleLayoutChangeL +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::HandleLayoutChangeL() + { + __VTPRINTENTER( "LocVid.HandleLayoutChangeL" ) + iLayoutChangeHandler.HandleLayoutChangeL(); + __VTPRINTEXIT( "LocVid.HandleLayoutChangeL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::IsDelayedSelectPending +// ----------------------------------------------------------------------------- +// +TBool CVtEngLocalVideo::IsDelayedSelectPending() const + { + return iDelayedSelect.IsDelayedSelectPending(); + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::DeleteProvider +// Deletes provider. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::DeleteProvider( + TProviderItem& aItem ) + { + __VTPRINTENTER( "LocVid.DeleteProvider" ) + aItem.iProviderState = EUndefined; + if ( aItem.iProvider && + aItem.iInitialized && + aItem.iProvider->ViewFinderActive() ) + { + aItem.iProvider->StopViewFinder(); + } + delete aItem.iProvider; + aItem.iInitialized = EFalse; + aItem.iProvider = NULL; + __VTPRINTEXIT( "LocVid.DeleteProvider" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::DeleteProvider +// Deletes provider. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::DeleteProvider( const TVtEngProviderType aType ) + { + TProviderItem dummy; + const TInt pos( GetProviderByType( aType, dummy ) ); + if ( pos >= 0 ) // valid index + { + TProviderItem& item = ( *iVideoProviders )[pos]; + DeleteProvider( item ); + } + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::Reset +// Resets local video handler. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::Reset() + { + __VTPRINTENTER( "LocVid.Reset" ) + + __VTPRINT( DEBUG_MEDIA, "LocVideo.Reset" ) + DeleteProvider( KVtEngProviderCam1 ); + DeleteProvider( KVtEngProviderCam2 ); + DeleteAudioSource(); + + ClearFlag( EFlagAudioMuted | + EFlagSignalSourceSelection | + EFlagInitialized | + EFlagVFEnabled | + EFlagFrozen ); + + __VTPRINT( DEBUG_MEDIA, "LocVideo.Reset clearing EFlagVFEnabled and other" ) + + StopViewFinder(); + __VTPRINTEXIT( "LocVid.Reset" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::SetDigitalZoomFactorL +// Sets video provider's digital zoom step. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::SetDigitalZoomFactorL( TInt aDigitalZoomFactor ) + { + __VTPRINTENTER( "LocVid.SetDigitalZoomFactorL" ) + __VTPRINT2( DEBUG_MEDIA, "LocVideo.SetZoom %d", aDigitalZoomFactor ) + if ( !iActiveProvider || + !iActiveProvider->iProvider ) + { + User::Leave( KErrNotReady ); + } + CVSDataProvider* provider( iActiveProvider->iProvider ); + provider->SetDigitalZoomFactorL( aDigitalZoomFactor ); + iActiveProvider->iStoredZoomFactor = provider->DigitalZoomFactor(); + __VTPRINTEXIT( "LocVid.SetDigitalZoomFactorL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::SetFlag +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::SetFlag( const TInt aFlag ) + { + iFlags |= aFlag; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::ClearFlag +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::ClearFlag( const TInt aFlag ) + { + iFlags &= ~aFlag; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::IsFlag +// ----------------------------------------------------------------------------- +// +TBool CVtEngLocalVideo::IsFlag( const TInt aFlag ) const + { + return ( ( iFlags & aFlag ) != 0 ); + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CalculateMajorDigitalZoomStepCount +// Utility function to calculate amount of major zoom steps. +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo::CalculateMajorDigitalZoomStepCount( + CVSDataProvider* aProvider ) + { + TVSDataProviderInfo info; + aProvider->ProviderInfo( info ); + return CalculateMajorDigitalZoomStepCount( info ); + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CalculateMajorDigitalZoomStepCount +// Utility function to calculate amount of major zoom steps. +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo::CalculateMajorDigitalZoomStepCount( + const TVSDataProviderInfo& aInfo ) const + { + TInt zStepCount( aInfo.iMaxDigitalZoom ? + aInfo.iMaxDigitalZoom + 1 : 0 ); + TInt maxZStepCount( KVtMaxZoomStep + 1 ); + return zStepCount > maxZStepCount ? maxZStepCount : zStepCount; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TProviderItem::TProviderItem +// Constructor. +// ----------------------------------------------------------------------------- +// +CVtEngLocalVideo::TProviderItem::TProviderItem() : + iProvider( NULL ), + iType( KVtEngProviderUndefined ), + iInitialized( EFalse ), + iErrorCode( 0 ), + iProviderState( EUndefined ), + iStoredZoomFactor( 0 ), + iZFErr( KErrNone ), + iCamPrefs( NULL ), + iFirstTime( ETrue ) + { + __VTPRINTENTER( "LocVid.TProviderItem.ctor" ) + ResetStoredValues(); + __VTPRINTEXITR( "LocVid.TProviderItem.ctor $%x", TInt( this ) ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TProviderItem::~TProviderItem +// ----------------------------------------------------------------------------- +// +CVtEngLocalVideo::TProviderItem::~TProviderItem() + { + __VTPRINTENTER( "LocVid.TProviderItem.~" ) + DetachFromCameraPreferences(); + __VTPRINTEXITR( "LocVid.TProviderItem.~ $%x", TInt( this ) ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TProviderItem::ResetStoredValues +// Resets stored values. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::TProviderItem::ResetStoredValues() + { + __VTPRINTENTER( "LocVid.ResetStoredValues" ) + DetachFromCameraPreferences(); + __VTPRINTEXIT( "LocVid.ResetStoredValues" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TProviderItem::RestoreZoomFactor +// Tries to restore zoom factor. +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo::TProviderItem::RestoreZoomFactor() + { + __VTPRINTENTER( "LocVid.RestoreZoomFactor" ) + TRAP( iZFErr, + { + if ( iProvider && !iZFErr ) + { + iProvider->SetDigitalZoomFactorL( iStoredZoomFactor ); + iStoredZoomFactor = iProvider->DigitalZoomFactor(); + __VTPRINT2( DEBUG_GEN, "LocVideo.RestoreZoomFactor ZF now = %d", + iStoredZoomFactor ) + } + } ); + __VTPRINTEXITR( "LocVid.RestoreZoomFactor %d", iZFErr ) + return iZFErr; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TProviderItem::RestorePreferences +// Tries to restore preferences. +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo::TProviderItem::RestorePreferences() + { + __VTPRINTENTER( "LocVid.RestorePreferences" ) + TRAPD( error, + { + if ( iCamPrefs && iProvider && !iFirstTime ) + { + if ( !iCtErr ) + { + iProvider->SetColorToneL( + CCamera::CCameraImageProcessing::TEffect( iColorTone ) ); + } + if ( !iWbErr ) + { + iProvider->SetWhiteBalanceL( + CCamera::TWhiteBalance( iWhiteBalance ) ); + } + if ( !iBrErr ) + { + iProvider->SetBrightnessL( iBrightness ); + } + if ( !iCrErr ) + { + iProvider->SetContrastL( iContrast ); + } + } + } ); + __VTPRINTEXITR( "LocVid.RestorePreferences %d", error ) + return error; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TProviderItem::Attach +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::TProviderItem::Attach( MVtEngCameraPreferences& + aCamPrefs ) + { + __VTPRINTENTER( "LocVid.Attach" ) + iCamPrefs = &aCamPrefs; + if ( iFirstTime ) + { + iCtErr = iCamPrefs->GetColorTone( iColorTone ); + iWbErr = iCamPrefs->GetWhiteBalance( iWhiteBalance ); + iBrErr = iCamPrefs->GetBrightness( iBrightness ); + iCrErr = iCamPrefs->GetContrast( iContrast ); + iFirstTime = EFalse; + } + __VTPRINTEXITR( "LocVid.Attach $%x", TInt( iCamPrefs ) ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TProviderItem::ColorToneUpdated +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::TProviderItem::ColorToneUpdated( + MVtEngCameraPreferences::TColorTone aColorTone ) + { + __VTPRINTENTER( "LocVid.ColorToneUpdated" ) + iCtErr = KErrNone; + iColorTone = aColorTone; + __VTPRINTEXITR( "LocVid.ColorToneUpdated %d", aColorTone ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TProviderItem::WhiteBalanceUpdated +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::TProviderItem::WhiteBalanceUpdated( + MVtEngCameraPreferences::TWhiteBalance aWhiteBalance ) + { + __VTPRINTENTER( "LocVid.WhiteBalanceUpdated" ) + iWbErr = KErrNone; + iWhiteBalance = aWhiteBalance; + __VTPRINTEXITR( "LocVid.WhiteBalanceUpdated %d", aWhiteBalance ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TProviderItem::BrightnessUpdated +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::TProviderItem::BrightnessUpdated( TInt aBrightness ) + { + __VTPRINTENTER( "LocVid.BrightnessUpdated" ) + iBrErr = KErrNone; + iBrightness = aBrightness; + __VTPRINTEXITR( "LocVid.BrightnessUpdated %d", aBrightness ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TProviderItem::ContrastUpdated +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::TProviderItem::ContrastUpdated( TInt aContrast ) + { + __VTPRINTENTER( "LocVid.ContrastUpdated" ) + iCrErr = KErrNone; + iContrast = aContrast; + __VTPRINTEXITR( "LocVid.ContrastUpdated %d", aContrast ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TProviderItem::Detach +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::TProviderItem::Detach( MVtEngCameraPreferences& ) + { + __VTPRINTENTER( "LocVid.Detach" ) + iCamPrefs = NULL; + __VTPRINTEXIT( "LocVid.Detach" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TProviderItem::DetachFromCameraPreferences +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::TProviderItem::DetachFromCameraPreferences() + { + __VTPRINTENTER( "LocVid.DetachFromCameraPreferences" ) + if ( iCamPrefs ) + { + static_cast< CVtEngCameraPreferences* >( iCamPrefs )->Detach( *this ); + iCamPrefs = NULL; + } + __VTPRINTEXIT( "LocVid.DetachFromCameraPreferences" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CreateAudioSource +// Creates audio source. +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo::CreateAudioSource() + { + __VTPRINTENTER( "LocVid.CreateAudioSource" ) + TInt err = KErrNone; + // Check if this really a target compilation +#if !defined( __WINS__ ) + iAudioSource = VTProtocolFactory::CreateAudioSource(); + if ( !iAudioSource ) + { + err = KErrNoMemory; + } +#endif // !(__WINS__) + __VTPRINTEXITR( "LocVid.CreateAudioSource %d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::DeleteAudioSource +// Deletes audio source. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::DeleteAudioSource() + { + __VTPRINTENTER( "LocVid.DeleteAudioSource" ) + if( iAudioSource ) + { + VTProtocolFactory::DeletAudioSource(iAudioSource); + iAudioSource = NULL; + } + __VTPRINTEXIT( "LocVid.DeleteAudioSource" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::PauseVideoSending +// Pause video sending. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::PauseVideoSending() + { + __VTPRINTENTER( "LocVid.PauseVideoSending" ) + if ( iSource ) + { + iSource->PauseSending(); + } + __VTPRINTEXIT( "LocVid.PauseVideoSending" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::ResumeVideoSending +// Resume video sending. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::ResumeVideoSending() + { + __VTPRINTENTER( "LocVid.ResumeVideoSending" ) + if ( iSource ) + { + iSource->ResumeSending(); + } + __VTPRINTEXIT( "LocVid.ResumeVideoSending" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::ViewFinderStarted +// Is view finder started. +// ----------------------------------------------------------------------------- +// +TBool CVtEngLocalVideo::ViewFinderStarted() const + { + CVSDataProvider* provider = NULL; + if( iActiveProvider ) + { + provider = iActiveProvider->iProvider; + } + if ( !provider ) + { + return EFalse; + } + return provider->ViewFinderActive(); + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::ViewFinderStarted +// Is view finder started. +// ----------------------------------------------------------------------------- +// +TBool CVtEngLocalVideo::IsFrozen() const + { + TBool result = IsFlag( EFlagFrozen ); + return result; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::ResetIndices +// Resets the provider info indices. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::ResetIndices() + { + iProviderInfoIndexCam1 = KErrNotFound; + iProviderInfoIndexCam2 = KErrNotFound; + iProviderInfoIndexStill = KErrNotFound; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::SetCameraTracking +// Sets a listener for camera P & S data. +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo::SetCameraTrackingL( TInt& aProviderIndex ) + { + __VTPRINTENTER( "LocVideo.SetCameraTracking" ) + iCameraListener = CVtEngPubSubsListener::NewL( KPSUidVTMediaConfiguration, + KPSPreferredCamera, this ); + + __VTPRINTEXIT( "LocVideo.SetCameraTracking" ) + return iCameraListener->Get( aProviderIndex ); + } + +// ----------------------------------------------------------------------------- +// CVtEngInitializer::HandleNotifyPSL +// Notification of changed port value. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::HandleNotifyPSL( + const TUid /*aUid */, const TInt& /* aKey */, + const TRequestStatus& aStatus ) + { + __VTPRINTENTER( "LocVideo.handleNotifyPSL " ) + if ( aStatus.Int() == KErrNone ) + { + // Get the new camera value. + TInt cameraId( EPSPreferredCameraUnknown ); + iCameraListener->Get( cameraId ); + // No need to check error, since MapCameraInternally will return + // current camera, and no actions will be taken. + MVtEngMedia::TCameraId camId( MapCameraInternally( cameraId ) ); + + TVtEngProviderType providerType( KVtEngProviderUndefined ); + TInt result( KErrNone ); + switch( camId ) + { + case MVtEngMedia::EPrimaryCamera: + if( IsFlag( EFlagCamera1Available ) ) + { + providerType = KVtEngProviderCam1; + } + else + { + result = KErrNotFound; + } + break; + + case MVtEngMedia::ESecondaryCamera: + if( IsFlag( EFlagCamera2Available ) ) + { + providerType = KVtEngProviderCam2; + } + else + { + result = KErrNotFound; + } + break; + + default: + result = KErrNotSupported; + break; + } + + User::LeaveIfError( result ); + + // If we're sharing, then notify camera change to image sharer + if ( GetMediaSource() == MVtEngMedia::EMediaShare || + iShareImage->IsInitializingShare() ) + { + iShareImage->NotifyCameraChanged( providerType ); + } + // If current provider is camera + else if ( GetMediaSource() == MVtEngMedia::EMediaCamera ) + { + // If current camera is different than new + if ( iCurrentCamera != camId ) + { + // If VT is in the foreground and Provider is unfrozen + if ( IsFlag( EFlagUIForeground ) && !IsFrozen() && !iObserver.IsVideoChannelClosed() ) + { + // select camera.. + SelectSourceL( providerType ); + } + else + { + iObserver.SetSelectedCameraId( camId ); + // ..else notify delayed select + iLayoutChangeHandler.CancelHandleLayoutChange(); + iDelayedSelect.NotifyDelayedSelect( providerType ); + } + } + else + { + // else ignore + } + } + // Else store camera type and on next SelectSourceL() use this instead + else + { + iObserver.SetSelectedCameraId( camId ); + // If prepare camera has not been called, then just + // update preferred camera + if ( GetMediaSource()!= MVtEngMedia::EMediaNone && + ( IsPrepareCameraCalled() || iObserver.IsVideoChannelClosed() ) ) + { + iLayoutChangeHandler.CancelHandleLayoutChange(); + iDelayedSelect.NotifyDelayedSelect( providerType ); + } + else + { + iCurrentCamera = camId; + } + } + } + __VTPRINTEXIT( "LocVideo.HandleNotifyPSL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::SetCurrentCameraId +// +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::SetCurrentCameraId( MVtEngMedia::TCameraId aCamId ) + { + __VTPRINTENTER( "LocVideo.SetCurrentCameraId" ) + iCurrentCamera = aCamId; + iObserver.SetSelectedCameraId( aCamId ); + __VTPRINTEXITR( "LocVideo.SetCurrentCameraId camId = %d", aCamId ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::MapCameraInternally +// Maps camera id to internal data structures. +// ----------------------------------------------------------------------------- +// +MVtEngMedia::TCameraId CVtEngLocalVideo::MapCameraInternally( TInt aCameraId ) + { + __VTPRINT2( DEBUG_GEN, "LocVideo.MapCameraInternally cameraId=%d", + aCameraId ) + if ( aCameraId == EPSPreferredCameraInwards || + iNumSupportedCameras == 1 ) + { + return MVtEngMedia::EPrimaryCamera; + } + else if ( aCameraId == EPSPreferredCameraOutwards ) + { + return MVtEngMedia::ESecondaryCamera; + } + __VTPRINT2( DEBUG_GEN, "LocVideo.MapCameraInternally curCam=%d", iCurrentCamera ) + return iCurrentCamera; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CameraAvailable +// Checks camera availabitility. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo:: + CameraAvailable( CVtEngLocalVideo::TVtEngProviderType &aType ) + { + __VTPRINT2( DEBUG_GEN, "LocVideo.CameraAvailable In.type=%d ", aType ) + if ( iCurrentCamera == MVtEngMedia::EPrimaryCamera ) + { + if ( IsFlag( EFlagCamera1Available ) ) + { + aType = KVtEngProviderCam1; + } + } + else if ( iCurrentCamera == MVtEngMedia::ESecondaryCamera ) + { + if ( IsFlag( EFlagCamera2Available ) ) + { + aType = KVtEngProviderCam2; + } + } + __VTPRINT2( DEBUG_GEN, "LocVideo.CameraAvailable Out.type=%d", aType ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::IsProviderWaiting +// ----------------------------------------------------------------------------- +// +TBool CVtEngLocalVideo::IsProviderWaiting( TVtEngProviderType aType ) const + { + __VTPRINTENTER( "LocVid.IsProviderWaiting" ) + TBool isWaiting( EFalse ); + TInt indexWaiting( ProviderIndexByState( EWaiting ) ); + if ( indexWaiting != KErrNotFound ) + { + TProviderItem& item = ( *iVideoProviders )[ indexWaiting ]; + isWaiting = ( item.iType == aType ); + } + __VTPRINTEXITR( "LocVid.IsProviderWaiting %d", isWaiting ) + return isWaiting; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::GetHighestSelectableProvider +// ----------------------------------------------------------------------------- +// +TBool CVtEngLocalVideo::GetHighestSelectableProvider( + CVtEngLocalVideo::TVtEngProviderType& aPreferred ) const + { + __VTPRINTENTER( "LocVid.GetHighestSelectableProvider" ) + const TVtEngProviderType preferred = aPreferred; + switch ( preferred ) + { + case KVtEngProviderCam1: + if ( IsFlag( EFlagCamera1Available ) ) + { + // cam1 is selectable, jump out + break; + } + // othwerwise fall through to next in priority order + case KVtEngProviderCam2: + if ( IsFlag( EFlagCamera2Available ) && + // Do not allow change to another camera without user permission, + // i.e. test preferred was cam1 but it wasn't available. + preferred != KVtEngProviderCam1 ) + { + // cam2 is selectable + aPreferred = KVtEngProviderCam2; + break; + } + // othwerwise fall through to next in priority order + case KVtEngProviderImage: + if ( CVtEngUtility::Settings().Config().iVideo.iImageIsValid ) + { + aPreferred = KVtEngProviderImage; + break; + } + // othwerwise fall through to next in priority order + case KVtEngProviderNone: + default: + // always available + aPreferred = KVtEngProviderNone; + break; + } + __VTPRINTEXITR( "LocVid.GetHighestSelectableProvider %d", aPreferred ) + return ( preferred == aPreferred ); + } + +// Implementation of CVtEngLocalVideo::CVtEngShareImage + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::NewL +// ----------------------------------------------------------------------------- +// +CVtEngLocalVideo::CVtEngShareImage* CVtEngLocalVideo::CVtEngShareImage::NewL( + CVtEngLocalVideo& aLocalVideo ) + { + CVtEngShareImage* self = new ( ELeave ) CVtEngShareImage( aLocalVideo ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); // self + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::~CVtEngShareImage +// ----------------------------------------------------------------------------- +// +CVtEngLocalVideo::CVtEngShareImage::~CVtEngShareImage() + { + DeleteProviders(); + iBuffered.ResetAndDestroy(); + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::InitializeL +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::CVtEngShareImage::InitializeL( + const MVtEngMedia::TShareObjectImageParameters& aParameters, + TVtEngProviderType aCurrent, + TBool& aFirstTime ) + { + __VTPRINTENTER( "LocVid.ShareImage.InitializeL" ) + if ( IsInitializing() ) + { + // Already initializing. + User::Leave( KErrNotReady ); + } + + + CVtEngLocalVideo::TProviderItem* freeProviderItem = FetchProviderItem(); + if ( !freeProviderItem ) + { + User::Leave( KErrInUse ); + } + + iParameters = aParameters; + CreateProviderL( *freeProviderItem ); + InitializeProviderL( *freeProviderItem ); + + // Only set stored type when sharing is started, if resharing (i.e. sharing + // new image when already sharing other image), then don't change stored + // type. + if ( iStoredType == KVtEngProviderUndefined ) + { + iSettingsChanged = EFalse; + iOriginalStoredType = iStoredType = aCurrent; + aFirstTime = ETrue; + } + else + { + aFirstTime = EFalse; + } + iInitializingProvider = freeProviderItem; + SetState( EInitializing ); + __VTPRINTEXIT( "LocVid.ShareImage.InitializeL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::ShareL +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::CVtEngShareImage::ShareL() + { + __VTPRINTENTER( "LocVid.ShareImage.ShareL" ) + if ( !IsInitializing() && iInitializingProvider ) + { + User::Leave( KErrNotReady ); + } + iActiveProvider = iInitializingProvider; + iInitializingProvider = NULL; + iLocalVideo->SwitchProvider( *iActiveProvider ); + SetState( ESharing ); + __VTPRINTEXIT( "LocVid.ShareImage.ShareL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::StopL +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::CVtEngShareImage::StopL() + { + __VTPRINTENTER( "LocVid.ShareImage.StopL" ) + iLocalVideo->InitializeOnly( EFalse ); + + CVtEngLocalVideo::TVtEngProviderType target( StoredSource() ); + if ( iOriginalStoredType != target ) + { + TProviderItem* item = NULL; + if ( iLocalVideo->GetProviderByType( iOriginalStoredType, item ) + != KErrNotFound ) + { + if ( item->iProviderState != EPermanent ) + { + iLocalVideo->DeleteProvider( *item ); + } + } + } + + if ( iSettingsChanged ) + { + if ( target == KVtEngProviderDefaultStillImage ) + { + DeleteProvider( target ); + } + DeleteProvider( KVtEngProviderImage ); + } + + __VTPRINT2( DEBUG_MEDIA, "LocVid.ShareImage.StopL select %d", + target ) + iLocalVideo->SelectSourceL( target ); + + if ( iStoredType == KVtEngProviderCam1 || + iStoredType == KVtEngProviderCam2 ) + { + MVtEngMedia::TCameraId camId( + iStoredType == KVtEngProviderCam1 ? + MVtEngMedia::EPrimaryCamera : + MVtEngMedia::ESecondaryCamera ); + iLocalVideo->SetCurrentCameraId( camId ); + __VTPRINT2( DEBUG_MEDIA, "LocVid.ShareImage.StopL set camId %d", + camId ) + } + SetState( EStopped ); + __VTPRINTEXIT( "LocVid.ShareImage.StopL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::Error +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::CVtEngShareImage::Error( TInt +#ifdef _DEBUG + aError +#endif // _DEBUG + ) + { + TState stateAfter( EStopped ); + __VTPRINTENTER( "LocVid.ShareImage.Error" ) + if ( IsInitializing() ) + { + iInitializingProvider = NULL; + stateAfter = iPreviousState; + } + else if ( iState == ESharing ) + { + if ( iLocalVideo->iObserver.GetPendingCommand() != KVtEngInitializeShareImage ) + { + CVtEngEventManager::NotifyEvent( KVtEngShareImageDecodingError ); + } + stateAfter = ESharing; + //iActiveProvider = NULL; + } + SetState( stateAfter ); +#ifdef _DEBUG + __VTPRINTEXITR( "LocVid.ShareImage.Error %d", aError ) +#endif // _DEBUG + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::StoredSource +// +// Returns stored source for this share session. Stored source may have changed +// during share (e.g. when GS still image is being sent but during share +// GS still image is disabled => still image cannot be used anymore and thus +// None provider must be activated). All these conditions are checked by this +// method. +// ----------------------------------------------------------------------------- +// +CVtEngLocalVideo::TVtEngProviderType + CVtEngLocalVideo::CVtEngShareImage::StoredSource() const + { + __VTPRINTENTER( "LocVid.ShareImage.StoredSource" ) + CVtEngLocalVideo::TVtEngProviderType stored( iStoredType ); + + if ( iOriginalStoredType == KVtEngProviderNone || + iOriginalStoredType == KVtEngProviderImage || + iOriginalStoredType == KVtEngProviderDefaultStillImage ) + { + if ( CVtEngUtility::Settings().Config().iVideo.iImageIsValid ) + { + stored = KVtEngProviderImage; + } + else if ( CVtEngUtility::Settings().IsDefaultStillImageDefined() ) + { + stored = KVtEngProviderDefaultStillImage; + } + else + { + stored = KVtEngProviderNone; + } + } + __VTPRINTEXITR( "LocVid.ShareImage.StoredSource = %d", stored ) + return stored; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::CVtEngShareImage +// ----------------------------------------------------------------------------- +// +CVtEngLocalVideo::CVtEngShareImage::CVtEngShareImage( + CVtEngLocalVideo& aLocalVideo ) + : iLocalVideo( &aLocalVideo ), iState( EStopped ), + iStoredType( KVtEngProviderUndefined ), + iOriginalStoredType( KVtEngProviderUndefined ), + iBuffered( 2 ), iSettingsChanged( EFalse ) + { + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::ConstructL +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::CVtEngShareImage::ConstructL() + { + __VTPRINTENTER( "LocVid.ShareImage.ConstructL" ) + for ( TInt i = 0; i < KVtEngNumProvidersBuffered; i++ ) + { + TProviderItem* item = new (ELeave) TProviderItem(); + CleanupStack::PushL( item ); + User::LeaveIfError( iBuffered.Append( item ) ); + CleanupStack::Pop(); // item + } + __VTPRINTEXIT( "LocVid.ShareImage.ConstructL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::Parameters +// ----------------------------------------------------------------------------- +// +const MVtEngMedia::TShareObjectImageParameters& + CVtEngLocalVideo::CVtEngShareImage::Parameters() const + { + __VTPRINTENTER( "LocVid.ShareImage.Parameters" ) + __VTPRINTEXIT( "LocVid.ShareImage.Parameters" ) + return iParameters; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::IsInitializing +// ----------------------------------------------------------------------------- +// +TBool CVtEngLocalVideo::CVtEngShareImage::IsInitializing() const + { + TBool isInitializing( iState == EInitializing ); + __VTPRINTENTER( "LocVid.ShareImage.IsInitializing" ) + __VTPRINTEXITR( "LocVid.ShareImage.IsInitializing %d", isInitializing ) + return isInitializing; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::SetState +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::CVtEngShareImage::SetState( const TState aNewState ) + { + __VTPRINTENTER( "LocVid.ShareImage.SetState" ) + // Signal UI when entering or leaving initializing state + if ( aNewState == EInitializing ) + { + CVtEngEventManager::NotifyEvent( KVtEngShareImageInitializeBegin ); + } + else if ( iState == EInitializing ) + { + CVtEngEventManager::NotifyEvent( KVtEngShareImageInitializeEnd ); + } + // Reset stored type when stopping + if( aNewState == EStopped ) + { + iOriginalStoredType = iStoredType = KVtEngProviderUndefined; + iSettingsChanged = EFalse; + } + iPreviousState = iState; + iState = aNewState; + __VTPRINTEXITR( "LocVid.ShareImage.SetState iState = %d", iState ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::GetProviderItemL +// ----------------------------------------------------------------------------- +// +CVtEngLocalVideo::TProviderItem* + CVtEngLocalVideo::CVtEngShareImage::FetchProviderItem() const + { + __VTPRINTENTER( "LocVid.ShareImage.FetchProviderItem" ) + for( TInt i = 0; i < iBuffered.Count(); i++ ) + { + if( ( iBuffered[ i ] != iActiveProvider ) && + ( iBuffered[ i ] != iInitializingProvider ) ) + { + __VTPRINTEXIT( "LocVid.ShareImage.FetchProviderItem" ) + return iBuffered[ i ]; + } + } + __VTPRINTEXIT( "LocVid.ShareImage.FetchProviderItem" ) + return NULL; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::CreateProviderL +// ----------------------------------------------------------------------------- +void CVtEngLocalVideo::CVtEngShareImage::CreateProviderL( + TProviderItem& aProviderItem ) + { + __VTPRINTENTER( "LocVid.ShareImage.CreateProviderL" ) + iLocalVideo->ReCreateProviderL( aProviderItem, KVtEngProviderShareImage ); + __VTPRINTEXIT( "LocVid.ShareImage.CreateProviderL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::InitializeProviderL +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::CVtEngShareImage::InitializeProviderL( + TProviderItem& aProviderItem ) + { + __VTPRINTENTER( "LocVid.ShareImage.InitializeProviderL" ) + if( IsInitializing() ) + { + User::Leave( KErrNotReady ); + } + TPckgBuf< TVSStillImageDataProviderParams > pckg( Parameters() ); +#ifdef _DEBUG + RDebug::Print( _L( "LocVid.ShareImage.InitializeProviderL: %S" ), + &( pckg().iFileName ) ); +#endif // _DEBUG + iLocalVideo->InitializeShareProviderL( aProviderItem, pckg ); + __VTPRINTEXIT( "LocVid.ShareImage.InitializeProviderL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::DeleteProvider +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::CVtEngShareImage::DeleteProvider( + TVtEngProviderType aProviderType ) + { + __VTPRINTENTER( "LocVid.ShareImage.DeleteProvider" ) + TProviderItem* pItem; + if ( iLocalVideo->GetProviderByType( aProviderType, pItem ) + != KErrNotFound ) + { + iLocalVideo->DeleteProvider( *pItem ); + } + __VTPRINTEXIT( "LocVid.ShareImage.DeleteProvider" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::GetObjectSharingState +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::CVtEngShareImage::GetObjectSharingState( + MVtEngMedia::TShareObjectState& aObjectSharingState ) const + { + __VTPRINTENTER( "LocVid.ShareImage.GetObjectSharingState" ) + switch ( iState ) + { + case EStopped: + aObjectSharingState = MVtEngMedia::ENotSharing; + break; + + case EInitializing: + aObjectSharingState = MVtEngMedia::EInitializingShareImage; + break; + + case ESharing: + aObjectSharingState = MVtEngMedia::ESharingImage; + break; + + default: + aObjectSharingState = MVtEngMedia::ENotAbleToShare; + break; + } + __VTPRINTEXIT( "LocVid.ShareImage.GetObjectSharingState" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::IsInitializingShare +// ----------------------------------------------------------------------------- +// +TBool CVtEngLocalVideo::CVtEngShareImage::IsInitializingShare() const + { + __VTPRINTENTER( "LocVid.ShareImage.IsInitializingShare" ) + const TBool result( iState == EInitializing ); + __VTPRINTEXITR( "LocVid.ShareImage.IsInitializingShare %d", result ) + return result; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::SettingsChanged +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::CVtEngShareImage::SettingsChanged() + { + __VTPRINTENTER( "LocVid.ShareImage.SettingsChanged" ) + iSettingsChanged = ETrue; + __VTPRINTEXIT( "LocVid.ShareImage.SettingsChanged" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::ProviderSwitchDone +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::CVtEngShareImage::ProviderSwitchDone( + CVSDataProvider* aOldProvider ) + { + __VTPRINTENTER( "LocVid.ShareImage.ProviderSwitchDone" ) + //if ( iState == EStopped ) + { + for ( TInt i = iBuffered.Count() - 1; i >= 0; i-- ) + { + if ( iBuffered[ i ]->iProvider == aOldProvider ) + { + iLocalVideo->DeleteProvider( *iBuffered[ i ] ); + break; + } + } + } + __VTPRINTEXIT( "LocVid.ShareImage.ProviderSwitchDone" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::NotifyCameraChanged +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::CVtEngShareImage::NotifyCameraChanged( + const TVtEngProviderType& aProviderType ) + { + __VTPRINTENTER( "LocVid.ShareImage.NotifyCameraChanged" ) + if ( ( iState == EInitializing ) || ( iState == ESharing ) ) + { + iStoredType = aProviderType; + } + __VTPRINTEXIT( "LocVid.ShareImage.NotifyCameraChanged" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::DeleteProviders +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::CVtEngShareImage::DeleteProviders() + { + __VTPRINTENTER( "LocVid.ShareImage.DeleteProviders" ) + for ( TInt i = 0; i < iBuffered.Count(); i++ ) + { + iLocalVideo->DeleteProvider( *iBuffered[ i ] ); + } + __VTPRINTEXIT( "LocVid.ShareImage.DeleteProviders" ) + } + + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CVtEngShareImage::CancelInitialize +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::CVtEngShareImage::CancelInitialize() + { + __VTPRINTENTER( "CVtEngLocalVideo.CVtEngShareImage.CancelInitialize"); + if( iInitializingProvider ) + { + if(iInitializingProvider->iProvider) + { + __VTPRINT( DEBUG_MEDIA,"iInitializingProvider->iProvider->CancelInitializing()"); + iInitializingProvider->iProvider->CancelInitializing(); + } + } + __VTPRINTEXIT( "CVtEngLocalVideo.CVtEngShareImage.CancelInitialize"); + } +// Implementation of CVtEngLocalVideo::TVtEngDelayedSelect + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TVtEngDelayedSelect::TVtEngDelayedSelect +// ----------------------------------------------------------------------------- +// +CVtEngLocalVideo::TVtEngDelayedSelect::TVtEngDelayedSelect() + : iDelayedProviderType( KVtEngProviderUndefined ) + { + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TVtEngDelayedSelect::NotifyDelayedSelect +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::TVtEngDelayedSelect::NotifyDelayedSelect( + const TVtEngProviderType& aProviderType ) + { + __VTPRINTENTER( "LocVid.DelSel.NotifyDelayedSelect" ) + iDelayedProviderType = aProviderType; + __VTPRINTEXIT( "LocVid.DelSel.NotifyDelayedSelect" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TVtEngDelayedSelect::IsDelayedSelectPending +// ----------------------------------------------------------------------------- +// +TBool CVtEngLocalVideo::TVtEngDelayedSelect::IsDelayedSelectPending() const + { + __VTPRINTENTER( "LocVid.DelSel.IsDelayedSelectPending" ) + const TBool result( iDelayedProviderType != KVtEngProviderUndefined ); + __VTPRINTEXITR( "LocVid.DelSel.IsDelayedSelectPending %d", result ) + return result; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TVtEngDelayedSelect::DelayedSelectTarget +// ----------------------------------------------------------------------------- +// +CVtEngLocalVideo::TVtEngProviderType +CVtEngLocalVideo::TVtEngDelayedSelect::DelayedSelectTarget() + { + __VTPRINTENTER( "LocVid.DelSel.DelayedSelectTarget" ) + TVtEngProviderType current( iDelayedProviderType ); + iDelayedProviderType = KVtEngProviderUndefined; + __VTPRINTEXITR( "LocVid.DelSel.DelayedSelectTarget %d", current ) + return current; + } + +// Implementation of CVtEngLocalVideo::TVtEngLayoutChangeHandler + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TVtEngLayoutChangeHandler::TVtEngLayoutChangeHandler +// ----------------------------------------------------------------------------- +// +CVtEngLocalVideo::TVtEngLayoutChangeHandler::TVtEngLayoutChangeHandler( + CVtEngLocalVideo& aLocalVideo ) + : iLocalVideo( &aLocalVideo ), iState( EIdle ), + iStored( KVtEngProviderUndefined ) + { + __VTPRINTEXIT( "LocVid.LayoutCH.Ctor" ) + __VTPRINTEXIT( "LocVid.LayoutCH.Ctor" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TVtEngLayoutChangeHandler::UnfreezeL +// ----------------------------------------------------------------------------- +// +TBool CVtEngLocalVideo::TVtEngLayoutChangeHandler::UnfreezeL() + { + TBool result( EFalse ); + __VTPRINTENTER( "LocVid.LayoutCH.UnfreezeL" ) + if ( iState == ELayoutChangePending ) + { + result = ETrue; + DoHandleLayoutChangeL(); + } + __VTPRINTEXITR( "LocVid.LayoutCH.UnfreezeL %d", result ) + return result; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TVtEngLayoutChangeHandler::HandleLayoutChangeL +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::TVtEngLayoutChangeHandler::HandleLayoutChangeL() + { + __VTPRINTENTER( "LocVid.LayoutCH.HandleLayoutChangeL" ) + TInt error( KErrNone ); + if ( iState != EIdle ) + { + if ( iState == ELayoutChangePending ) + { + __VTPRINT( DEBUG_MEDIA, + "LocVid.LayoutCH.HandleLayoutChangeL PENDING" ) + } + else + { + __VTPRINT( DEBUG_MEDIA, + "LocVid.LayoutCH.HandleLayoutChangeL NOT ready" ) + error = KErrNotReady; + } + CompleteOperation( error ); + } + else + { + // Only do reinitialize if camera is active source + if ( iLocalVideo->GetMediaSource() == MVtEngMedia::EMediaCamera && + !iLocalVideo->IsDelayedSelectPending() ) + { + if ( !iLocalVideo->IsFrozen() ) + { + __VTPRINT( DEBUG_MEDIA, + "LocVid.LayoutCH.HandleLayoutChangeL camera active, reinitialize" ) + DoHandleLayoutChangeL(); + } + else + { + iState = ELayoutChangePending; + __VTPRINT( DEBUG_MEDIA, + "LocVid.LayoutCH.HandleLayoutChangeL flag set, frozen" ) + CompleteOperation( error ); + } + } + else + { + __VTPRINT( DEBUG_MEDIA, + "LocVid.LayoutCH.HandleLayoutChangeL no op, camera is not active" ) + CompleteL( error ); + } + } + __VTPRINTEXITR( "LocVid.LayoutCH.HandleLayoutChangeL %d", error ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TVtEngLayoutChangeHandler::CancelHandleLayoutChange +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::TVtEngLayoutChangeHandler::CancelHandleLayoutChange() + { + __VTPRINTENTER( "LocVid.LayoutCH.CancelHandleLayoutChange" ) + if ( iState == ELayoutChangePending ) + { + iState = EIdle; + } + __VTPRINTEXITR( "LocVid.LayoutCH.CancelHandleLayoutChange iState = %d", + iState ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TVtEngLayoutChangeHandler::DoHandleLayoutChangeL +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::TVtEngLayoutChangeHandler::DoHandleLayoutChangeL() + { + __VTPRINTENTER( "LocVid.LayoutCH.DoHandleLayoutChangeL" ) + iStored = iLocalVideo->ActiveProvider(); + iState = ESwitchingBlank; + TVtEngProviderType providerType( KVtEngProviderNone ); + // Use user defined image, if available + if ( CVtEngUtility::Settings().IsDefaultStillImageDefined() ) + { + providerType = KVtEngProviderDefaultStillImage; + } + iLocalVideo->SelectSourceL( providerType ); + __VTPRINTEXIT( "LocVid.LayoutCH.DoHandleLayoutChangeL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TVtEngLayoutChangeHandler::Complete +// ----------------------------------------------------------------------------- +// +TInt CVtEngLocalVideo::TVtEngLayoutChangeHandler::Complete( const TInt aError ) + { + __VTPRINTENTER( "LocVid.LayoutCH.Complete" ) + TRAPD( error, CompleteL( aError ) ); + __VTPRINTEXITR( "LocVid.LayoutCH.Complete %d", error ) + return error; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TVtEngLayoutChangeHandler::CompleteL +// Resets internal state and completes asynchronous operation. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::TVtEngLayoutChangeHandler::CompleteL( const TInt aError ) + { + __VTPRINTENTER( "LocVid.LayoutCH.CompleteL" ) + iStored = KVtEngProviderUndefined; + iState = EIdle; + CompleteOperation( aError ); + __VTPRINTEXIT( "LocVid.LayoutCH.CompleteL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TVtEngLayoutChangeHandler::CompleteOperation +// Completes asynchronous operation. +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::TVtEngLayoutChangeHandler::CompleteOperation( + const TInt aError ) + { + __VTPRINTENTER( "LocVid.LayoutCH.CompleteOperation" ) + iLocalVideo->CompleteOperation( aError ); + __VTPRINTEXIT( "LocVid.LayoutCH.CompleteOperation" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TVtEngLayoutChangeHandler::ProviderError +// ----------------------------------------------------------------------------- +// +TBool CVtEngLocalVideo::TVtEngLayoutChangeHandler::ProviderError( TInt aError ) + { + TBool handled( EFalse ); + __VTPRINTENTER( "LocVid.LayoutCH.ProviderError" ) + if ( iState != EIdle && iState != ELayoutChangePending ) + { + handled = ETrue; + Complete( aError ); + } + __VTPRINTEXITR( "LocVid.LayoutCH.ProviderError %d", handled ) + return handled; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TVtEngLayoutChangeHandler::ProviderReady +// ----------------------------------------------------------------------------- +// +TBool CVtEngLocalVideo::TVtEngLayoutChangeHandler::ProviderReady() + { + TBool handled( EFalse ); + __VTPRINTENTER( "LocVid.LayoutCH.ProviderReady" ) + switch ( iState ) + { + case ESwitchingCamera: + case EIdle: + break; + + case EInitializingCamera: + handled = ETrue; + iState = ESwitchingCamera; + TRAPD( error, iLocalVideo->SelectSourceL( iStored ) ); + if ( error ) + { + Complete( error ); + } + break; + + case ESwitchingBlank: + handled = ETrue; + break; + } + __VTPRINTEXITR( "LocVid.LayoutCH.ProviderReady %d", handled ) + return handled; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::TVtEngLayoutChangeHandler::ProviderSwitchDone +// ----------------------------------------------------------------------------- +// +TBool CVtEngLocalVideo::TVtEngLayoutChangeHandler::ProviderSwitchDone( + CVSDataProvider* aOldProvider ) + { + TBool handled( EFalse ); + __VTPRINTENTER( "LocVid.LayoutCH.ProviderSwitchDone" ) + switch ( iState ) + { + case EIdle: + // nothing to do + break; + + case ESwitchingBlank: + { + __VTPRINT( DEBUG_MEDIA, + "LocVid.LayoutCH.ProviderSwitchDone ESwitchingBlank" ) + handled = ETrue; + iState = EInitializingCamera; + TProviderItem* providerItem; + const TInt result( + iLocalVideo->GetProviderByInstance( aOldProvider, providerItem ) ); + if ( result != KErrNotFound ) + { + iLocalVideo->DeleteProvider( *providerItem ); + iLocalVideo->iCameraPref->SetProvider( NULL, + *iLocalVideo->iActiveProvider ); + + __VTPRINT( DEBUG_MEDIA, + "LocVid.LayoutCH.ProviderSwitchDone initializing provider" ) + + TRAPD( error, iLocalVideo->InitializeProviderL( *providerItem ) ); + + if ( error ) + { + __VTPRINT2( DEBUG_MEDIA, + "LocVid.LayoutCH.ProviderSwitchDone ERROR %d in initialize", + error ) + Complete( error ); + } + } + else + { + __VTPRINT( DEBUG_MEDIA, + "LocVid.LayoutCH.ProviderSwitchDone provider NOT found" ) + Complete( result ); + } + } + break; + + case EInitializingCamera: + handled = ETrue; + break; + + case ESwitchingCamera: + __VTPRINT( DEBUG_MEDIA, + "LocVid.LayoutCH.ProviderSwitchDone ESwitchingCamera" ) + TRAP_IGNORE( iLocalVideo->StartViewFinderIfWasStartedL() ); + //Re-Set provider to camera preference. Otherwise, after layout change, the provider in camera preference will be invalid + iLocalVideo->iCameraPref->SetProvider( iLocalVideo->iActiveProvider->iProvider, + *iLocalVideo->iActiveProvider ); + handled = ETrue; + __VTPRINT( DEBUG_MEDIA, + "LocVid.LayoutCH.ProviderSwitchDone reinit done" ) + Complete( KErrNone ); + break; + } + __VTPRINTEXITR( "LocVid.LayoutCH.ProviderSwitchDone %d", handled ) + return handled; + } + +// ----------------------------------------------------------------------------- +// 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 +// ----------------------------------------------------------------------------- +// +CVtEngCameraPreferences* CVtEngLocalVideo::CreateCameraPreferencesL() + { + __VTPRINTENTER( "LocVid.CreateCameraPreferencesL" ) + iCameraPref = CVtEngCameraPreferences::NewL(); + + // Check if provider exist and set it + // as provider to camera preferences + if ( iActiveProvider ) + { + __VTPRINT( DEBUG_MEDIA, + "LocVideo.CreateCameraPreferencesL SetProvider" ) + iCameraPref->SetProvider( iActiveProvider->iProvider, + *iActiveProvider ); + } + + __VTPRINTEXIT( "LocVid.CreateCameraPreferencesL" ) + return iCameraPref; + } + +// ----------------------------------------------------------------------------- +// CVtEngLocalVideo::CancelInitializeShareImage +// ----------------------------------------------------------------------------- +// +void CVtEngLocalVideo::CancelInitializeShareImage() + { + __VTPRINTENTER( "CVtEngLocalVideo.CancelInitializeShareImage"); + iShareImage->CancelInitialize(); + __VTPRINTEXIT( "CVtEngLocalVideo.CancelInitializeShareImage"); + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Media/CVtEngMediaHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Media/CVtEngMediaHandler.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,4576 @@ +/* +* Copyright (c) 2004-2007 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: Implementation of video session interface. +* +*/ + + +// INCLUDE FILES +#include "CVtEngMediaHandler.h" +#include "CVtEngLocalVideo.h" +#include "CVtEngRemoteVideo.h" +#include "MVtEngFrameObserver.h" +#include "CVtEngStateManager.h" +#include "CVtEngOperation.h" +#include "TVtEngRendering.h" +#include "TVtEngRenderingDSA.h" +#include "TVtEngRenderingDP.h" +#include "TVtEngRenderingNGA.h" +#include "VtEngUtils.h" +#include "CVtEngInitializer.h" +#include "CVtEngEventManager.h" +#include "CVtEngSettings.h" +#include "CVtEngHandlerContainer.h" +#include "MVtEngDtmfHandler.h" +#include "cvtengmdtrcommandsender.h" +#include "VtEngPanic.h" +#include +#include +#include +#include +#include +#include // BigEndian + +#include +#include "cvtengrecord2file.h" + +// MACROS +#ifdef VTDEBUG +// In debug mode sinks and sources are not necessarily added. +#define ADD_VIDEO_SINK { \ + if ( DEBUG_CFG_NO_VIDEO_SINK == 0 ) { AddVideoSink(); } } +#define ADD_VIDEO_SOURCE { \ + if ( DEBUG_CFG_NO_VIDEO_SOURCE == 0 ) { AddVideoSource(); } } +#define ADD_AUDIO_SOURCE \ + { if ( DEBUG_CFG_NO_AUDIO_SOURCE == 0 ) { AddAudioSource(); } } +#define ADD_AUDIO_SINK \ + { if ( DEBUG_CFG_NO_AUDIO_SINK == 0 ) { AddAudioSink(); } } +#else +// In release mode they are added. +#define ADD_VIDEO_SINK AddVideoSink(); +#define ADD_VIDEO_SOURCE AddVideoSource(); +#define ADD_AUDIO_SOURCE AddAudioSource(); +#define ADD_AUDIO_SINK AddAudioSink(); +#endif // VTDEBUG + +// CONSTANTS +const TInt KVtEngOperationArraySize = 2; +// System version string buffer length. +const TInt KVtEngSwVersionTextLength = KSysUtilVersionTextLength; +// Country code for version information. +const TUint8 KVtEngCountryCodeForProto = 60; +// Extension code for version information (unknown). +const TUint8 KVtEngExtensionForProto = 0; +// Manufacturer code for version information (unknown). +const TUint32 KVtEngManufacturerForProto = 0; +// Timer to detect too long disconnect. +const TInt KVtEngDisconnectionTimer = 20000000; +// Space character constant. +const TText KVtEngCharacterSpace( ' ' ); +// New line (\n) character constant. +const TInt KVtEngCharacterEndLine( 10 ); + +// Multiplex delay in milliseconds +//const TInt KVtEngMultiplexingDelay = 150; + +// TradeOff values +const TInt KVtEngTradeOffDetailMax = 9; +const TInt KVtEngTradeOffNormalMax = 19; +const TInt KVtEngTradeOffMotionMax = 31; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::CVtEngMediaHandler +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngMediaHandler::CVtEngMediaHandler() : + iProtoState( MVtProtocolCommand::EIdle ), + iAudioCtrl(0), + iProtoMaxVolume(0), + iTempProviderInfo( CVtEngLocalVideo::KVtEngProviderNone ), + iH324Config( 0 ), + iH263Encoder( 0 ) + { + if ( CVtEngUtility::Settings().IsDefaultStillImageDefined() ) + { + iTempProviderInfo = CVtEngLocalVideo::KVtEngProviderDefaultStillImage; + } + + // Check is AMR-WB supported or not in platform. Adjusted using local + // variation. + if ( CVtEngUtility::Settings().CheckBits( KVTLVFlagEnableAMR_WB ) ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_CONSTRUCT, "MH.c++ AMR-WB set ON" ) + iSdkInitInfo.iAMRWBOn = ETrue; + } + else + { + __VTPRINT( DEBUG_MEDIA | DEBUG_CONSTRUCT, "MH.c++ AMR-WB set OFF" ) + iSdkInitInfo.iAMRWBOn = EFalse; + } + + if ( CVtEngUtility::Settings().CheckBits( KVTLVFlagDisableMpeg4 ) ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_CONSTRUCT, "MH.c++ Mpeg4 set OFF" ) + iSdkInitInfo.iDisableMpeg4 = ETrue; + } + else + { + __VTPRINT( DEBUG_MEDIA | DEBUG_CONSTRUCT, "MH.c++ Mpeg4 set ON" ) + iSdkInitInfo.iDisableMpeg4 = EFalse; + } + + __VTPRINT( DEBUG_MEDIA | DEBUG_CONSTRUCT, "MH.c++" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::ConstructL() + { + __VTPRINTENTER( "MH.ConstructL" ) + + iAsyncCallback = CIdle::NewL( CActive::EPriorityHigh ); + iPendingOps = new ( ELeave) + CArrayFixFlat( KVtEngOperationArraySize ); + iPendingOps->SetReserveL( KVtEngOperationArraySize ); + + __VTPRINT2( DEBUG_MEDIA, "DebugFlags used are %d", CVtLogger::Flags() ) + + iLocalVideo = CVtEngLocalVideo::NewL( *this ); + __VTPRINTEXIT( "MH.ConstructL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtEngMediaHandler* CVtEngMediaHandler::NewL() + { + CVtEngMediaHandler* self = new( ELeave )CVtEngMediaHandler(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::~CVtEngMediaHandler +// Destructor. Cannot leave. +// ----------------------------------------------------------------------------- +// +CVtEngMediaHandler::~CVtEngMediaHandler() + { + __VTPRINTENTER( "MH.~" ) + if ( iPendingOps ) + { + iPendingOps->Reset(); // Make sure this is empty + delete iPendingOps; + } + delete iPendingOp; + delete iTimer; + delete iAsyncCallback; + delete iLocalVideo; + delete iRemoteVideo; + __VTPRINTEXIT( "MH.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::GetMediaState +// Returns media state. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::GetMediaState( + const TMediaDirection aMediaDirection, + TInt& aActiveMedia ) const + { + __VTPRINT2( DEBUG_MEDIA, "MH.GetMediaState direction=%d", aMediaDirection ) + aActiveMedia = 0; + switch ( aMediaDirection ) + { + case EMediaOutgoing: + { + const TInt result( iLocalVideo->GetMediaState( aActiveMedia ) ); + if ( !IsFlag( EOutVideoChannelClosed ) ) + { + aActiveMedia |= EMediaVideoChannelOpen; + } + if ( !IsFlag( EOutAudioChannelClosed ) ) + { + aActiveMedia |= EMediaAudioChannelOpen; + } + return result; + } + + case EMediaIncoming: + aActiveMedia = iRemoteMediaState; + if ( ( iRemoteVideo && !iRemoteVideo->GetDsaState() ) ) + { + aActiveMedia &= (~EMediaVideo); + } + __VTPRINT2( DEBUG_MEDIA, "MH.remoteState=%d", aActiveMedia ) + return KErrNone; + + default: + break; + } + return KErrNotSupported; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::RenderingStarted +// Returns the state of video. +// ----------------------------------------------------------------------------- +// +TBool CVtEngMediaHandler::RenderingStarted( + const TMediaDirection aDirection ) const + { + __VTPRINT2( DEBUG_MEDIA, "MH.RS %d", aDirection ) + TBool started( EFalse ); + if( aDirection == EMediaOutgoing ) + { + started = iLocalVideo->ViewFinderStarted(); + } + else // EMediaIncoming + { + started = iRemoteVideo->GetDsaState(); + } + + __VTPRINT2( DEBUG_MEDIA, "MH.RS started %d", started ) + return started; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::GetSource +// Returns active source. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::GetSource( TMediaSource& aSource ) const + { + TInt err( KErrNotReady ); + if ( iLocalVideo ) + { + aSource = iLocalVideo->GetMediaSource(); + err = KErrNone; + } + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::GetSourcesCaps +// Returns source selection capabilities. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::GetSourcesCaps( TInt& aCaps ) const + { + TInt err( KErrNotReady ); + if ( iLocalVideo ) + { + err = iLocalVideo->GetSourceCaps( aCaps ); + } + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::GetCurrentCameraId +// Returns current camera. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::GetCurrentCameraId( TCameraId& aId ) const + { + __VTPRINT( DEBUG_GEN, "MH.GetCurrentCameraId") + aId = iSelectedCameraId; + TInt err( KErrNotReady ); + + TBool initialized( EFalse ); + err = iLocalVideo->IsInitialized( aId, initialized ); + if ( !initialized && ( err != KErrInUse ) ) + { + __VTPRINT2( DEBUG_GEN, "MH.GetCurrentCameraId err=%d", KErrNotReady ) + return KErrNotReady; + } + __VTPRINT2( DEBUG_GEN, "MH.GetCurrentCameraId initialized err=%d", err ) + return err;//Not initialized + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::GetCameraInfo +// Returns camera information. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::GetCameraInfo( + const TCameraId aId, TCameraInfo& aInfo ) const + { + return iLocalVideo->GetCameraInfo( aId, aInfo ); + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::GetCurrentZoomStep +// Returns current zooming. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::GetCurrentZoomStep( TInt& aCurrentStep ) + { + return iLocalVideo->GetDigitalZoomFactor( aCurrentStep ); + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::GetMaxZoomStep +// Returns maximum zooming. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::GetMaxZoomStep( TInt& aMaxZoomStep ) + { + return iLocalVideo->GetMaxDigitalZoomStep( aMaxZoomStep ); + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::GetMajorZoomStepCount +// Gets number of major zoom level leaps. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::GetMajorZoomStepCount( TInt& aCount ) + { + return iLocalVideo->GetMajorDigitalZoomStepCount( aCount ); + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::GetMajorZoomStep +// Maps major zoom leap step to corresponding step index. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::GetMajorZoomStep( TInt aIndex, TInt& aStep ) + { + if ( iLocalVideo ) + { + iLocalVideo->GetMajorDigitalZoomStep( aIndex, aStep ); + } + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::GetFreezeSupported +// Maps major zoom leap step to corresponding step index. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::GetFreezeSupported( TBool& aFreezeSupported) const + { + if ( iLocalVideo ) + { + return iLocalVideo->GetFreezeSupported( aFreezeSupported ); + } + return KErrNotReady; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::GetFreezeState +// Returns KErrNotReady if provider is not ready yet. If KErrNone is returned +// then aFrozen will be ETrue if the provider is frozen, EFalse otherwise. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::GetFreezeState( TBool& aFrozen ) const + { + if ( iLocalVideo ) + { + aFrozen = iLocalVideo->IsFrozen(); + return KErrNone; + } + return KErrNotReady; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::GetDsaState +// Returns media state. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::GetDsaState( + const TMediaDirection aMediaDirection, + TBool& aActive ) const + { + if ( !iRemoteVideo ) + { + return KErrNotReady; + } + switch ( aMediaDirection ) + { + case EMediaOutgoing: + break; + case EMediaIncoming: + aActive = iRemoteVideo->GetDsaState(); + return KErrNone; + default: + break; + } + return KErrNotSupported; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::VideoCallConnected +// ----------------------------------------------------------------------------- +// +TBool CVtEngMediaHandler::VideoCallConnected () const + { + TBool connected = EFalse; + if ( MVtProtocolCommand::EConnected == iProtoState ) + { + connected = ETrue; + } + return connected; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::GetVideoQuality +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::GetVideoQuality( TVideoQuality& aVideoQuality ) const + { + __VTPRINTENTER( "MH.GetVideoQuality" ) + aVideoQuality = iVideoQuality.VideoQuality(); + __VTPRINTEXIT( "MH.GetVideoQuality" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::GetObjectSharingState +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::GetObjectSharingState( + TShareObjectState& aObjectSharingState ) const + { + __VTPRINTENTER( "MH.GetObjectSharingState" ) + if( iProtoState == MVtProtocolCommand::EConnected ) + { + iLocalVideo->GetObjectSharingState( aObjectSharingState ); + } + else + { + aObjectSharingState = ENotAbleToShare; + } + __VTPRINTEXIT( "MH.GetObjectSharingState" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::GetCameraOrientations +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::GetCameraOrientations( + TCameraOrientation& aPrimaryCameraOrientation, + TCameraOrientation& aSecondaryCameraOrientation ) const + { + __VTPRINTENTER( "MH.GetCameraOrientations" ) + CVtEngSettings& settings = CVtEngUtility::Settings(); + settings.GetCameraOrientations( aPrimaryCameraOrientation, + aSecondaryCameraOrientation ); + __VTPRINTEXIT( "MH.GetCameraOrientations" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::RequestLastRemoteFrame +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::RequestLastRemoteFrame( ) + { + __VTPRINTENTER( "MH.RequestLastRemoteFrame" ) + if( iRemoteVideo ) + iRemoteVideo->RequestLastFrame(); + __VTPRINTEXIT( "MH.RequestLastRemoteFrame" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::ValidateCommand +// Checks if command is valid in current proto state. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::ValidateCommand( const TVtEngCommandId aCommand ) const + { + __VTPRINTENTER( "MH.ValidateCommand" ) + __VTPRINT2( DEBUG_MEDIA, "MH.ValidateCommand cmd=%d", aCommand ) + TInt okToPerform( KErrNotReady ); + if ( iInitialized ) + { + switch ( aCommand ) + { + case KVtEngMuteOutgoingAudio: + case KVtEngUnmuteOutgoingAudio: + // mute/unmute not possible if audio channel closed. + if ( IsFlag( EOutAudioChannelClosed ) ) { + break; + } + case KVtEngSetAudioRouting: + case KVtEngSetAudioVolume: + if ( ( iProtoState == MVtProtocolCommand::EConnected ) && !iPendingOp ) + { + okToPerform = KErrNone; + } + break; + case KVtEngIncreaseAudioVolume: + case KVtEngDecreaseAudioVolume: + + if ( iProtoState == MVtProtocolCommand::EConnected ) + { + okToPerform = KErrNone; + } + break; + case KVtEngRequestLastRemoteFrame: + if ( iProtoState == MVtProtocolCommand::EConnected ) + { + okToPerform = KErrNone; + } + break; + case KVtEngPrepareViewFinder: + case KVtEngPrepareViewFinderDSA: + case KVtEngPrepareRemoteRenderDSA: + case KVtEngPrepareViewFinderDP: + case KVtEngPrepareRemoteRenderDP: + case KVtEngPrepareRemoteRenderNGA: + okToPerform = KErrNone; // can be done any time + break; + + case KVtEngHandleLayoutChange: + if ( iLocalVideo && iLocalVideo->ActiveProvider() != + CVtEngLocalVideo::KVtEngProviderNone && + !iPendingOp && iLocalVideo->ActiveProvider() != + CVtEngLocalVideo::KVtEngProviderImage ) + { + okToPerform = KErrNone; + } + break; + + case KVtEngSetZoomStep: + { + const CVtEngLocalVideo::TVtEngProviderType + activeProvider( iLocalVideo->ActiveProvider() ); + if ( iRequestStatus == NULL && + iVSInitState == EInitStateNone && + ( activeProvider == CVtEngLocalVideo::KVtEngProviderCam1 || + activeProvider == CVtEngLocalVideo::KVtEngProviderCam2 ) ) + { + okToPerform = KErrNone; + } + } + break; + case KVtEngSetSource: + if ( !IsFlag( EOutVideoChannelClosed ) ) + { + okToPerform = KErrNone; + } + // when EOutVideoChannelClosed is active + // don't allow source switch because it may require + // pause or resume on Protocol which would fail when video + // channel is closed. + // Note1: this is especially for the case when channel is + // closed after being already open. + // Note2: it must be possible to set source already before Protocol + // is connected (in MONA calls) so Proto state check is not done. + break; + case KVtEngPrepareCamera: + case KVtEngStartViewFinder: + case KVtEngFreeze: + case KVtEngUnfreeze: + if ( iRequestStatus == NULL && + // If initialising or change provider during reset then + // not allowed + iVSInitState == EInitStateNone && + // If terminate ongoing then not allowed + iProtoState != MVtProtocolCommand::EIdle ) + { + okToPerform = KErrNone; + if( aCommand == KVtEngFreeze ) + { + if( !iLocalVideo->OkToFreeze() ) + { + okToPerform = KErrNotReady; + } + } + else if( aCommand == KVtEngUnfreeze ) + { + if( !iLocalVideo->OkToUnfreeze() ) + { + okToPerform = KErrNotReady; + } + } + } + break; + case KVtEngSetVideoQuality: + if( IsPending( ESetVideoQuality ) != KErrNotFound ) + { + okToPerform = KErrNotReady; + } + else + { + if ( iRequestStatus == NULL && iProtoState != MVtProtocolCommand::EIdle ) + { + okToPerform = KErrNone; + } + } + break; + + case KVtEngInitializeShareImage: + { + TShareObjectState objectSharingState; + GetObjectSharingState( objectSharingState ); + if ( ( objectSharingState != ENotAbleToShare ) && + ( objectSharingState != EInitializingShareImage ) && + !IsFlag( EOutVideoChannelClosed ) ) + { + okToPerform = KErrNone; + } + } + break; + + case KVtEngStartShareImage: + { + TShareObjectState objectSharingState; + GetObjectSharingState( objectSharingState ); + if( objectSharingState != ENotAbleToShare ) + { + okToPerform = KErrNone; + } + } + break; + + case KVtEngStopShareImage: + { + TShareObjectState objectSharingState; + GetObjectSharingState( objectSharingState ); + if ( ( objectSharingState == ESharingImage ) && + !IsFlag( EOutVideoChannelClosed ) ) + { + okToPerform = KErrNone; + } + } + break; + + case KVtEngTerminateSession: + if ( iProtoState == MVtProtocolCommand::EConnected || + iProtoState == MVtProtocolCommand::EConnecting ) + { + okToPerform = KErrNone; + } + break; + + default: + okToPerform= KErrNotSupported; + break; + } + } + __VTPRINT2( DEBUG_MEDIA, "MH.ValidateCommand okToPerform=%d", okToPerform ) + __VTPRINTEXIT( "MH.ValidateCommand" ) + return okToPerform; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::IsVideoChannelClosed +// ----------------------------------------------------------------------------- +// +TBool CVtEngMediaHandler::IsVideoChannelClosed() const + { + __VTPRINTENTER( "MH.IsVideoChannelClosed" ) + const TBool result( IsFlag( EOutVideoChannelClosed ) ); + __VTPRINTEXITR( "MH.IsVideoChannelClosed %d", result ) + return result; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::HandleL +// Handles a request. +// +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::HandleL( CVtEngOperation& aOperation ) + { + __VTPRINTENTER( "MH.HandleL" ) + + const TVtEngCommandId id( aOperation.Command() ); + if ( !iInitialized ) + { + __VTPRINT( DEBUG_MEDIA, "MH.Handle not ready" ) + User::Leave( KErrNotReady ); + } + __VTPRINT2( DEBUG_MEDIA, "MH.Handle cmdId=%d", id ) + switch ( id ) + { + case KVtEngSetUIForeground: + TBool foregroundValue; + TVtEngOpParamUtil::Set( foregroundValue, aOperation ); + if( iLocalVideo ) + { + iLocalVideo->SetUIForeground( foregroundValue ); + } + if( iRemoteVideo ) + { + iRemoteVideo->SetUIForegroundL( foregroundValue ); + } + break; + + case KVtEngSetAudioVolume: + { + __VTPRINT( DEBUG_MEDIA, "MH.Handle.Vol" ) + MVtEngAudio::TVtEngOutputVolume volSetting; + TVtEngOpParamUtil::Set( + volSetting, aOperation ); + + // Store volume. + CVtEngSettings& settings = CVtEngUtility::Settings(); + settings.SetVolume( + volSetting.iHandsetVolume, + volSetting.iHandsfreeVolume, + ETrue ); + settings.SetVolume( + volSetting.iHandsetVolume, + volSetting.iHandsfreeVolume, + EFalse ); + + // Update volume. + iPendingVolumeOp = &aOperation; + AssignPendingOp( aOperation ); + UpdateVolume(); + + if ( IsPending( ESetAudioVolume ) == KErrNotFound ) + { + // No volume operation ongoing. Need to complete operation by itself. + AsyncCompleteOp(); + } + } + break; + + case KVtEngIncreaseAudioVolume: + { + CVtEngAudioHandler& audioHandler( + static_cast< CVtEngAudioHandler& >( + CVtEngUtility::StateManager()->Handlers().Audio() ) ); + if ( audioHandler.IncreaseVolume() ) + { + UpdateVolume(); + } + } + break; + + case KVtEngDecreaseAudioVolume: + { + CVtEngAudioHandler& audioHandler( + static_cast< CVtEngAudioHandler& >( + CVtEngUtility::StateManager()->Handlers().Audio() ) ); + if ( audioHandler.DecreaseVolume() ) + { + UpdateVolume(); + } + } + break; + + case KVtEngMuteOutgoingAudio: + { + // No Local video if not on target +#if !defined( __WINS__ ) + AddOperation( EMuteAudio, + iSessionCommand->PauseAudioL( *iLocalVideo->AudioSource()) ); +#endif // !WINS + AssignPendingOp( aOperation ); + } + break; + case KVtEngUnmuteOutgoingAudio: + { + // No Local video if not on target +#if !defined( __WINS__ ) + AddOperation ( EUnmuteAudio, + iSessionCommand->ResumeAudioL( *iLocalVideo->AudioSource() ) ); +#endif // !WINS + AssignPendingOp( aOperation ); + } + break; + case KVtEngPrepareViewFinder: + { + const TPckgC& pckg = + static_cast< const TPckgC& > + ( *aOperation.Parameters() ); + const TVtEngRenderingOptionsNGA &options = pckg(); + iLocalVideo->SetViewFinderParameters( options ); + } + break; + case KVtEngPrepareRemoteRenderNGA: + { + const TPckgC& pckg = + static_cast< const TPckgC& > + ( *aOperation.Parameters() ); + const TVtEngRenderingOptionsNGA& options = pckg(); + iRemoteVideo->SetRenderingParametersL( options ); + } + break; + case KVtEngPrepareViewFinderDSA: + case KVtEngPrepareRemoteRenderDSA: + { + const TPckgC& pckg = + static_cast< const TPckgC& > + ( *aOperation.Parameters() ); + const TVtEngRenderingOptionsDSA& options = pckg(); + if ( id == KVtEngPrepareViewFinderDSA ) + { + iLocalVideo->SetViewFinderParameters( options ); + } + else if ( iRemoteVideo ) + { + iRemoteVideo->SetRenderingParametersL( options ); + } + } + break; + + case KVtEngPrepareViewFinderDP: + case KVtEngPrepareRemoteRenderDP: + { + const TPckgC& pckg = + static_cast< const TPckgC& > + ( *aOperation.Parameters() ); + const TVtEngRenderingOptionsDP& options = pckg(); + if ( id == KVtEngPrepareViewFinderDP ) + { + iLocalVideo->SetViewFinderParameters( options ); + } + else if ( iRemoteVideo ) + { + iRemoteVideo->SetRenderingParametersL( options ); + } + } + break; + + case KVtEngHandleLayoutChange: + iLocalVideo->HandleLayoutChangeL(); + AssignPendingOp( aOperation ); + break; + + case KVtEngSetSource: + { + __VTPRINT( DEBUG_MEDIA, "MH.set source" ) + MVtEngMedia::TMediaSource source; + TVtEngOpParamUtil::Set( source, + aOperation ); + + iLocalVideo->InitializeOnly( EFalse ); + TOperation startedOp( ENone ); + switch ( source ) + { + case EMediaCamera: + __VTPRINT( DEBUG_MEDIA, "EMediaCamera" ) + iTempProviderInfo = + ( iSelectedCameraId == ESecondaryCamera ) ? + CVtEngLocalVideo::KVtEngProviderCam2 : + CVtEngLocalVideo::KVtEngProviderCam1; + + SetFlag( EProtoContVideoBlankProv ); + startedOp = EnableVideoL( ETrue ); + if ( startedOp == ENone ) + { + // Did nothing + ClearFlag( EProtoContVideoBlankProv ); + } + iLocalVideo->ResumeVideoSending(); + break; + case EMediaCameraPri: + __VTPRINT( DEBUG_MEDIA, "EMediaCameraPri" ) + iTempProviderInfo = CVtEngLocalVideo::KVtEngProviderCam1; + iSelectedCameraId = EPrimaryCamera; + ClearFlag( EProtoContVideoBlankProv ); + break; + case EMediaCameraSec: + __VTPRINT( DEBUG_MEDIA, "EMediaCameraSec" ) + iTempProviderInfo = CVtEngLocalVideo::KVtEngProviderCam2; + iSelectedCameraId = ESecondaryCamera; + ClearFlag( EProtoContVideoBlankProv ); + break; + case EMediaStillImage: + __VTPRINT( DEBUG_MEDIA, "EMediaStillImage" ) + iTempProviderInfo = CVtEngLocalVideo::KVtEngProviderImage; + SetFlag( EProtoContVideoBlankProv ); + startedOp = EnableVideoL( ETrue ); + if ( startedOp == ENone ) + { + // Did nothing + ClearFlag( EProtoContVideoBlankProv ); + } + break; + case EMediaNone: + __VTPRINT( DEBUG_MEDIA | DEBUG_RETURN, "EMediaNone" ) + if ( CVtEngUtility::Settings(). + IsDefaultStillImageDefined() ) + { + iTempProviderInfo = + CVtEngLocalVideo::KVtEngProviderDefaultStillImage; + + SetFlag( EProtoContVideoBlankProv ); + startedOp = EnableVideoL( ETrue ); + if ( startedOp == ENone ) + { + // Did nothing + ClearFlag( EProtoContVideoBlankProv ); + } + } + else + { + iTempProviderInfo = + CVtEngLocalVideo::KVtEngProviderNone; + + ClearFlag( EProtoContVideoBlankProv ); + SetFlag( EProtoPauseVideoBlankProv ); + if ( !IsFlag( + EProtoVideoSourceAdded ) && iProtoState != MVtProtocolCommand::EConnected ) + { + // Set as not enabled video when no sources + __VTPRINT( DEBUG_MEDIA, "MH.set blanked - not ready" ) + EnableVideoL( EFalse ); + } + else + { + // we have "done" something + startedOp = EDisableVideo; + iLocalVideo->PauseVideoSending(); + } + } + break; + default: + __VTPRINT( DEBUG_MEDIA, "invalid source" ) + User::Leave( KErrArgument ); + } + TBool selectOngoing( EFalse ); + ClearFlag( ESourceUpdateNeeded ); + TInt err( KErrNone ); + + // Either pausing or switching between still and camera + if ( !IsFlag( EProtoContVideoBlankProv ) ) + { + TRAP( err, selectOngoing = + iLocalVideo->SelectSourceL( iTempProviderInfo ) ); + __VTPRINT3( DEBUG_MEDIA, " ongoing=%d, op=%d",selectOngoing, + startedOp ) + } + + if ( ( selectOngoing || IsFlag( EProtoContVideoBlankProv ) || + IsFlag( EProtoContVideoBlankInit ) ) && + startedOp != ENone && err == KErrNone ) + { + // Enabling/disabling video started. Set flag that operation + // should be completed only when both callback from Protocol and + // local video (switch done) are complete. + __VTPRINT( DEBUG_MEDIA, "MH.set source 2stage" ) + SetFlag( ETwoStageOperation ); + } + else + { + User::LeaveIfError( err ); + } + AssignPendingOp( aOperation ); + } + break; + case KVtEngPrepareCamera: + { + __VTPRINT( DEBUG_MEDIA, "MH.prepare cam" ) + MVtEngMedia::TPrepareCameraParams params; + if ( aOperation.Parameters() ) + { + TVtEngOpParamUtil< MVtEngMedia::TPrepareCameraParams > + ::Set( params, aOperation ); + } + else + { + params.iMediaSource = EMediaCamera; + params.iInitialize = ETrue; + } + CVtEngLocalVideo::TVtEngProviderType + type( CVtEngLocalVideo::KVtEngProviderCam1 ); + switch ( params.iMediaSource ) + { + case EMediaCamera: + type = ( iSelectedCameraId == ESecondaryCamera ) ? + CVtEngLocalVideo::KVtEngProviderCam2 : + CVtEngLocalVideo::KVtEngProviderCam1; + break; + case EMediaCameraPri: + iSelectedCameraId = EPrimaryCamera; + type = CVtEngLocalVideo::KVtEngProviderCam1; + break; + case EMediaCameraSec: + iSelectedCameraId = ESecondaryCamera; + type = CVtEngLocalVideo::KVtEngProviderCam2; + break; + default: + User::Leave( KErrArgument ); + break; + } + iLocalVideo->SetIsPrepareCameraCalled( ETrue ); + AssignPendingOp( aOperation ); + if ( params.iInitialize ) + { + __VTPRINT( DEBUG_MEDIA, "MH.prepare cam iInitialize TRUE" ) + iLocalVideo->InitializeOnly(); + ClearFlag( ESourceUpdateNeeded ); + iLocalVideo->SelectSourceL( type ); + } + else + { + __VTPRINT( DEBUG_MEDIA, + "MH.prepare cam iInitialize FALSE, complete with KErrNone" ) + AsyncCompleteOp( KErrNone ); + } + } + break; + + case KVtEngSetZoomStep: + { + TInt zoom( 0 ); + TVtEngOpParamUtil::Set( zoom, aOperation ); + iLocalVideo->SetDigitalZoomFactorL( zoom ); + } + break; + + case KVtEngFreeze: + iLocalVideo->FreezeL(); + break; + + case KVtEngUnfreeze: + iLocalVideo->UnfreezeL(); + AssignPendingOp( aOperation ); + break; + + case KVtEngStartViewFinder: + iLocalVideo->StartViewFinderL( ETrue ); + break; + case KVtEngStopViewFinder: + iLocalVideo->StopViewFinder( ETrue ); + break; + case KVtEngStartRenderRemote: + iRemoteVideo->StartVideoL(); + break; + case KVtEngStopRenderRemote: + iRemoteVideo->StopVideoRendering(); + break; + case KVtEngPauseRenderRemote: + iRemoteVideo->PauseVideoL(); + break; + case KVtEngRequestLastRemoteFrame: + RequestLastRemoteFrame(); + break; + case KVtEngTerminateSession: + AssignPendingOp( aOperation ); + break; + + // Set video quality + case KVtEngSetVideoQuality: + { + TVideoQuality videoQuality( EVideoQualityUndefined ); + TVtEngOpParamUtil< TVideoQuality >::Set( videoQuality, aOperation ); + SetPeerVideoQuality( videoQuality ); + } + break; + + // Initialize share + case KVtEngInitializeShareImage: + { + TShareObjectImageParameters parameters; + TVtEngOpParamUtil< TShareObjectImageParameters >::Set( + parameters, aOperation ); + TBool firstTime = EFalse; + iLocalVideo->InitializeShareImageL( parameters, firstTime ); + AssignPendingOp( aOperation ); + if ( firstTime ) + { + iVideoAction = IsFlag( EProtoVideoTrackPaused ) ? + EVideoActionEnable : EVideoActionNone; + } + } + break; + + // Start share + case KVtEngStartShareImage: + iLocalVideo->StartShareImageL(); + AssignPendingOp( aOperation ); + break; + + // Stop Image sharing + case KVtEngStopShareImage: + { + // If video sending needs to be paused when sharing is stopped + // then do it before doing the actual provider switch. It is + // done before hand to prevent dummy frame sending to receiving + // end (ie. black frame). + const TBool needsPause( iLocalVideo->ShareStoredSource() == + CVtEngLocalVideo::KVtEngProviderNone ); + if ( needsPause ) + { + // With this flag we prevent premature operation + // complete after the pause command has been executed. + iPauseNoCompleteOp = ETrue; + EnableVideoL( EFalse ); + } + // reset the action flag. + iVideoAction = EVideoActionNone; + iLocalVideo->StopShareImageL(); + AssignPendingOp( aOperation ); + } + break; + + default: + User::Leave( KErrNotSupported ); + break; + } + __VTPRINTEXIT( "MH.HandleL" ) + } + + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::HandleSessionCommandEventL +// Handles command completion in protocol engine. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::HandleSessionCommandEventL( + const TVtCommandResponse& aResponse ) + { + __VTPRINTENTER( "MH.HandleSessionCommandEventL" ) + const TVtCommandType type( aResponse.iCmdType ); + if ( type == EVtCommandGetSDKInfo ) + { + // ignore completely + __VTPRINTEXIT( "MH.HandleSessionCommandEventL" ) + return; + } + const TInt protoCmdId( aResponse.iCmdId ); + const TInt protoResponse( aResponse.iCmdStatus ); + TInt event( KVtEngEventNone ); + __VTPRINT2( DEBUG_MEDIA, "MH.protoComC type=%d", type ) + __VTPRINT3( DEBUG_MEDIA, "MH.protoComC cmdId=%d,response=%d", protoCmdId, protoResponse ) + + CVtEngStateManager* states = CVtEngUtility::StateManager(); + switch ( type ) + { + case EVtCommandGetProtocolState: + break; + case EVtCommandInit://PVT_COMMAND_INIT -> ESetup + { + CVtEngUtility* utils = CVtEngUtility::EngineUtils(); + iSessionCommand = utils->Initializer().GetSessionCommand(); + iRemoteVideo = CVtEngRemoteVideo::NewL( *iSessionCommand, *states ); + iInitialized = ETrue; + iProtoState = MVtProtocolCommand::ESetup; + __VTPRINT( DEBUG_MEDIA, "MH.protoComC: ESetup" ) + states->Update(); + + // Get interfaces towards H324 and video encoder + QueryProtoInterfacesL(); + } + break; + case EVtCommandGetProtocolInterface: + { + __VTPRINT2( DEBUG_MEDIA, "MH.protoComC:IF response=%d", protoCmdId ) + if ( protoResponse == KErrNone && + ( iProtoState == MVtProtocolCommand::ESetup || + iProtoState == MVtProtocolCommand::EInitializing || // Allowed to query when initializing also + iProtoState == MVtProtocolCommand::EConnecting || + iProtoState == MVtProtocolCommand::EConnected ) ) + { + __ASSERT_DEBUG( + IsPending( EGet324CtrlInterface ) != KErrNotFound + || IsPending( EGetH263EncInterface ) != KErrNotFound, + Panic( EVtEngPanicMediaHandlerOpStateFailure ) ); + + //Check which interface. + if ( MatchResponseToPendingOps( + protoCmdId, EGet324CtrlInterface ) && iH324Config ) + { + __VTPRINT( DEBUG_MEDIA, "MH.protoComC:324 IF" ) + iH324Config->SetObserverL ( this ); + + // Create DTMF handler with H324 interface. + CVtEngUtility* utils = CVtEngUtility::EngineUtils(); + TRAP_IGNORE( utils->Initializer().CreateDtmfHandlerL( iH324Config ) ); + + // Set version to protocol -- cannot cause problem +#ifdef VTDEBUG + TRAPD( err, SetVersionInfoL() ); + if ( err != KErrNone ) + { + __VTPRINT2( DEBUG_MEDIA, + "MH.protoComC:324 IF VersionInfo failed=%d", err ) + } +#else + TRAP_IGNORE( SetVersionInfoL() ); +#endif + // Set resolutions to Proto. + SetSupportedResolutions(); + + // Set Fast options + SetFastCsupOptions(); + + SetFlag( EProto324IFAcquired ); + RemoveOperation( protoCmdId ); + states->Update(); + } + else if ( MatchResponseToPendingOps( + protoCmdId, EGetH263EncInterface ) ) + { + __VTPRINT( DEBUG_MEDIA, "MH.protoComC:IF 263 created" ) + iH263Encoder->SetObserverL( this ); + RemoveOperation( protoCmdId ); + } + else + { + // Not supported interface. + __VTPRINT( DEBUG_MEDIA, "MH.protoComC:NOT requested" ) + } + } + else + { + // failed or not in appropriate state + __VTPRINT( DEBUG_MEDIA, "MH.protoComC:query IF fail/incorrect state" ) + RemoveOperation( protoCmdId ); + } + } + break; + + case EVtCommandResume: + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "MH.protoComC Resume" ) + + __ASSERT_DEBUG( + IsPending( EUnmuteAudio ) != KErrNotFound || + IsPending( EEnableVideo ) != KErrNotFound || + IsPending( EEnableVideoInternal ) != KErrNotFound, + Panic( EVtEngPanicMediaHandlerOpStateFailure ) ); + + // Was command unmute audio? + const TBool audioEnabled( + MatchResponseToPendingOps( protoCmdId, EUnmuteAudio ) ); + + if ( protoResponse == KErrNone ) + { + if ( audioEnabled ) + { + iLocalVideo->UnMute(); + event = KVtEngAudioUnmuted; + } + else + { + iLocalVideo->ResumeVideoSending(); + } + } + + // Was command enable video? + const TBool videoEnabledByUser( + MatchResponseToPendingOps( protoCmdId, EEnableVideo ) ); + + RemoveOperation( protoCmdId ); + + if ( videoEnabledByUser && IsFlag( ETwoStageOperation ) ) + { + // Two-phase operation (resume + switch, resume completed) + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + "MH.video Resume 1st stage" ) + ClearFlag( ETwoStageOperation ); + ClearFlag( ESourceUpdateNeeded ); + iLocalVideo->SelectSourceL( iTempProviderInfo ); + iTempProviderInfo = CVtEngLocalVideo::KVtEngProviderNone; + } + else if ( videoEnabledByUser || audioEnabled ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "MH.video Resume " ) + CompleteOp( protoResponse ); + } + + // Do send an intra message + if ( IsFlag( EProtoVideoTrackPaused ) ) + { + ClearFlag( EProtoVideoTrackPaused ); + if ( IsFlag( EProtoSendIntraFrame ) ) + { + RequestFrame(); + } + } + } + break; + case EVtCommandPause: // Audio or video disable + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "MH.protoComC Pause" ) + __ASSERT_DEBUG( iRequestStatus || + // uninit ongoing, still possible + // to receive callback from protocol + ( IsPending( EMuteAudio ) != KErrNotFound || + IsPending( EDisableVideo ) != KErrNotFound ), + Panic( EVtEngPanicMediaHandlerOpStateFailure ) ); + + TBool videoDisabled( EFalse ); + + // was command disable audio? + if ( MatchResponseToPendingOps( protoCmdId, EMuteAudio ) ) + { + iLocalVideo->Mute(); + event = KVtEngAudioMuted; + } + else + { + // was command disable video? + videoDisabled = MatchResponseToPendingOps( + protoCmdId, EDisableVideo ); + if ( videoDisabled ) + { + SetFlag( EProtoVideoTrackPaused ); + } + } + RemoveOperation( protoCmdId ); + if ( IsFlag( ETwoStageOperation ) && videoDisabled ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + "MH.video pause 1st stage" ) + // First event out of two that DisableVideo video + // is complete (waiting for event from local video). + + if ( !IsPending( EEnableVideo ) ) + { + ClearFlag( ETwoStageOperation ); + } + else + { + // Except if pause was not user originated, i.e + // pause done in the beginning because there is no + // still image to be sent in MT call and video is paused + // (user has not yet allowed video sending). + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + "MH.video paused, 2stage NOT CLEARED" ) + } + } + else + { + if ( !iPauseNoCompleteOp ) + { + CompleteOp( protoResponse ); + } + else + { + iPauseNoCompleteOp = EFalse; + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + "MH.video paused due to share stop, clearing flag" ) + } + } + } + break; + case EVtCommandAddDataSink: + { + __VTPRINT( DEBUG_MEDIA, "LCN: EVtCommandAddDataSink"); + if ( protoResponse == KErrNone ) + { + __ASSERT_DEBUG( iRequestStatus || + // uninit ongoing, still possible + // to receive callback from pv2way + ( IsPending( EAddVideoSink ) != KErrNotFound || + IsPending( EAddAudioSink ) != KErrNotFound ), + Panic( EVtEngPanicMediaHandlerOpStateFailure ) ); + + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "MH.data sink added" ) + + if ( MatchResponseToPendingOps( protoCmdId, EAddVideoSink ) + && ( iRemoteMediaState & EMediaVideoPreparing ) ) + { + // Video sink added + SetFlag( EProtoVideoSinkAdded ); + iRemoteMediaState &= ~EMediaVideoPreparing; + iRemoteMediaState |= EMediaVideo; + __VTPRINT( DEBUG_MEDIA, "LCN: EVtCommandAddDataSink for VIDEO OK."); + } + else if ( MatchResponseToPendingOps( protoCmdId, EAddAudioSink ) + && ( iRemoteMediaState & EMediaAudioPreparing ) ) + { + // Audio sink added + SetFlag( EProtoAudioSinkAdded ); + iRemoteMediaState &= ~EMediaAudioPreparing; + iRemoteMediaState |= EMediaAudio; + __VTPRINT( DEBUG_MEDIA, "LCN: EVtCommandAddDataSink for AUDIO OK."); + // DevSound created in Proto => temporary devSound needed + // for making audio routing work can be released now. + CVtEngStateManager* stateManager = + CVtEngUtility::StateManager(); + CVtEngAudioHandler& audioHandler = + static_cast< CVtEngAudioHandler& >( + stateManager->Handlers().Audio() ); + audioHandler.SetRoutingEnablerL( EFalse ); + RequestAudioControllerL(); + } + else + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "MH.protoComC invalid" ) + Panic( EVtEngPanicMediaHandlerOpStateFailure ); + } + } + else + { + __VTPRINT( DEBUG_MEDIA, "LCN: EVtCommandAddDataSink FAILED"); + + if ( MatchResponseToPendingOps( protoCmdId, EAddVideoSink ) ) + { + __VTPRINT( DEBUG_MEDIA, "LCN: EVtCommandAddDataSink FAILED, INCOMING VIDEO"); + + iVideoIncomingLogicalChannel.iSameTypeClosingPending = EFalse; + if( iVideoIncomingLogicalChannel.iSameTypeChannelReadyToOpen ) + { + iVideoIncomingLogicalChannel.iSameTypeChannelReadyToOpen = EFalse; + + __VTPRINT( DEBUG_MEDIA, "LCN: MH.protoHIE delayed adding VIDEO, ADDing SINK" ) + AddVideoSink( iVideoIncomingLogicalChannel.iLogicalChannelId ); + } + } + else + { + __VTPRINT( DEBUG_MEDIA, "LCN: EVtCommandAddDataSink FAILED, INCOMING AUDIO"); + + iAudioIncomingLogicalChannel.iSameTypeClosingPending = EFalse; + if( iAudioIncomingLogicalChannel.iSameTypeChannelReadyToOpen ) + { + iAudioIncomingLogicalChannel.iSameTypeChannelReadyToOpen = EFalse; + + __VTPRINT( DEBUG_MEDIA, "LCN: MH.protoHIE delayed adding AUDIO, ADDing SINK" ) + AddAudioSink( iAudioIncomingLogicalChannel.iLogicalChannelId ); + } + } + } + RemoveOperation( protoCmdId ); + } + break; + case EVtCommandAddDataSource: + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "MH.data source added" ) + __VTPRINT( DEBUG_MEDIA, "LCN: EVtCommandAddDataSource"); + if ( protoResponse == KErrNone && + ( iProtoState == MVtProtocolCommand::EConnected || iProtoState == MVtProtocolCommand::EConnecting || iProtoState == MVtProtocolCommand::ESetup ) ) + { + if ( MatchResponseToPendingOps( protoCmdId, EAddVideoSource ) ) + { + SetFlag( EProtoVideoSourceAdded ); + + // This flag was set if channel closed indication + // EVtIndicationClosingTrack was received from Proto. + ClearFlag( EOutVideoChannelClosed ); + + iLocalVideo->VideoChannelOpenedL(); + + CVtEngEventManager::NotifyEvent( + KVtEngMediaOutgoingVideoChannelStatusChanged ); + + __VTPRINT( DEBUG_MEDIA, "LCN: EVtCommandAddDataSource for VIDEO OK."); + + // Adjust to normal value after Connect has completed + // so MONA is over. + if( iProtoState == MVtProtocolCommand::EConnected ) + { + __VTPRINT( DEBUG_MEDIA, "LCN: Adjusting I Frame Interval in " ) + __VTPRINT( DEBUG_MEDIA, "LCN: ADD_DATA_SOURCE for Video, Connect has completed earlier." ) + __VTPRINT( DEBUG_MEDIA, "LCN: Normal I-frame rate." ) + + + // Setting I-Frame interval to normal since MONA connections are over. + AddOperation( ESetIFrameInterval, + // I-Frame every 10 second. + iH263Encoder->SetIntraFrameInterval( 100 ) ); + } + else if( iProtoState == MVtProtocolCommand::EConnecting || iProtoState == MVtProtocolCommand::ESetup ) + { + __VTPRINT( DEBUG_MEDIA, "LCN: Adjusting I Frame Interval in " ) + __VTPRINT( DEBUG_MEDIA, "LCN: ADD_DATA_SOURCE for Video, Proto state Connecting." ) + __VTPRINT( DEBUG_MEDIA, "LCN: High I-frame rate" ) + + // MONA negotiations ongoing, I-Frame invertal must be small + AddOperation( ESetIFrameInterval, + // 10 I-Frames every 1 second. + iH263Encoder->SetIntraFrameInterval( 10000 ) ); + } + + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + "MH.data setting default videoquality" ) + + // Set default frame rate and send indication to peer + if ( !IsFlag( EVideoQualitySetByPeer ) ) + { + SetVideoQualityL( EVideoQualityNormal, ETrue ); + } + + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + "MH.data source added check flag" ) + if ( IsFlag( EProtoPauseVideoRequested ) ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + "MH.data source added pausing video" ) + EnableVideoL( EFalse ); + } + } + else if ( MatchResponseToPendingOps( + protoCmdId, EAddAudioSource ) ) + { + SetFlag( EProtoAudioSourceAdded ); + + // This flag was set if channel closed indication + // EVtIndicationClosingTrack was received from PV. + ClearFlag( EOutAudioChannelClosed ); + + CVtEngEventManager::NotifyEvent( + KVtEngMediaOutgoingAudioChannelStatusChanged ); + + __VTPRINT( DEBUG_MEDIA, "LCN: EVtCommandAddDataSource for AUDIO OK."); + } + } + + else + { + __VTPRINT( DEBUG_MEDIA, "LCN: EVtCommandAddDataSource FAILED"); + + if ( MatchResponseToPendingOps( protoCmdId, EAddVideoSource ) ) + { + __VTPRINT( DEBUG_MEDIA, "EVtCommandAddDataSource FAILED, OUTGOING VIDEO"); + + iVideoOutgoingLogicalChannel.iSameTypeClosingPending = EFalse; + if( iVideoOutgoingLogicalChannel.iSameTypeChannelReadyToOpen ) + { + iVideoOutgoingLogicalChannel.iSameTypeChannelReadyToOpen = EFalse; + + __VTPRINT( DEBUG_MEDIA, "LCN: MH.protoHIE delayed adding VIDEO, ADDing SOURCE" ) + AddVideoSource( iVideoOutgoingLogicalChannel.iLogicalChannelId ); + } + } + else + { + __VTPRINT( DEBUG_MEDIA, "LCN: EVtCommandAddDataSource FAILED, OUTGOING AUDIO"); + + iAudioOutgoingLogicalChannel.iSameTypeClosingPending = EFalse; + if( iAudioOutgoingLogicalChannel.iSameTypeChannelReadyToOpen ) + { + iAudioOutgoingLogicalChannel.iSameTypeChannelReadyToOpen = EFalse; + + __VTPRINT( DEBUG_MEDIA, "LCN: MH.protoHIE delayed adding AUDIO, ADDing SOURCE" ) + AddAudioSource( iAudioOutgoingLogicalChannel.iLogicalChannelId ); + } + } + } + + if ( !RemoveOperation( protoCmdId ) ) + { + __ASSERT_DEBUG( iRequestStatus != NULL, + // uninit ongoing, still possible to receive + // callback from protocol + Panic( EVtEngPanicMediaHandlerOpStateFailure ) ); + } + states->Update(); + break; + } + + case EVtCommandConnect: + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "MH.Connect complete" ) + if ( protoResponse == KErrNone ) + { + __ASSERT_DEBUG( IsPending( EConnectProto ) != KErrNotFound, + Panic( EVtEngPanicMediaHandlerOpStateFailure ) ); + RemoveOperation( EConnectProto ); + iProtoState = MVtProtocolCommand::EConnected; + __VTPRINT( DEBUG_MEDIA, "MH.protoComC: EConnected" ) + states->Update(); + + // Adjust only if VideoSource adding has compled + if( IsPending( EAddVideoSource ) == KErrNotFound ) + { + __VTPRINT( DEBUG_MEDIA, "LCN: Adjusting I FrameInterval " ) + __VTPRINT( DEBUG_MEDIA, "LCN: after Connect has completed" ) + __VTPRINT( DEBUG_MEDIA, "LCN: Normal I-frame interval." ) + + + // Setting I-Frame interval to normal since MONA connections are over. + AddOperation( ESetIFrameInterval, + // I-Frame every 10 second. + iH263Encoder->SetIntraFrameInterval( 100 ) ); + } + } + else + { + if ( iProtoState == MVtProtocolCommand::EConnecting ) { + // it is possible that we're here because call was hanged up + iProtoState = MVtProtocolCommand::ESetup; + } + RemoveOperation( EConnectProto ); + // connect may have failed due to disconnect request (possible only in debug env?) + if ( iPendingOp && + ( iPendingOp->Command() == KVtEngTerminateSession ) ) + { + __VTPRINT( DEBUG_MEDIA, + "complete KVtEngTerminateSession on connect failure" ) + CompleteOp( KErrNone ); + } + else + { + __VTPRINT( DEBUG_MEDIA, + "request fallback on connect failure" ) + // request fallback from telephony + CVtEngUtility* utils = CVtEngUtility::EngineUtils(); + utils->MediatorCommands().VoiceFallback(); + } + states->Update(); + } + } + break; + case EVtCommandRemoveDataSource: + case EVtCommandRemoveDataSink: + break; + case EVtCommandReset: + { + __ASSERT_DEBUG( IsPending( EDestructProtoPhaseReset ) != KErrNotFound, + Panic( EVtEngPanicMediaHandlerOpStateFailure ) ); + __VTPRINT( DEBUG_MEDIA, "MH.protoComC:RESET complete" ) + RemoveOperation( protoCmdId ); + if ( protoResponse == KErrNone ) + { + iProtoState = MVtProtocolCommand::EIdle; + __VTPRINT( DEBUG_MEDIA, "MH.protoComC: EIdle" ) + } + if ( iRequestStatus ) + { + // we're in uninitialization process + // do this even if reset failed! + iLocalVideo->StopViewFinder(); + UninitializeNextStep(); + } + states->Update(); + } + break; + case EVtCommandDeleteProtocolInterface: + { + + // Remove pending operation from list + RemoveOperation( protoCmdId ); + + // Proceed to disconnecting if inetrfaces are free'd + UninitializeNextStep(); + states->Update(); + + break; + } + case EVtCommandDisconnect: + { + __ASSERT_DEBUG( + IsPending( EDestructProtoPhaseDisconnect ) != KErrNotFound || + IsPending( ETerminateSession ) != KErrNotFound, + Panic( EVtEngPanicMediaHandlerOpStateFailure ) ); + __VTPRINT( DEBUG_MEDIA, "MH.protoComC:DISCONNECT complete" ) + if ( protoResponse == KErrNone ) + { + iProtoState = MVtProtocolCommand::ESetup; + __VTPRINT( DEBUG_MEDIA, "MH.protoComC: ESetup_disconnect" ) + } + + delete iTimer; + iTimer = NULL; + + RemoveOperation( protoCmdId ); + + // If disconnect was requested while connecting we + // have connect operation added. + RemoveOperation( EConnectProto ); + + if ( iRequestStatus ) + { + // continue uninitialization + UninitializeNextStep(); + } + else + { + // complete plain disconnect request from UI + CompleteOp( protoResponse ); + } + states->Update(); + } + break; + case EVtCommandCancelAllCommands: + { + __ASSERT_DEBUG( + IsPending( EUninitializeCancelAllProto ) != KErrNotFound, + Panic( EVtEngPanicMediaHandlerOpStateFailure ) ); + RemoveOperation( protoCmdId ); + + UninitializeNextStep(); + } + break; + default: + { + __VTPRINT( DEBUG_MEDIA, "MH.protoComC Unknown Proto reply" ) + } + break; + } + if ( event != KVtEngEventNone ) + { + CVtEngEventManager::NotifyEvent( event ); + } + __VTPRINTEXIT( "MH.HandleSessionCommandEventL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::HandleSessionInformationalEventL +// Handles event from protocol engine. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::HandleSessionInformationalEventL( + const TVtIndicationEvent& aEvent) + { + __VTPRINTENTER( "MH.InfoEvent" ) + const TInt type( aEvent.iEventType ); + __VTPRINT2( DEBUG_MEDIA, "MH.protoHIE type=%d", type ) + + TVtIndicationEvent& event = + const_cast(aEvent); + const TUint8* buffer = event.iLocalBuffer; + + if ( buffer || type == EVtIndicationDisconnect ) + { + TBool video( EFalse ); + TBool audio( EFalse ); + __VTPRINT( DEBUG_MEDIA, "MH.protoHIE inbound") + if ( type != EVtIndicationDisconnect && + type != EVtIndicationUserInputCapability ) + { + switch ( buffer[0] ) + { + case EVtAudio: + audio = ETrue; + break; + case EVtVideo: + video = ETrue; + break; + case EVtControl: + case EVtData: + case EVtMediaNone: + __VTPRINTEXIT( "MH.InfoEvent" ) + return; + + default: + break; + + } + } + + __VTPRINT( DEBUG_MEDIA, "MH.protoHIE acting according" ) + TInt event( KVtEngEventNone ); + switch ( type ) + { + case EVtIndicationIncomingTrack: + { + __VTPRINT( DEBUG_MEDIA, "LCN: MH.protoHIE EVtIndicationIncomingTrack" ) + if ( video ) + { + TInt tempID = *((TInt*)(buffer+4)); + __VTPRINT2( DEBUG_MEDIA, "LCN: MH.protoHIE INCOMING VIDEO:%d", tempID ) + + if( !iVideoIncomingLogicalChannel.iSameTypeClosingPending ) + { + __VTPRINT( DEBUG_MEDIA, "LCN: MH.protoHIE InTrack VIDEO, ADDing SINK" ) + AddVideoSink( tempID ); + } + else + { + // Store old value since ID will change when we get outgoing track indication + iVideoIncomingLogicalChannel.iLogicalChannelIdClosing = iVideoIncomingLogicalChannel.iLogicalChannelId; + iVideoIncomingLogicalChannel.iSameTypeChannelReadyToOpen = ETrue; + } + + // Store new LCN ID. + iVideoIncomingLogicalChannel.iLogicalChannelId = tempID; + } + else if ( audio ) + { + TInt tempID = *((TInt*)(buffer+4)); + __VTPRINT2( DEBUG_MEDIA, "LCN: MH.protoHIE INCOMING AUDIO:%d", tempID ) + + if( !iAudioIncomingLogicalChannel.iSameTypeClosingPending ) + { + __VTPRINT( DEBUG_MEDIA, "LCN: MH.protoHIE InTrack AUDIO, ADDing SINK" ) + AddAudioSink( tempID ); + } + else + { + // Store old value since ID will change when we get outgoing track indication + iAudioIncomingLogicalChannel.iLogicalChannelIdClosing = iAudioIncomingLogicalChannel.iLogicalChannelId; + iAudioIncomingLogicalChannel.iSameTypeChannelReadyToOpen = ETrue; + } + + // Store new LCN ID. + iAudioIncomingLogicalChannel.iLogicalChannelId = tempID; + } + } + break; + + case EVtIndicationOutgoingTrack: + { + __VTPRINT( DEBUG_MEDIA, "LCN: MH.protoHIE EVtIndicationOutgoingTrack" ) + if ( video ) + { + TInt tempID = *((TInt*)(buffer+4)); + __VTPRINT2( DEBUG_MEDIA, "LCN: MH.protoHIE OUTGOING VIDEO ID:%d", tempID ) + + if( !iVideoOutgoingLogicalChannel.iSameTypeClosingPending ) + { + __VTPRINT( DEBUG_MEDIA, "LCN: MH.protoHIE OutTrack VIDEO, ADDing SOURCE" ) + AddVideoSource( tempID ); + } + else + { + // Store old value since ID will change when we get outgoing track indication + iVideoOutgoingLogicalChannel.iLogicalChannelIdClosing = iVideoOutgoingLogicalChannel.iLogicalChannelId; + iVideoOutgoingLogicalChannel.iSameTypeChannelReadyToOpen = ETrue; + } + + // Store new LCN ID. + iVideoOutgoingLogicalChannel.iLogicalChannelId = tempID; + } + else if ( audio ) + { + + TInt tempID = *((TInt*)(buffer+4)); + __VTPRINT2( DEBUG_MEDIA, "LCN: MH.protoHIE OUTGOING AUDIO:%d", tempID ) + + if( !iAudioOutgoingLogicalChannel.iSameTypeClosingPending ) + { + __VTPRINT( DEBUG_MEDIA, "LCN: MH.protoHIE OutTrack AUDIO, ADDing SOURCE" ) + AddAudioSource( tempID ); + } + else + { + // Store old value since ID will change when we get outgoing track indication + iAudioOutgoingLogicalChannel.iLogicalChannelIdClosing = iAudioOutgoingLogicalChannel.iLogicalChannelId; + iAudioOutgoingLogicalChannel.iSameTypeChannelReadyToOpen = ETrue; + } + + // Store new LCN ID. + iAudioOutgoingLogicalChannel.iLogicalChannelId = tempID; + } + } + break; + + case EVtIndicationClosingTrack: + { + + TUint8 direction = buffer[0]; + TInt tempID = *((TInt*)(buffer+4)); + + __VTPRINT3( DEBUG_MEDIA, "LCN: MH.protoHIE PEVtIndicationClosingTrack ID:%d, dir:%d", tempID, direction ) + + if( direction == EVtIncoming ) + { + if( tempID == iVideoIncomingLogicalChannel.iLogicalChannelId ) + { + iVideoIncomingLogicalChannel.iSameTypeClosingPending = ETrue; + __VTPRINT( DEBUG_MEDIA, "LCN: MH.protoHIE CLOSING INCOMING VIDEO" ) + } + else + { + iAudioIncomingLogicalChannel.iSameTypeClosingPending = ETrue; + __VTPRINT( DEBUG_MEDIA, "LCN: MH.protoHIE CLOSING INCOMING AUDIO" ) + } + } + else + { + TInt uiEvent; + if( tempID == iVideoOutgoingLogicalChannel.iLogicalChannelId ) + { + SetFlag( EOutVideoChannelClosed ); + iVideoOutgoingLogicalChannel.iSameTypeClosingPending = ETrue; + uiEvent = KVtEngMediaOutgoingVideoChannelStatusChanged; + __VTPRINT( DEBUG_MEDIA, "LCN: MH.protoHIE CLOSING OUTGOING VIDEO" ) + } + else + { + SetFlag( EOutAudioChannelClosed ); + iAudioOutgoingLogicalChannel.iSameTypeClosingPending = ETrue; + uiEvent = KVtEngMediaOutgoingAudioChannelStatusChanged; + __VTPRINT( DEBUG_MEDIA, "LCN: MH.protoHIE CLOSING OUTGOING AUDIO" ) + } + CVtEngEventManager::NotifyEvent( uiEvent ); + } + } + break; + + case EVtIndicationCloseTrack: + { + + TInt tempID = *((TInt*)(buffer+4)); + + TUint8 direction = buffer[0]; + + __VTPRINT3( DEBUG_MEDIA, "LCN: MH.protoHIE EVtIndicationCloseTrack ID:%d, dir:%d", tempID, direction ) + + if( direction == EVtIncoming ) + { + if( iVideoIncomingLogicalChannel.iLogicalChannelId == tempID || + ( iVideoIncomingLogicalChannel.iSameTypeClosingPending && + tempID == iVideoIncomingLogicalChannel.iLogicalChannelIdClosing ) + ) + { + iVideoIncomingLogicalChannel.iSameTypeClosingPending = EFalse; + iRemoteMediaState &= ~EMediaVideo; + + __VTPRINT( DEBUG_MEDIA, "LCN: MH.protoHIE CLOSE INCOMING VIDEO" ) + + if( iVideoIncomingLogicalChannel.iSameTypeChannelReadyToOpen ) + { + iVideoIncomingLogicalChannel.iSameTypeChannelReadyToOpen = EFalse; + + __VTPRINT( DEBUG_MEDIA, "LCN: MH.protoHIE delayed adding VIDEO, ADDing SINK" ) + AddVideoSink( iVideoIncomingLogicalChannel.iLogicalChannelId ); + } + } + else + { + iAudioIncomingLogicalChannel.iSameTypeClosingPending = EFalse; + + __VTPRINT( DEBUG_MEDIA, "LCN: MH.protoHIE CLOSE INCOMING AUDIO" ) + + if( iAudioIncomingLogicalChannel.iSameTypeChannelReadyToOpen ) + { + iAudioIncomingLogicalChannel.iSameTypeChannelReadyToOpen = EFalse; + + __VTPRINT( DEBUG_MEDIA, "LCN: MH.protoHIE delayed adding AUDIO, ADDing SINK" ) + AddAudioSink( iAudioIncomingLogicalChannel.iLogicalChannelId ); + } + } + } + else + { + if( iVideoOutgoingLogicalChannel.iLogicalChannelId == tempID || + ( iVideoOutgoingLogicalChannel.iSameTypeClosingPending && + tempID == iVideoOutgoingLogicalChannel.iLogicalChannelIdClosing ) + ) + { + iVideoOutgoingLogicalChannel.iSameTypeClosingPending = EFalse; + + __VTPRINT( DEBUG_MEDIA, "LCN: MH.protoHIE CLOSE OUTGOING VIDEO" ) + + if( iVideoOutgoingLogicalChannel.iSameTypeChannelReadyToOpen ) + { + iVideoOutgoingLogicalChannel.iSameTypeChannelReadyToOpen = EFalse; + + __VTPRINT( DEBUG_MEDIA, "LCN: MH.protoHIE delayed adding VIDEO, ADDing SOURCE" ) + AddVideoSource( iVideoOutgoingLogicalChannel.iLogicalChannelId ); + } + } + else + { + iAudioOutgoingLogicalChannel.iSameTypeClosingPending = EFalse; + + __VTPRINT( DEBUG_MEDIA, "LCN: MH.protoHIE CLOSE OUTGOING AUDIO" ) + + if( iAudioOutgoingLogicalChannel.iSameTypeChannelReadyToOpen ) + { + iAudioOutgoingLogicalChannel.iSameTypeChannelReadyToOpen = EFalse; + + __VTPRINT( DEBUG_MEDIA, "LCN: MH.protoHIE delayed adding AUDIO, ADDing SOURCE" ) + AddAudioSource( iAudioOutgoingLogicalChannel.iLogicalChannelId ); + } + } + } + } + break; + case EVtIndicationResumeTrack: + __VTPRINT2( DEBUG_MEDIA, "MH.protoHIE X is resumed %d", buffer[1] ) + if ( buffer[1] == EVtIncoming ) // Only for remote + { + if ( video ) + { + __VTPRINT( DEBUG_MEDIA, "MH.protoHIE video resumed" ) + event = KVtEngRemoteVideoResumed; + ClearFlag( EProtoVideoTrackPaused ); + } + else if ( audio ) + { + __VTPRINT( DEBUG_MEDIA, "MH.protoHIE audio resumed" ) + event = KVtEngRemoteAudioResumed; + ClearFlag( EProtoAudioTrackPaused ); + } + } + break; + case EVtIndicationPauseTrack: + __VTPRINT2( DEBUG_MEDIA, "MH.protoHIE X is paused %d", buffer[1] ) + if ( buffer[1] == EVtIncoming ) // Only for remote + { + if ( audio ) + { + __VTPRINT( DEBUG_MEDIA, "MH.protoHIE audio paused" ) + SetFlag( EProtoAudioTrackPaused ); + event = KVtEngRemoteAudioPaused; + } + else if ( video ) + { + __VTPRINT( DEBUG_MEDIA, "MH.protoHIE video paused" ) + SetFlag( EProtoVideoTrackPaused ); + event = KVtEngRemoteVideoPaused; + } + } + break; + case EVtIndicationDisconnect: + { + __VTPRINT( DEBUG_MEDIA | DEBUG_RETURN, "MH.protoHIE PID" ) + + // Fix for disconnecting remote (bearer). Engine + // needs to send KVtEngRemoteDisconnect event to UI to notify + // UI that call can not be hangup! + CVtEngEventManager::NotifyEvent( KVtEngRemoteDisconnect ); + + delete iTimer; + iTimer = NULL; + CVtEngStateManager* states = CVtEngUtility::StateManager(); + iProtoState = MVtProtocolCommand::ESetup; + __VTPRINT( DEBUG_MEDIA, "MH.protoComC: ESetup_indi_disconnect" ) + states->Update(); + if ( iPendingOp && + ( iPendingOp->Command() == KVtEngTerminateSession || + iPendingOp->Command() == KVtEngResetEngine ) ) + { + __VTPRINT2( DEBUG_MEDIA, "MH.protoHIE PID PO", iPendingOp->Command() ) + // Complete only KVtEngTerminateSession, if KVtEngResetEngine + // is pending complete it after uninitialisation is finalised. + if ( iPendingOp->Command() == KVtEngTerminateSession ) + { + CompleteOp( KErrNone ); + } + } + else + { + __VTPRINT( DEBUG_MEDIA | DEBUG_RETURN, "MH.protoHIE PID RO") + UninitializeNextStep(); + } + } + break; + default: + break; + } + if ( KVtEngEventNone != event ) + { + CVtEngEventManager::NotifyEvent( event ); + } + } + __VTPRINTEXIT( "MH.InfoEvent" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::HandleSessionErrorEventL +// Handles error event from protocol engine. +// ----------------------------------------------------------------------------- +// +#ifdef VTDEBUG +void CVtEngMediaHandler::HandleSessionErrorEventL( const TVtErrorEvent& aEvent ) +#else +void CVtEngMediaHandler:: + HandleSessionErrorEventL( const TVtErrorEvent& /* aEvent */ ) +#endif // VTDEBUG + { + // Must have an implementation. + __VTPRINT2( DEBUG_MEDIA, "MH.protoHEE,%d", aEvent.iEventType ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::HandleSettingChangedL +// Handles still image setting change. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::HandleSettingChangedL( + CVtEngSettings::TSettingId aId, + const TDesC& /*aValue*/ ) + { + __VTPRINTENTER( "MH.HandleSettingChangedL" ) + if ( aId == CVtEngSettings::ESelectVolume || + aId == CVtEngSettings::EHandsetVolume || + aId == CVtEngSettings::EHandsfreeVolume ) + { + __VTPRINT2( DEBUG_MEDIA, "MH.volChgd %d", aId ) + UpdateVolume(); + + if ( aId == CVtEngSettings::EHandsetVolume || + aId == CVtEngSettings::EHandsfreeVolume ) + { + CVtEngEventManager::NotifyEvent( + KVtEngAudioOutputVolumeChanged ); + } + } + else if ( aId == CVtEngSettings::EStillImage || + aId == CVtEngSettings::EStillImagePath ) + { + __VTPRINT( DEBUG_MEDIA, "MH.stillChgd" ) + + TShareObjectState shareState; + GetObjectSharingState( shareState ); + if ( shareState == EInitializingShareImage || + shareState == ESharingImage ) + { + iLocalVideo->SettingsChanged(); + return; + } + + CVtEngSettings& settings = CVtEngUtility::Settings(); + const CVtEngSettings::TVtEngVideoCallConfig& config = + settings.Config(); + + const CVtEngLocalVideo::TVtEngProviderType + activeProvider( iLocalVideo->ActiveProvider() ); + if ( config.iVideo.iImageIsValid ) + { + __VTPRINT( DEBUG_GEN, "MH.HSC valid" ) + EnableVideoL( ETrue ); + // if still image is not active we should only + // initialize it, not start after initialization. + const TBool initOnly( activeProvider == + CVtEngLocalVideo::KVtEngProviderCam1 || + activeProvider == CVtEngLocalVideo::KVtEngProviderCam2 || + activeProvider == + CVtEngLocalVideo::KVtEngProviderShareImage ); + iLocalVideo->InitializeOnlyEx( initOnly ); + TRAPD( err,iLocalVideo->SetStillImageL( !initOnly ) ); + if ( err == KErrNotReady ) + { + __VTPRINT( DEBUG_GEN, "MH.HSC waiting...") + // Another switch ongoing, wait until it is done. + } + } + else + { + __VTPRINT( DEBUG_GEN, "MH.HSC invalid" ) + __VTPRINT2( DEBUG_MEDIA, "MH.HSC provider=", activeProvider ) + if ( CVtEngUtility::Settings().IsDefaultStillImageDefined() ) + { + __VTPRINT( DEBUG_MEDIA, "MH.SetDefaultStillImageL" ) + if ( activeProvider == CVtEngLocalVideo::KVtEngProviderImage ) + { + iLocalVideo->SetDefaultStillImageL(); + } + } + else + { + if( activeProvider != + CVtEngLocalVideo::KVtEngProviderCam1 && + activeProvider != CVtEngLocalVideo::KVtEngProviderCam2 ) + { + EnableVideoL( EFalse ); + } + __VTPRINT( DEBUG_MEDIA, "MH.tStillImageL" ) + iLocalVideo->SetStillImageL( ETrue ); + } + + } + } + else + { + // Do nothing, but satisfy lint. + __VTPRINT2( DEBUG_MEDIA, "MH.HSC not handled=%d", aId ) + } + __VTPRINTEXIT( "MH.HSC" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::InitializeL +// Initializes settings listeners. +// Sets still image and initializes default provider. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::InitializeL( TRequestStatus& aStatus ) + { + __VTPRINTENTER( "MH.InitializeL" ) + // configure still image + CVtEngSettings& settings = CVtEngUtility::Settings(); + settings.NotifyChangeL( CVtEngSettings::EStillImage, *this ); + settings.NotifyChangeL( CVtEngSettings::EStillImagePath, *this ); + settings.NotifyChangeL( CVtEngSettings::ESelectVolume, *this ); + settings.NotifyChangeL( CVtEngSettings::EHandsetVolume, *this ); + settings.NotifyChangeL( CVtEngSettings::EHandsfreeVolume, *this ); + + const CVtEngSettings::TVtEngVideoCallConfig& config = settings.Config(); + TInt err( KErrNotFound ); + if ( config.iVideo.iImageIsValid ) + { + // first step initialize still, when that is complete, initialize blank + TRAP( err, iLocalVideo->SetStillImageL( ETrue ) ); + if ( err == KErrNone ) + { + iVSInitState = EStateInitStillImage; + iRequestStatus = &aStatus; + } + } + if ( err != KErrNone ) + { + // Still provider init failed -> initialize blank + InitializeProviderL( aStatus ); + } + __VTPRINTEXIT( "MH.InitializeL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::CancelInitialize +// Sets initialization state as cancelled. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::CancelInitialize() + { + __VTPRINTENTER( "MH.CancelInitialize" ) + iVSInitState = EStateInitCanceled; + __VTPRINTEXIT( "MH.CancelInitialize" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::InitializeProviderL +// Initializes default blank provider. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::InitializeProviderL( TRequestStatus& aStatus ) + { + __VTPRINTENTER( "MH.InitializeProviderL" ) + iLocalVideo->InitializeL(); + iVSInitState = EStateInitProvider; + iRequestStatus = &aStatus; + __VTPRINTEXIT( "MH.InitializeProviderL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::Uninitialize +// Frees all resources. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::Uninitialize( TRequestStatus& aStatus ) + { + __VTPRINTENTER( "MH.Uninitialize" ) + ClearFlag( ETwoStageOperation ); + ClearFlag( ESourceUpdateNeeded ); + iRequestStatus = &aStatus; + if ( iProtoState == MVtProtocolCommand::EDisconnecting ) + { + // Protocol is disconnecting if + // 1) bearer was lost (and videoteleng issued disconnect on protocol), or + // 2) protocol issued disconnect due unrecoverable error or disconnect + // request from remote terminal. + // And now UI requested 'reset engine' while performing disconnect. + // When disconnecting is complete check if iRequestStatus + // is not null AND iInitialized is ETrue. + // If so, Uninitialize has been called (UI requested reset). + + StopRendering(); + __VTPRINT( DEBUG_MEDIA, "MH.UnInit wait for disconnect to complete" ) + __VTPRINTEXIT( "MH.Uninitialize" ) + return; + } + iInitialized = EFalse; + UninitializeNextStep(); + __VTPRINTEXIT( "MH.Uninitialize" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::UninitializeNextStep +// Goes to next step in uninitialization +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::UninitializeNextStep( ) + { + __VTPRINTENTER( "MH.UninitializeNextStep" ) + StopRendering(); + + TOperation op( ENone ); + + // CancelAllProtoCommands is no op if nothing to cancel or already pending. + // However, then op is still assigned with EUninitializeCancelAllProto to + // indicate it is pending and we must wait for it to complete. + CancelAllProtoCommands( op ); + + if ( op == ENone ) // Cancellation is not pending + { + __VTPRINT2( DEBUG_MEDIA, "next step protostate=%d", iProtoState ) + switch ( iProtoState ) + { + case MVtProtocolCommand::EConnected: + case MVtProtocolCommand::EConnecting: + op = EDestructProtoPhaseDisconnect; + break; + case MVtProtocolCommand::ESetup: + // In EInitializing state operation is waited to complete. See + // CVtEngInitializer::ContinueOrRetry op==EReset and iStep==EInitProto + + if( iH324Config || iH263Encoder ) + { + // First remove interfaces, after completion perform reset + op = ERemove324CtrlInterface; + break; + } + + // If interfaces are already released or not even reserved, go to Reset. + op = EDestructProtoPhaseReset; + break; + case MVtProtocolCommand::EResetting: + // Reset ongoing, wait for it to complete + __VTPRINT( DEBUG_MEDIA, "MH.UnInit resetting" ) + break; + case MVtProtocolCommand::EIdle: + op = ERemove324CtrlInterface; + __VTPRINT( DEBUG_MEDIA, "MH.UnInit idling" ) + break; + default: + __VTPRINT( DEBUG_MEDIA, "MH.UnInit invalid state" ) + break; + } + if ( op != ENone ) + { + TRAPD( err, ContinueUninitializeL( op ) ); + if ( err != KErrNone ) + { + if ( iRequestStatus ) + { + User::RequestComplete( iRequestStatus, err ); + iRequestStatus = NULL; + } + else + { + // Infinite waiting for end state! + __VTPRINT( DEBUG_MEDIA, "MH. dead end!" ) + Panic( EVtEngPanicDisconnectTimerExpired ); + } + __VTPRINT2( DEBUG_MEDIA, "next step err=%d", err ) + } + } + } + __VTPRINTEXIT( "MH.UninitializeNextStep" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::ContinueUninitializeL +// Completes uninitialization: +// does disconnecting, deletes members. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::ContinueUninitializeL( + const TOperation aOp ) + { + __VTPRINTENTER( "MH.ContinueUninitializeL" ) + __VTPRINT2( DEBUG_MEDIA, "MH.ContUn op=%d", aOp) + switch ( aOp ) + { + case EDestructProtoPhaseDisconnect: // causes DisconnectL on protocol + __VTPRINT2( DEBUG_MEDIA, "MH.ContUn EDestructProtoPhaseDisconnect iProtoState=%d", iProtoState ) + + // Disconnecting only allowed in Connecting and Connected state. + if( iProtoState == MVtProtocolCommand::EConnecting || iProtoState == MVtProtocolCommand::EConnected ) + { + DisconnectProtoL(); + if ( iProtoState == MVtProtocolCommand::EDisconnecting ) { + // started succefully disconnecting + break; + } + } + // fall through if state was not proper was disconnect + case EDestructProtoPhaseReset: // causes ResetL on protocol + + ResetProto2WayL(); + if ( iProtoState == MVtProtocolCommand::EResetting ) + { + break; + } + // fall through if state was not proper for reset + case ERemove324CtrlInterface: + { + __VTPRINT( DEBUG_MEDIA, "MH.ContUn ERemove324CtrlInterface" ) + const TBool extCmdPending( ExtensionCommandsPending() ); + if ( !extCmdPending && ( iH324Config || iH263Encoder ) ) + { // no pending extension commands, interfaces can be released + // this is no-op if already released + ReleaseProtoInterfacesL(); + break; + } + if( extCmdPending || + IsPending( ERemove324CtrlInterface ) != KErrNotFound || + IsPending( ERemoveH263EncInterface ) != KErrNotFound ) + { + // Interface releasing has not completed yet, need to wait + // until proceeding ahead. + break; + } + } + // fall through if interfaces are released + case EDestructSwitchBlank: + { + __VTPRINT( DEBUG_MEDIA, "MH.ContUn EDestructSwitchBlank" ) + // provider must be selected to something else that + // is not deleted + const CVtEngLocalVideo::TVtEngProviderType + activeProvider( iLocalVideo->ActiveProvider() ); + if ( activeProvider != CVtEngLocalVideo::KVtEngProviderNone ) + { + iLocalVideo->SelectSourceL( CVtEngLocalVideo::KVtEngProviderNone ); + iVSInitState = EStateWaitingProviderChangeForUninit; + break; + } + // blank provider already active so continue + iVSInitState = EInitStateNone; + } + // fall thru + case EDestructInternals: + __VTPRINT( DEBUG_MEDIA, "MH.ContUn EDestructInternals" ) + iLocalVideo->Reset(); + delete iRemoteVideo; + iRemoteVideo = NULL; + if ( iRequestStatus ) + { + User::RequestComplete( iRequestStatus, KErrNone ); + iRequestStatus = NULL; + } + break; + default: + // Should not happen + Panic( EVtEngPanicUnInitIncorrectOperation ); + break; + } + + __VTPRINTEXIT( "MH.ContinueUninitializeL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::StopRendering +// Stops all rendering. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::StopRendering() + { + __VTPRINTENTER( "MH.StopRendering" ) + if ( iLocalVideo ) + { + iLocalVideo->StopViewFinder(); + } + if ( iRemoteVideo ) + { + iRemoteVideo->StopVideoRendering(); + } + __VTPRINTEXIT( "MH.StopRendering" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::UpdateVolume +// Updates volume values. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::UpdateVolume() + { + __VTPRINTENTER( "MH.UpdateVolume" ) + if ( iUpdateVolumeAllowed && IsPending( ESetAudioVolume ) == KErrNotFound ) + { + CVtEngSettings& settings = CVtEngUtility::Settings(); + + TInt volume( 0 ); + TInt err( settings.GetVolume( volume, + settings.CurrentVolume(), ETrue ) ); + if ( err != KErrNone ) + { + volume = settings.MinVolume(); + } + + SetVolume( volume ); + } + else + { + iUpdateVolumeRequired = ETrue; + } + __VTPRINTEXIT( "MH.UpdateVolume" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::AutoEnableVideo +// Enables video when primary camera becomes available while blank provider +// is active (i.e. video is disabled). This should not be called in other +// occations. Difference to EnableVideoL is that callback doesn't try to +// complete pending request to UI (that usually is different request than this). +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::AutoEnableVideo( TBool aEnable ) + { + __VTPRINTENTER( "MH.AutoEnableVideo" ) + __VTPRINT( DEBUG_MEDIA, "MH.AutoEnableVideo" ) + TOperation op( EDisableVideoInternal ); + if ( aEnable ) + { + op = EEnableVideoInternal; + } + TRAPD( err, EnableVideoL( aEnable, op ) ); + __VTPRINTEXITR( "MH.AutoEnableVideo %d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::FinalizeUninitialization +// Deletes protocol. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::FinalizeUninitialization() + { + __VTPRINTENTER( "MH.FinalUninit" ) + if ( iSessionCommand ) + { + iAudioCtrl = NULL; + TInt err( KErrNone ); + + // Delete the config interface + TRAP( err, + { + if ( iSessionCommand ) + { + VTProtocolFactory::DeleteSessionCommand( iSessionCommand ); + iSessionCommand = NULL; + } + + // Trapped to log the possible error + __VTPRINT( DEBUG_MEDIA, "MH.Deleted Terminal" ) + } ); + __VTPRINT2( DEBUG_MEDIA, "MH.Deletion complete=%d", err ) + iSessionCommand = NULL; + iProtoStateFlags = 0; + iProtoState = MVtProtocolCommand::EIdle; + __VTPRINT( DEBUG_MEDIA, "MH.protoComC: EIdle uninit" ) + if ( iPendingOp && + iPendingOp->Command() == KVtEngTerminateSession ) + { + __VTPRINT2( DEBUG_MEDIA, "MH.FinalUninit comp TerminateSession=%d", + iPendingOp->Command()) + CompleteOp( KErrNone ); + } + else if ( iPendingOp ) { + __VTPRINT2( DEBUG_MEDIA, "MH.FinalUninit comp =%d", + iPendingOp->Command() ) + delete iPendingOp; + } + iPendingOp = NULL; + } + iPendingOps->Reset(); + __VTPRINTEXIT( "MH.FinalUninit" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::ResetProto2WayL +// Resets protocol engine. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::ResetProto2WayL() + { + __VTPRINTENTER( "MH.ResetProto2WayL" ) + __ASSERT_ALWAYS( iProtoState == MVtProtocolCommand::ESetup, + Panic( EVtEngPanicMediaHandlerOpStateFailure ) ); + + __VTPRINT( DEBUG_MEDIA, "MH. Calling ResetL on Proto" ) + iUpdateVolumeAllowed = EFalse; + TInt cmdId = iSessionCommand->ResetProtocolL(); + if ( cmdId > 0 ) + { + // Add the operation if ok + AddOperation( EDestructProtoPhaseReset, cmdId, EFalse ); + iProtoState = MVtProtocolCommand::EResetting; + } + else + { + __VTPRINT( DEBUG_MEDIA, + "MH.ResetProto2WayL waiting for cancel to complete" ) + } + __VTPRINTEXIT( "MH.ResetProto2WayL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::SetSelectedCameraId +// Called from Local video when camera has been selected. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::SetSelectedCameraId( + const TCameraId aId, + TBool aUpdateRequired ) + { + __VTPRINTENTER( "MH.SetSelectedCameraId" ) + __VTPRINT2( DEBUG_MEDIA | DEBUG_DETAIL, "MH.SetSelectedCameraId id=%d", aId ) + iSelectedCameraId = aId; + // Set flag that switch should be done later if + // engine has not reached proper state + // - but only if active provider is a camera. + if ( aUpdateRequired && iLocalVideo ) + // NULL if called inside CVtEngLocalVideo::ConstructL + { + const CVtEngLocalVideo::TVtEngProviderType + activeProvider( iLocalVideo->ActiveProvider() ); + + if ( activeProvider == CVtEngLocalVideo::KVtEngProviderCam1 || + activeProvider == CVtEngLocalVideo::KVtEngProviderCam2 ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + "MH. ESourceUpdateNeeded flag set" ) + SetFlag( ESourceUpdateNeeded ); + } + } + __VTPRINTEXIT( "MH.SetSelectedCameraId" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::HandleLocalVideoOperationCompleteL +// Asynchronous local video operation is completed in here. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::HandleLocalVideoOperationCompleteL( + const TInt aResult ) + { + __VTPRINTENTER( "MH.LocVidOpComp" ) + __VTPRINT3( DEBUG_MEDIA, "MH.LocVidOpComp res=%d,intOps=%d", + aResult, iPendingOps->Count() ) + __VTPRINT2( DEBUG_MEDIA, "MH.LocVidOpComp state flags=%d", iProtoStateFlags ) + + // Check if video should be paused + if ( IsFlag( EProtoPauseVideoBlankProv ) ) + { + __VTPRINT( DEBUG_MEDIA, "MH.LocVidOpComp pause flagged" ) + if ( aResult == KErrNone ) + { + __VTPRINT( DEBUG_MEDIA, "MH.LocVidOpComp pausing" ) + EnableVideoL( EFalse ); + // Not ready yet, clear the two stages and complete in the end + if ( IsFlag( ETwoStageOperation ) && + IsFlag( EProtoContVideoBlankInit ) ) + { + __VTPRINT( DEBUG_MEDIA, "MH.LocVidOpComp 1 stage complete" ) + ClearFlag( ETwoStageOperation ); + ClearFlag( EProtoContVideoBlankInit ); + } + ClearFlag( EProtoPauseVideoBlankProv ); + } + } + + if ( iRequestStatus ) + { + if ( iVSInitState == EStateInitStillImage ) + + { // still image initialized, proceed to initializing blank provider + InitializeProviderL( *iRequestStatus ); + __VTPRINTEXIT( "MH.LocVidOpComp" ) + return; + } + else if ( iVSInitState == EStateInitProvider ) + { + __VTPRINT( DEBUG_MEDIA, "MH.LocVidOpComp reqComplete" ) + // Part of media handler initialization + User::RequestComplete( iRequestStatus, aResult ); + iRequestStatus = NULL; + iVSInitState = EInitStateNone; + __VTPRINTEXIT( "MH.LocVidOpComp" ) + return; + } + else if ( iVSInitState == EStateWaitingProviderChangeForUninit ) + { + iVSInitState = EInitStateNone; + iLocalVideo->StopViewFinder(); // ensure view finder is stopped + ContinueUninitializeL( EDestructInternals ); + __VTPRINTEXIT( "MH.LocVidOpComp" ) + return; + } + else if ( iVSInitState == EStateInitCanceled ) + { + // If the request status has been cancelled + // uninitialize VT + ContinueUninitializeL( EDestructSwitchBlank ); + } + } + + // Either complete the operation or remove 2 stage flag. + // If flag removed, the operation will be completed when + // the second stage finalizes. + if ( IsFlag( ETwoStageOperation ) ) + { + SetFlag( EProtoSendIntraFrame ); + ClearFlag( ETwoStageOperation ); + } + else + { + // Send a sync message, if video enabled. + if ( !IsFlag( EProtoVideoTrackPaused ) && + // and + iInitialized && + iProtoState == MVtProtocolCommand::EConnected && + iPendingOp && + iPendingOp->Command() == KVtEngSetSource ) + { + RequestFrame(); + } + // Complete operation only if it is related. We may have received + // KVtEngTerminateSession while prepare/set source is pending and + // cannot complete it! + if ( iPendingOp ) + { + switch( iPendingOp->Command() ) + { + case KVtEngHandleLayoutChange: + case KVtEngPrepareCamera: + case KVtEngSetSource: + case KVtEngUnfreeze: + CompleteOp( aResult ); + break; + + // Image sharing + case KVtEngInitializeShareImage: + __VTPRINT( DEBUG_MEDIA, + "MH.LocVidOpComp KVtEngInitializeShareImage" ) + if ( aResult != KErrNone ) + { + iLocalVideo->ShareError( aResult ); + } + CompleteOp( aResult ); + break; + + case KVtEngStartShareImage: + __VTPRINT( DEBUG_MEDIA, + "MH.LocVidOpComp KVtEngStartShareImage" ) + if ( aResult != KErrNone ) + { + iLocalVideo->ShareError( aResult ); + } + CompleteOp( aResult ); + if ( iVideoAction == EVideoActionEnable ) + { + if ( aResult == KErrNone ) + { + EnableVideoL( ETrue ); + iVideoAction = EVideoActionDisable; + } + else + { + iVideoAction = EVideoActionNone; + } + } + + break; + + case KVtEngStopShareImage: + __VTPRINT( DEBUG_MEDIA, + "MH.LocVidOpComp KVtEngStopShareImage" ) + if ( aResult != KErrNone ) + { + iLocalVideo->ShareError( aResult ); + } + CompleteOp( aResult ); + break; + + default: + break; + } + } + } + __VTPRINTEXIT( "MH.LocVidOpComp" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::Disconnect +// Starts Protocol disconnecting procedure. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::Disconnect() + { + UninitializeNextStep(); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::SdkInitInfo +// Returns Protocol sdk initialization information. +// ----------------------------------------------------------------------------- +// +TVtInitInfo& CVtEngMediaHandler::SdkInitInfo() + { + return iSdkInitInfo; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::ProtoState +// Returns protocol state, maintained by VTEngine. +// Might be out of sync with actual Proto state. +// ----------------------------------------------------------------------------- +// +MVtProtocolCommand::TVtProtocolState CVtEngMediaHandler::ProtoState() + { + return iProtoState; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::Connect +// Sets up connection with remote end. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::Connect() + { + __VTPRINTENTER( "MH.Connect" ) + __VTPRINT( DEBUG_MEDIA, "MH.Connect" ) + TInt err( KErrNotReady ); + if ( ProtoState() == MVtProtocolCommand::ESetup && IsFlag( EProto324IFAcquired ) ) + { + TInt cmdId( 0 ); + __VTPRINT( DEBUG_MEDIA, "MH. Calling ConnectToProtocolL on Proto" ) + TRAP( err, cmdId = iSessionCommand->ConnectToProtocolL( ( ( CVtEngUtility::EngineUtils() )->Initializer() ).GetVtComms() ) ); + if ( err == KErrNone ) + { + const TInt res( AddOperation( EConnectProto, cmdId) ); + if ( res < KErrNone ) + { + err = res; + } + iProtoState = MVtProtocolCommand::EConnecting; + __VTPRINT( DEBUG_MEDIA, "MH.protoComC: EConnecting Connecting" ) + } + } + __VTPRINTEXITR( "MH.Connect err=%d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::AddVideoSource +// Adds video source. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::AddVideoSource( TUint aChannelId ) + { + __VTPRINTENTER( "MH.AddVideoSource" ) + + if( !MediaAddingValidity() ) + return KErrCancel; + + TInt cmdId( 0 ); + TRAPD( err, cmdId = iSessionCommand->AddVideoSourceL( + aChannelId, *iLocalVideo->Source() ) ); + if ( err == KErrNone ) + { + const TInt res( AddOperation( EAddVideoSource, cmdId ) ); + if ( res >= KErrNone ) + { + iRemoteMediaState |= EMediaVideoPreparing; + } + else + { + err = res; + } + } + if ( err != KErrNone ) + { + CVtEngEventManager::NotifyEvent( KVtEngMediaInitFailure ); + } + __VTPRINTEXITR( "MH.AddVideoSource %d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::AddAudioSource +// Adds audio source. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::AddAudioSource( TUint aChannelId ) + { + __VTPRINTENTER( "MH.AddAudioSource" ) + + if( !MediaAddingValidity() ) + return KErrCancel; + + TInt cmdId( 0 ); + TInt err( KErrNone ); + // Only for target compilations. +#if !defined( __WINS__ ) + err = iLocalVideo->CreateAudioSource(); + if ( err == KErrNone ) + { + TRAP( err, cmdId = iSessionCommand->AddAudioSourceL( + aChannelId, *iLocalVideo->AudioSource() ) ); + } +#endif // !__WINS__ +#if defined (__WINS__) + aChannelId = aChannelId; // Remove compilation warnings with CW. +#endif // __WINS__ + + if ( err == KErrNone ) + { + const TInt res( AddOperation( EAddAudioSource, cmdId ) ); + if ( res < KErrNone ) + { + err = res; + } + } + if ( err != KErrNone ) + { + CVtEngEventManager::NotifyEvent( KVtEngMediaInitFailure ); + } + if ( IsFlag( ESourceUpdateNeeded ) ) + { + __VTPRINT( DEBUG_MEDIA, "MH.AddASource updateProvider" ) + ClearFlag( ESourceUpdateNeeded ); + // Generate event + iLocalVideo->vsProvidersChanged( + iSelectedCameraId == MVtEngMedia::EPrimaryCamera ); + } + __VTPRINTEXITR( "MH.AddAudioSource %d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::AddVideoSinkL +// Adds video sink. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::AddVideoSink( TUint aChannelId ) + { + __VTPRINTENTER( "MH.AddVideoSink" ) + + if( !MediaAddingValidity() ) + return KErrCancel; + + TInt cmdId( 0 ); + TRAPD( err, cmdId = iRemoteVideo->AddVideoSinkL( aChannelId ) ); + if ( err == KErrNone ) + { + const TInt res( AddOperation( EAddVideoSink, cmdId ) ); + if ( res >= KErrNone ) + { + iRemoteMediaState |= EMediaVideoPreparing; + } + else + { + err = res; + } + } + if ( err != KErrNone ) + { + CVtEngEventManager::NotifyEvent( KVtEngMediaInitFailure ); + } + __VTPRINTEXITR( "MH.AddVideoSink %d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::AddAudioSink +// Adds audio sink. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::AddAudioSink( TUint aChannelId ) + { + __VTPRINTENTER( "MH.AddAudioSink" ) + + if( !MediaAddingValidity() ) + return KErrCancel; + + TInt cmdId( 0 ); + TRAPD( err, cmdId = iRemoteVideo->AddAudioSinkL( aChannelId ) ); + if ( err == KErrNone ) + { + const TInt res( AddOperation( EAddAudioSink, cmdId ) ); + if ( res >= KErrNone ) + { + iRemoteMediaState |= EMediaAudioPreparing; + } + else + { + err = res; + } + } + if ( err != KErrNone ) + { + CVtEngEventManager::NotifyEvent( KVtEngMediaInitFailure ); + } + __VTPRINTEXITR( "MH.AddAudioSink %d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::RemoveOperation +// Removes an operation from stored operations. +// ----------------------------------------------------------------------------- +// +template +TBool CVtEngMediaHandler::RemoveOperation( const T& aOp ) + { + TBool removed( EFalse ); + const TInt pos( IsPending( aOp ) ); + if ( pos != KErrNotFound ) + { + __VTPRINT3( DEBUG_MEDIA, "MH.RemoveOp removed index=%d TOperation=%d", + pos, ( *iPendingOps )[ pos ].iOp ) + iPendingOps->Delete( pos ); + removed = ETrue; + } + return removed; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::AddOperation +// Adds operation to operations pending completion. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::AddOperation( + const TOperation aOp, + TInt aCmdId, + const TBool aResetExisting ) + { + if ( aResetExisting ) + { + iPendingOps->Reset(); + } + TCmdOpPair opPair; + opPair.iOp = aOp; + opPair.iProtoCmdId = aCmdId; + // this should never leave because SetReserveL called in ConstructL + TRAPD( err, iPendingOps->AppendL( opPair ) ); + if ( err != KErrNone ) + { + CVtEngEventManager::NotifyEvent( KVtEngResourceMemAllocFailure ); + return err; + } + const TInt count( iPendingOps->Count() ); + __VTPRINT3( DEBUG_MEDIA, " MH.op added. op=%d,cmdId=%d", aOp, aCmdId ) + __VTPRINT2( DEBUG_MEDIA, " count=%d", count ) + return ( count - 1 ); + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::IsPending +// Checks if a command is set to be completed. +// Checking is done based on operation. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::IsPending( const TOperation aOp ) const + { + const TInt count( iPendingOps->Count() ); + for ( TInt i = 0; i < count ; i++ ) + { + if ( aOp == ( *iPendingOps )[ i ].iOp ) + { + __VTPRINT2( DEBUG_MEDIA, "MH.IsPending VT Op index=%d", i ) + return i; + } + } + __VTPRINT( DEBUG_MEDIA, "MH.IsPending VT Op NOT FOUND" ) + return KErrNotFound; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::IsPending +// Checks if a command is set to be completed. +// Checking is done based on command id. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::IsPending( const TInt aCmdId ) const + { + const TInt count( iPendingOps->Count() ); + for ( TInt i = 0; i < count ; i++ ) + { + if ( aCmdId == ( *iPendingOps )[ i ].iProtoCmdId ) + { + __VTPRINT3( DEBUG_MEDIA, "MH.IsPending ProtoCmdId=%d index=%d", + aCmdId, i ) + return i; + } + } + __VTPRINT( DEBUG_MEDIA, "MH.IsPending ProtoCmdId NOT FOUND" ) + return KErrNotFound; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::CompleteOp +// Asynchronous command completion. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::CompleteOp( const TInt aResult ) + { + CVtEngOperation* opToComplete = iPendingOp; + TInt err( KErrNotFound ); + if ( opToComplete ) + { + iPendingOp = NULL; + opToComplete->HandleOpComplete( aResult ); + err = KErrNone; + } + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::AsyncCompleteOp +// Asynchronous command completion. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::AsyncCompleteOp( const TInt aResult ) + { + iAsyncCallback->Cancel(); + iAsyncCompleteOpResult = aResult; + iAsyncCallback->Start( TCallBack( DoCompleteOp, this ) ); + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::MatchResponseToPendingOps +// Checks if a response matches corresponding operation. +// ----------------------------------------------------------------------------- +// +TBool CVtEngMediaHandler::MatchResponseToPendingOps( + const TInt aProtoCmdId, + const TOperation aOperation, + TInt* aIndex ) + { + const TInt index( IsPending( aOperation ) ); + TBool entryFound( EFalse ); + if ( index != KErrNotFound ) + { + const TCmdOpPair opPair = ( *iPendingOps )[index]; + if ( opPair.iProtoCmdId == aProtoCmdId ) + { + entryFound = ETrue; + if ( aIndex ) + { + *aIndex = index; + } + } + } + __VTPRINT2( DEBUG_MEDIA, "MH.MatchRespToOp was found=%d", entryFound ) + return entryFound; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::StartDisconnectTimerL +// Starts the disconnect timer. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::StartDisconnectTimerL() + { + __VTPRINT( DEBUG_MEDIA, "MH. start disc.timer" ) + if ( iTimer == NULL ) + { + TCallBack cb( CVtEngMediaHandler::TimerCallback, NULL ); + iTimer = CPeriodic::NewL( 0 ); + iTimer->Start( KVtEngDisconnectionTimer, + KVtEngDisconnectionTimer, + cb ); + } + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::NextUninitStepCallbackL +// Proceeds to next uninitializatioin step asynchronously. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::NextUninitStepCallbackL() + { + __VTPRINTENTER( "MH.NextUninitStepCallbackL" ) + if ( !iNextStepCallback ) + { + // perform asap => high priority + TCallBack cb( CVtEngMediaHandler::UninitCallback, this ); + iNextStepCallback = new ( ELeave ) CAsyncCallBack( + cb, CActive::EPriorityHigh ); + iNextStepCallback->CallBack(); + } + __VTPRINTEXIT( "MH.NextUninitStepCallbackL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::UninitCallback +// Asynch callback method for uninitialization. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::UninitCallback( TAny* aAny ) + { + __VTPRINTENTER( "MH.UninitCallback" ) + CVtEngMediaHandler* handler = static_cast( aAny ); + delete handler->iNextStepCallback; + handler->iNextStepCallback = NULL; + handler->UninitializeNextStep(); + __VTPRINTEXIT( "MH.UninitCallback" ) + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::AssignPendingOp +// Assigns operation and completes pending if necessary. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::AssignPendingOp( + CVtEngOperation& aOperation, + TInt aReplaceError ) + { + TInt result = KErrNone; + if ( iPendingOp ) + { + if ( aReplaceError != KErrNone && + // if terminating don't allow other commands + iPendingOp->Command() != KVtEngTerminateSession ) + { + __VTPRINT2( DEBUG_MEDIA, "MH.Assign op replace err=", aReplaceError ) + CompleteOp( aReplaceError ); + // indicate previous operation was "cancelled" (even though it is + // not really cancelled, we still get callback!) + result = KErrCancel; + } + else + { + // not allowed to assign new operation + result = KErrGeneral; + } + } + if ( result != KErrGeneral ) + { + __VTPRINT2( DEBUG_MEDIA, "MH.AssignPendingOp=%d", aOperation.Command() ) + iPendingOp = &aOperation; + } + __VTPRINT2( DEBUG_MEDIA, "MH.AssignPendingOp.res=%d", result ) + return result; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::DoCompleteOp +// Implementation of command completion. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::DoCompleteOp( TAny* aAny ) + { + CVtEngMediaHandler* self = static_cast< CVtEngMediaHandler* >( aAny ); + self->CompleteOp( self->iAsyncCompleteOpResult ); + self->iAsyncCompleteOpResult = KErrNone; + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::GetPendingCommand +// +// ----------------------------------------------------------------------------- +// +TVtEngCommandId CVtEngMediaHandler::GetPendingCommand() + { + if ( iPendingOp ) + { + return iPendingOp->Command(); + } + return KVtEngCommandNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::AssertFlag +// Checks flag's validity. +// ----------------------------------------------------------------------------- +// +#ifdef _DEBUG +void CVtEngMediaHandler::AssertFlag( const TInt aFlag ) const +#else +void CVtEngMediaHandler::AssertFlag( const TInt /* aFlag */ ) const +#endif // _DEBUG + { + __ASSERT_DEBUG( + aFlag == EProtoAudioSourceAdded || + aFlag == EProtoVideoSourceAdded || + aFlag == EProtoAudioSinkAdded || + aFlag == EProtoVideoSinkAdded || + aFlag == EProtoAudioTrackPaused || + aFlag == EProtoVideoTrackPaused || + aFlag == ETwoStageOperation || + aFlag == EProtoPauseVideoRequested || + aFlag == EProtoPauseVideoBlankProv || + aFlag == EProtoContVideoBlankProv || + aFlag == EProtoContVideoBlankInit || + aFlag == ESourceUpdateNeeded || + aFlag == EProtoSendIntraFrame || + aFlag == EProto324IFAcquired || + aFlag == EProtoCancelProtoCmdsOk || + aFlag == EVideoQualitySetByPeer || + aFlag == EOutVideoChannelClosed || + aFlag == EOutAudioChannelClosed, + Panic( EVtEngPanicInvalidFlag ) ); + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::IsFlag +// Checks if a certain flag is set. +// ----------------------------------------------------------------------------- +// +TBool CVtEngMediaHandler::IsFlag( const TInt aFlag ) const + { + AssertFlag( aFlag ); + if ( iProtoStateFlags & aFlag ) + { + return ETrue; + } + else + { + return EFalse; + } + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::SetFlag +// Sets flag on. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::SetFlag( const TInt aFlag ) + { + AssertFlag( aFlag ); + iProtoStateFlags |= aFlag; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::ClearFlag +// Removes a flag. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::ClearFlag( const TInt aFlag ) + { + AssertFlag( aFlag ); + iProtoStateFlags &= ~aFlag; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::SetVolume +// Sets volume values to Protocol. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::SetVolume( + const TInt aVolume, + CVtEngOperation* aOperation ) + { + __VTPRINTENTER( "MH.SetVolume" ) + TInt res( KErrNotFound ); + __VTPRINT2( DEBUG_MEDIA, " vol=%d", aVolume ) + if ( iAudioCtrl ) + { + TInt id( 0 ); + // Max volume cannot be zero. + TInt vol( ( CVtEngUtility::Settings().ValidVolume( aVolume ) ) * + ( iProtoMaxVolume / CVtEngUtility::Settings().MaxVolume() ) ); + __VTPRINT2( DEBUG_MEDIA, "CVtEngMediaHandler::SetVolumeL, vol=%d", vol ) + TRAP( res, id = iAudioCtrl->SetAudioVolumeL( vol ) ); + if ( res == KErrNone ) + { + AddOperation( ESetAudioVolume, id ); + if( aOperation ) + { + AssignPendingOp( *aOperation ); + } + } + } + __VTPRINTEXITR( "MH.SetVolume %d", res ) + return res; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::RequestAudioControllerL +// Requests controllers for audio output and input +// ----------------------------------------------------------------------------- +// +TBool CVtEngMediaHandler::RequestAudioControllerL() + { + __VTPRINTENTER( "MH.RequestAudioControllerL" ) + __VTPRINT( DEBUG_MEDIA, "MH.RequestAudioControllerL" ) + __ASSERT_ALWAYS(iSessionCommand, Panic( EVtEngPanicInvalidAudioPointer ) ); + + TInt id( 0 ); + iAudioCtrl = VTProtocolFactory::GetAudioConfigCommandL(iRemoteVideo->AudioSink()); + + if ( !iAudioCtrl ) + { + CVtEngEventManager::NotifyEvent( KVtEngMediaInitFailure ); + __VTPRINTEXIT( "MH.RequestAudioControllerL Failed" ) + return EFalse; + } + iAudioCtrl->SetObserverL( this ); + + // Get the max value for Protocol volume + TRAPD ( res, id = iAudioCtrl->GetMaxAudioVolumeL( iProtoMaxVolume ) ) ; + __VTPRINT2( DEBUG_MEDIA, "MH.RequestAudioControllerL: err=%d",res ) + if ( res != KErrNone) + { + CVtEngEventManager::NotifyEvent( KVtEngMediaInitFailure ); + __VTPRINTEXIT( "MH.RequestAudioControllerL" ) + return EFalse; + } + + res = AddOperation( EGetAudioGetMaxVolume, id ); + if ( res < KErrNone ) // res is index + { + CVtEngEventManager::NotifyEvent( KVtEngMediaInitFailure ); + __VTPRINT2( DEBUG_MEDIA, "MH.RequestAudioControllerL::res=%d", res ) + } + __VTPRINTEXIT( "MH.RequestAudioControllerL" ) + return ETrue; + } + + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::HandleSpatialTradeoffIndication +// +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::HandleSpatialTradeoffIndication( + const TUint16 aLogicalChannelId, const TUint8 aTradeOff ) + { + __VTPRINTENTER( "MH.HandleSpatialTradeoffIndication" ) + __VTPRINT3( DEBUG_MEDIA, + "MH.HandleSpatialTradeoffIndication id=%d tradeOff=%d", + aLogicalChannelId, aTradeOff ) + ( void ) aLogicalChannelId; + iVideoQuality.UpdateVideoQuality( iVideoQuality.FromTradeOff( aTradeOff ) ); + __VTPRINTEXIT( "MH.HandleSpatialTradeoffIndication" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::HandleSpatialTradeoffCommandL +// +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::HandleSpatialTradeoffCommandL( + const TUint16, const TUint8 aTradeOff ) + { + __VTPRINTENTER( "MH.HandleSpatialTradeoffCommandL" ) + SetVideoQualityL( iVideoQuality.FromTradeOff( aTradeOff ), EFalse ); + __VTPRINTEXIT( "MH.HandleSpatialTradeoffCommandL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::EnableVideoL +// Enables/Disables video sending. +// ----------------------------------------------------------------------------- +// +CVtEngMediaHandler::TOperation CVtEngMediaHandler::EnableVideoL( + const TBool aEnable, const TOperation aOp ) + { + __VTPRINTENTER( "MH.EnableVideoL" ) + __VTPRINT3( DEBUG_MEDIA | DEBUG_DETAIL, "MH.EnableV en=%d state=%d", + aEnable, iProtoState ) + TInt cmdId( 0 ); + TInt err( KErrNone ); + TOperation op( ENone ); + MVtEngMedia::TMediaSource currentSource; + GetSource( currentSource ); + + // Videosource is added and Protocol is in connected state. + if ( IsFlag( EProtoVideoSourceAdded ) && iSessionCommand ) + { + __VTPRINT2( DEBUG_MEDIA | DEBUG_DETAIL, "MH.EnableV source=%d", + currentSource ) + // Has an actual source been selected. + if ( ( currentSource == EMediaNone ) || ( currentSource == EMediaShare ) ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "MH.EnaLocVideo blank" ) + if ( aEnable && IsPending( EEnableVideo) == KErrNotFound ) + { + ClearFlag( EProtoPauseVideoRequested ); + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "MH. Calling ResumeL on Protocol" ) + TRAP( err, cmdId = iSessionCommand->ResumeVideoL( *iLocalVideo->Source() ) ); + if ( err != KErrNone ) + { + // Log the error and leave, UI handles the rest + __VTPRINT2( DEBUG_MEDIA | DEBUG_DETAIL, + "MH.EnaLocVideo PauseL left=%d", err ) + __VTPRINTEXIT( "MH.EnableVideoL" ) + User::Leave( err ); + } + else + { + op = aOp; + AddOperation( aOp, cmdId ); + } + } + // Video to be paused. + else if( !aEnable && IsPending( EDisableVideo ) ) + { + op = DoPauseVideo(); + } + } + else // camera or still image + { + if ( !aEnable && IsPending( EDisableVideo ) ) + { + // Pause video + op = DoPauseVideo(); + } + } + } + else // Not connected and sources not added yet + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "MH.enavideo not conn" ) + // If we are initializing, then this has to be executed + if ( IsFlag( EProtoContVideoBlankProv ) ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "MH.enavideo blank cont" ) + ClearFlag( EProtoContVideoBlankProv ); + SetFlag( EProtoContVideoBlankInit ); + } + + if ( aEnable ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "MH.EnableV clear pending" ) + // Ensure that video sending is enabled in data source. + iLocalVideo->ResumeVideoSending(); + ClearFlag( EProtoPauseVideoRequested ); + } + else + { + iLocalVideo->PauseVideoSending(); + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "MH.EnableV set pending" ) + SetFlag( EProtoPauseVideoRequested ); + } + } + + __VTPRINT2( DEBUG_MEDIA | DEBUG_DETAIL, "MH.EnableV=%d", err ) + __VTPRINTEXITR( "MH.EnableVideoL %d", op ) + return op; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::DoPauseVideo +// Does video pausing. +// ----------------------------------------------------------------------------- +// +CVtEngMediaHandler::TOperation CVtEngMediaHandler::DoPauseVideo() + { + __VTPRINTENTER( "MH.DoPauseVideo" ) + TInt cmdId( 0 ); + TOperation op( ENone ); + __VTPRINT( DEBUG_MEDIA, "MH. Calling PauseL on Protocol" ) + TRAPD( err, cmdId = iSessionCommand->PauseVideoL( *iLocalVideo->Source() ) ); + if ( err != KErrNone ) + { + __VTPRINT2( DEBUG_MEDIA | DEBUG_DETAIL, + "MH.DoPauseVideo PauseL left=%d", err ) + // Remove the 2 stage flag, since PauseL failed. + // Command should be completed. + if( IsFlag( ETwoStageOperation ) ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + " Disable 2 stage clearance" ) + ClearFlag( ETwoStageOperation ); + } + } + else + { + AddOperation( EDisableVideo, cmdId ); + op = EDisableVideo; + __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, + "MH.DisaLocVideo PauseL issued" ) + } + ClearFlag( EProtoPauseVideoRequested ); + __VTPRINTEXITR( "MH.DoPauseVideo %d", op ) + return op; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::HandleAudioOutputControlCommandComplete +// Callback function for audio controller commands. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::HandleAudioOutputControlCommandComplete(TInt aId, + TVtAudioOutputControlCommand aCmd, + TAny* /*aContextData*/, + TInt aStatus) + { + __VTPRINTENTER( "MH.HandleAudioOutputControlCommandComplete" ) + __VTPRINT2( DEBUG_MEDIA, "MH.AudioComC CMD=%d", aCmd ) + __VTPRINT2( DEBUG_MEDIA, "MH.AudioComC cmdId=%d", aId ) + __VTPRINT2( DEBUG_MEDIA, "MH.AudioComC stat=%d", aStatus ) + + switch ( aCmd ) + { + case EVtAudioOutputControlGetMaxVolume: + RemoveOperation( aId ); + InitializeVolume(); + break; + case EVtAudioOutputControlSetVolume: + __VTPRINT2( DEBUG_MEDIA, "MH.protoComC SetVolume=%d", + iUpdateVolumeRequired ) + + RemoveOperation( aId ); + + if ( iUpdateVolumeRequired ) + { + iUpdateVolumeRequired = EFalse; + UpdateVolume(); + } + + if ( IsPending( ESetAudioVolume ) == KErrNotFound && + iPendingOp == iPendingVolumeOp ) + { + iPendingVolumeOp = NULL; + CompleteOp( aStatus ); + } + break; + case EVtAudioOutputControlGetBalance: + case EVtAudioOutputControlSetBalance: + case EVtAudioOutputControlGetVolume: + default: + break; + } + __VTPRINTEXIT( "MH.HandleAudioOutputControlCommandComplete" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::InitializeVolume +// Sets the 'beginning' values for volume. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::InitializeVolume() + { + __VTPRINT2( DEBUG_MEDIA, "MH.InitializeVolume: max vol=%d", iProtoMaxVolume ) + iUpdateVolumeAllowed = ETrue; + UpdateVolume(); + if ( iLocalVideo ) + { + iLocalVideo->UnMute(); + } + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::DisconnectProtoL +// Does the disconnecting of Protocol. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::DisconnectProtoL() + { + __VTPRINTENTER( "MH.DisconnectProtoL" ) + __VTPRINT2( DEBUG_MEDIA, "MH.DisconnectProto with Protocol state=%d", + iProtoState ) + TInt cmdId( 0 ); + // The two states that require disconnecting + if ( iProtoState == MVtProtocolCommand::EConnected || + iProtoState == MVtProtocolCommand::EConnecting ) + { + __VTPRINT( DEBUG_MEDIA, "MH. Calling DisconnectFromProtocolL on Protocol" ) + TRAPD( err, cmdId = iSessionCommand->DisconnectFromProtocolL() ); + if ( err == KErrNone ) + { + __VTPRINT( DEBUG_MEDIA, "MH.protoCom: Disconnecting" ) + AddOperation( EDestructProtoPhaseDisconnect, cmdId ); + iProtoState = MVtProtocolCommand::EDisconnecting; + StartDisconnectTimerL(); + } + else + { + // Canceling the disconnect to notify that it has failed + __VTPRINT2( DEBUG_MEDIA, "MH.DisconnectProto erronous=%d", err ) + cmdId = err; + } + } + else { + cmdId = KErrNotSupported; + } + __VTPRINTEXITR( "MH.DisconnectProtoL cmdId=%d", cmdId ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::CancelAllProtoCommands +// Cancels all commands pending for execution in Proto. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::CancelAllProtoCommands( TOperation &aOp ) + { + __VTPRINTENTER( "MH.CancelAllProtoCommands" ) + TInt err( KErrNotReady ); + aOp = ENone; + if ( IsPending( EUninitializeCancelAllProto ) != KErrNotFound ) + { + aOp = EUninitializeCancelAllProto; + // Indicate difference from started cancellation with error code. + err = KErrAlreadyExists; + } + else if ( iSessionCommand && iPendingOps && !IsFlag( EProtoCancelProtoCmdsOk ) ) + { + if ( iPendingOps->Count() ) + { + __VTPRINT( DEBUG_MEDIA, "MH. Calling CancelAllCommandsL on Proto" ) + TInt cmdId( 0 ); + TRAP( err, ( cmdId = iSessionCommand->CancelAllCommandsL() ) ); + __VTPRINT2( DEBUG_MEDIA | DEBUG_DETAIL, + "MH.CancelAllProtoCommands cmdId=%d", cmdId ) + if ( cmdId && err == KErrNone ) + { + aOp = EUninitializeCancelAllProto; + SetFlag( EProtoCancelProtoCmdsOk ); + AddOperation( aOp, cmdId ); + } + // completes in CommandCompletedL + } + else { + // mark there's nothing to cancel + SetFlag( EProtoCancelProtoCmdsOk ); + } + } + __VTPRINTEXITR( "MH.CancelAllProtoCommands err=%d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::ProtoInitialized +// Proto init completed. +// ----------------------------------------------------------------------------- +// +TBool CVtEngMediaHandler::ProtoInitialized() const + { + return iSessionCommand ? ETrue : EFalse; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::TimerCallback +// Callback method for timer expiration. +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::TimerCallback( TAny* /*aAny*/ ) + { + __VTPRINT( DEBUG_MEDIA, "MH.TimerCallback -> PANIC " ) + Panic( EVtEngPanicDisconnectTimerExpired ); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::SetVersionInfoL +// Sets version information to Proto. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::SetVersionInfoL( ) + { + __VTPRINTENTER( "MH.SetVersionInfoL" ) + + if ( !iH324Config ) + { + __VTPRINT( DEBUG_MEDIA, "MH.SetVersion not ready" ) + User::Leave( KErrNotReady ); + } + + // Current new line character index + TInt index( 0 ); + + // Version information from SysUtil + HBufC* versionInfo16 = HBufC::NewLC( KVtEngSwVersionTextLength ); + + // Pointer to SysUtil versionInfo descriptor. Temporary pointer to + // handle data. + TPtr versionInfoptr16( versionInfo16->Des() ); + + // SW Version and product information buffers to be send to peer. + HBufC8* version = HBufC8::NewLC( KVtEngSwVersionTextLength ); + HBufC8* product = HBufC8::NewLC( KVtEngSwVersionTextLength ); + TPtr8 versionPtr8( version->Des() ); + TPtr8 productPtr8( product->Des() ); + + // Marker for line ending '\n' + const TChar endLine( KVtEngCharacterEndLine ); + + TInt err = ( SysUtil::GetSWVersion( versionInfoptr16 ) ); + if ( err != KErrNone || !versionInfoptr16.Length() ) + { + __VTPRINT2( DEBUG_MEDIA, "MH.SetVersion SU: %d", err ) + __VTPRINTEXIT( "MH.SetVersionInfoL" ) + return; + } +#ifdef VTDEBUG + RDebug::Print( _L("SysUtil::GetSWVersion: %s"), versionInfoptr16.Ptr() ); +#endif + // Construct similar buffer than for version information and get po + HBufC* productInfo16 = versionInfo16->AllocLC(); + TPtr productInfoptr16( productInfo16->Des() ); + + // We assume that format from file is: + // SW version\ndate\nproduct\nmanufacturer + // \n is new line character + + // Find first new line character + index = versionInfo16->Locate( endLine ); + if ( index >= 0 ) + { + // Replace new line character using space. + versionInfoptr16[ index ] = KVtEngCharacterSpace ; + + // Find second new line character, this ends the version information + index = versionInfo16->Locate( endLine ); + if ( index >= 0 ) + { + // Take version information and ignore product info. + versionInfoptr16 = versionInfo16->Left( index ); + + // Take product information and ignore version information. + productInfoptr16 = productInfo16->Mid( index + 1 ); + + // Find the only remaining new line character. + index = productInfoptr16.Locate( endLine ); + + // Replace new line character using space. + productInfoptr16[ index ] = KVtEngCharacterSpace; + + // Copy 16 bit descriptors to 8 bit descriptors and append + // zero terminators. + versionPtr8.Copy( versionInfoptr16 ); + versionPtr8.ZeroTerminate(); + productPtr8.Copy( productInfoptr16 ); + productPtr8.ZeroTerminate(); + + // Set the info to Protocol +#ifdef VTDEBUG + RDebug::Print(_L("MH.Product: %s" ), productPtr8.Ptr() ); + RDebug::Print(_L("MH.Version: %s" ), versionPtr8.Ptr() ); +#endif //VTDEBUG + + AddOperation( ESetVendorId, + iH324Config->SetVendorId( KVtEngCountryCodeForProto, + KVtEngExtensionForProto, + KVtEngManufacturerForProto, &productPtr8, &versionPtr8 ) ); + } + } + CleanupStack::PopAndDestroy( 4 ); // HBufC's + __VTPRINTEXIT( "MH.SetVersionInfoL" ) + } + + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::RequestFrame +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::RequestFrame( ) + { + __VTPRINTENTER( "MH.RequestFrame" ) + if ( !iH263Encoder ) + { + __VTPRINT( DEBUG_MEDIA, "MH.RequestFrame FAILED") + return; + } + AddOperation( ESendIntraframe,iH263Encoder->RequestNextIntraFrame() ); + ClearFlag( EProtoSendIntraFrame ); + + __VTPRINTEXIT( "MH.RequestFrame" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::SetVideoQualityL +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::SetVideoQualityL( + const TVideoQuality aVideoQuality, const TBool aSetPeerVideoQuality ) + { + __VTPRINTENTER( "MH.SetVideoQualityL" ) + if ( !iH263Encoder ) + { + __VTPRINT( DEBUG_MEDIA, "MH.SetVideoQualityL FAILED") + return; + } + SetFlag( EVideoQualitySetByPeer ); + TInt protoOperId( iH263Encoder->SetVideoFrameRate( + iVideoQuality.ToFrameRate( aVideoQuality ) ) ); + AddOperation( ESetVideoQuality, protoOperId ); + iVideoQuality.SettingVideoQuality( protoOperId, + aVideoQuality, aSetPeerVideoQuality ); + __VTPRINTEXIT( "MH.SetVideoQualityL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::SetPeerVideoQuality +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::SetPeerVideoQuality( const TVideoQuality aVideoQuality ) + { + __VTPRINTENTER( "MH.SetPeerVideoQuality" ) + AddOperation( ESendVTSTO, iH324Config->SendVideoTemporalSpatialTradeoffCommand( + iVideoIncomingLogicalChannel.iLogicalChannelId, + iVideoQuality.ToTradeOff( aVideoQuality ) ) ); + __VTPRINTEXIT( "MH.SetPeerVideoQuality" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::HandleVideoEncoderCommandCompletedL +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::HandleVideoEncoderCommandCompletedL( + const TVtCommandResponse& aResponse ) + { + __VTPRINTENTER( "MH.EncExtCommandCompleted" ) + + __VTPRINT2( DEBUG_MEDIA, "MH.263 ComC type=%d", aResponse.iCmdType ) + __VTPRINT3( DEBUG_MEDIA, "MH.263 ComC cmdId=%d,response=%d", + aResponse.iCmdId, aResponse.iCmdStatus ) + + // Find correct entry in iPendingOps based on TOperation because there can + // be several entries with same Protocol cmd id since each Protocol interface has their + // own id allocation and ids may overlap. + TInt index( KErrNotFound ); + TOperation completedOp = ENone; + if ( MatchResponseToPendingOps( aResponse.iCmdId, ESendIntraframe, &index ) || + MatchResponseToPendingOps( aResponse.iCmdId, ESetIFrameInterval, &index ) || + MatchResponseToPendingOps( aResponse.iCmdId, ESetVideoQuality, &index ) ) + { + // TOperation entries in are unique in the array... + const TCmdOpPair pair = (*iPendingOps)[ index ]; + completedOp = pair.iOp; + // ...so remove based on that instead of protoCmdId + RemoveOperation( completedOp ); + } + else + { + __VTPRINT( DEBUG_MEDIA, "MH.EECC ERROR (response to unknown command)" ) + } + if ( completedOp == ESetVideoQuality ) + { + __VTPRINT( DEBUG_MEDIA, "MH.EECC ESetVideoQuality" ) + if( iPendingOp && ( iPendingOp->Command() == KVtEngSetVideoQuality ) ) + { + CompleteOp( aResponse.iCmdStatus ); + } + if( aResponse.iCmdStatus == KErrNone ) + { + TVtEngVideoQuality::TVQSParams vqp; + + if ( iVideoQuality.SettingSucceeded( aResponse.iCmdId, vqp ) ) + { + __VTPRINT( DEBUG_MEDIA, "MH.EECC sending vq indication" ) + AddOperation( ESendVTSTO, + iH324Config->SendVideoTemporalSpatialTradeoffIndication( + iVideoOutgoingLogicalChannel.iLogicalChannelId, + iVideoQuality.ToTradeOff( vqp.iValue ) ) ); + if ( vqp.iSetPeer ) + { + __VTPRINT( DEBUG_MEDIA, "MH.EECC setting peer vq" ) + SetPeerVideoQuality( vqp.iValue ); + } + } + } + else + { + iVideoQuality.SettingFailed( aResponse.iCmdId ); + } + } + if ( iProtoState == MVtProtocolCommand::EIdle ) + { // Command was complete during uninitialization. + NextUninitStepCallbackL(); + } + __VTPRINTEXIT( "MH.EncExtCommandCompleted" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::HandleVideoEncoderInformationalEventL +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::HandleVideoEncoderInformationalEventL( + const TVtIndicationEvent& aEvent) + { + __VTPRINT2( DEBUG_MEDIA, "MH.263 infoevent=%d", aEvent.iEventType ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::HandleH324MConfigCommandCompletedL +// +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::HandleH324MConfigCommandCompletedL( + const TVtCommandResponse& aResponse ) + { + __VTPRINTENTER( "MH.HandleH324MConfigCommandCompletedL" ) + + __VTPRINT2( DEBUG_MEDIA, "MH.HandleH324MConfigCommandCompletedL type=%d", aResponse.iCmdType ) + __VTPRINT3( DEBUG_MEDIA, "MH.HandleH324MConfigCommandCompletedL cmdId=%d,response=%d", aResponse.iCmdId, aResponse.iCmdStatus ) + TInt index( KErrNotFound ); + // Find correct entry in iPendingOps based on TOperation because there can + // be several entries with same Protocol cmd id since each Protocol interface has their + // own id allocation and ids may overlap. + if ( MatchResponseToPendingOps( aResponse.iCmdId, ESetVendorId, &index ) || + MatchResponseToPendingOps( aResponse.iCmdId, ESendVTSTO, &index ) || + MatchResponseToPendingOps( aResponse.iCmdId, ESetSupportedResolutions, &index ) || + MatchResponseToPendingOps( aResponse.iCmdId, ESetFastCsupOptions, &index ) ) + { + // TOperation entries in are unique in the array... + const TCmdOpPair pair = (*iPendingOps)[ index ]; + // ...so remove based on that instead of protoCmdId + RemoveOperation( pair.iOp ); + } + switch( iProtoState ) + { + case MVtProtocolCommand::EConnected: + { + CVtEngStateManager* stateManager = CVtEngUtility::StateManager(); + + // Check does the received command ID match to command ID that was received + // from Protocol when DTMF was send. + if( stateManager->Handlers().Dtmf().CheckCommandId( aResponse.iCmdId ) ) + { + __VTPRINT( DEBUG_MEDIA, "MH.Complete DTMF" ) + stateManager->Handlers().Dtmf().SendComplete( aResponse.iCmdStatus ); + } + } + break; + case MVtProtocolCommand::EIdle: // extension command complete + NextUninitStepCallbackL(); + default: + break; + } + + __VTPRINTEXITR( "MH.HandleH324MConfigCommandCompletedL.CommandID %d", aResponse.iCmdId ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::HandleH324MConfigInformationalEventL +// +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::HandleH324MConfigInformationalEventL( + const TVtIndicationEvent& aEvent ) + { + __VTPRINTENTER( "MH.HandleH324MConfigInformationalEventL" ) + + const TInt type( aEvent.iEventType ); + const TUint8* buffer = (const_cast(aEvent)).iLocalBuffer; + + switch(type) + { + case EVtIndicationVideoSpatialTamporalTradeOffIndication: + case EVtIndicationVideoSpatialTamporalTradeOffCommand: + { + TUint16 logicalChannelId = BigEndian::Get16( buffer ); + TUint8 tradeOffValue = buffer[ 2 ]; + __VTPRINT3( DEBUG_MEDIA, "MH.protoHIE.H324 channelId=%d, tradeOff=%d", + logicalChannelId, tradeOffValue ) + if( type == + EVtIndicationVideoSpatialTamporalTradeOffIndication ) + { + HandleSpatialTradeoffIndication( logicalChannelId, + tradeOffValue ); + } + else + { + HandleSpatialTradeoffCommandL( logicalChannelId, + tradeOffValue ); + } + } + break; + + // When remote terminal sends its UII capabilities in TCS we get + // indication from Protocol. If remote does not send UII capas in TCS + // we are obliged to use alphanumeric UIIs as specified by 245 + // spec. Default is IA5String.We get bit pattern from Protocol but + // they are listed below in preferred order of usage. + // The order can be freely chosen. + case EVtIndicationUserInputCapability: + { +#ifdef VTDEBUG + RDebug::Print(_L("Buffer[0]:%d"), buffer[0] ); +#endif // VTDEBUG + __VTPRINT( DEBUG_MEDIA, + "MH.protoHIE UserInput Capability Indication" ) + + CVtEngStateManager* stateManager = + CVtEngUtility::StateManager(); + + // IA5String preferred, it's the simplest and most used in TCSs. + if ( buffer[0] & CVtEngDtmfHandler::EIA5String ) + { + stateManager->Handlers().Dtmf().SetUIISupport( + CVtEngDtmfHandler::EIA5String ); + CVtEngEventManager::NotifyEvent( + KVtEngRemoteUIIIA5StringSupport ); + __VTPRINT( DEBUG_MEDIA, + "KVtEngRemoteUIIIA5StringSupport Support signalled" ) + } + // Basic string is also simple and easy to use, second position. + else if ( buffer[0] & CVtEngDtmfHandler::EBasicString ) + { + stateManager->Handlers().Dtmf().SetUIISupport( + CVtEngDtmfHandler::EBasicString ); + CVtEngEventManager::NotifyEvent( + KVtEngRemoteUIIBasicStringSupport ); + __VTPRINT( DEBUG_MEDIA, + "KVtEngRemoteUIIBasicStringSupport Support signalled" ) + } + // DTMFs are more limited but more interoperable than + // General string. + else if ( buffer[0] & CVtEngDtmfHandler::EDTMFString ) + { + stateManager->Handlers().Dtmf().SetUIISupport( + CVtEngDtmfHandler::EDTMFString ); + CVtEngEventManager::NotifyEvent( KVtEngRemoteUIIDtmfSupport ); + __VTPRINT( DEBUG_MEDIA, + "KVtEngRemoteUIIDtmfSupport Support signalled" ) + } + // General string is the complicated one, priority is + // lowest because of possible diffuculties in remote + // end decoding of string (various number of letter + // combinations). + else if ( buffer[0] & CVtEngDtmfHandler::EGeneralString ) + { + stateManager->Handlers().Dtmf().SetUIISupport( + CVtEngDtmfHandler::EGeneralString ); + CVtEngEventManager::NotifyEvent( + KVtEngRemoteUIIGeneralStringSupport ); + __VTPRINT( DEBUG_MEDIA, + "KVtEngRemoteUIIGeneralStringSupport Support signalled" ) + } + else + { + __VTPRINT( DEBUG_MEDIA, "MH.HIE invalid DTMF" ) + Panic( EVtEngPanicInvalidDtmfState ); + } + } + break; + } + __VTPRINTEXIT( "MH.HandleH324MConfigInformationalEventL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::SetSupportedResolutionsL +// Sets supported resolutions to protocol. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::SetSupportedResolutions() + { + __VTPRINTENTER( "MH.SetSupportedResolutions" ) + __ASSERT_ALWAYS( iH324Config != NULL, Panic( EVtEngPanicInvalidPointer ) ); + + AddOperation( ESetSupportedResolutions, + iH324Config->SetSupportedResolutions( ) ); + __VTPRINTEXIT( "MH.SetSupportedResolutions " ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::SetFastCsupOptions +// Sets supported resolutions to Protocol. +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::SetFastCsupOptions() + { + __VTPRINTENTER( "MH.SetFastCsupOptions" ) + + AddOperation( + ESetFastCsupOptions, + iH324Config->SetFastCsupOptions( ) ); + __VTPRINTEXIT( "MH.SetFastCsupOptions" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::CreateExtensionsL +// Creates extension according to API Uid. +// ----------------------------------------------------------------------------- +// +CVtEngExtensionBase* CVtEngMediaHandler::CreateExtensionsL( const TUid& aUid ) + { + __VTPRINTENTER( "MH.CreateExtensionsL" ) + + // if UID is supported camera pref + if ( aUid == KVtEngExtensionCameraPreferences ) + { + __VTPRINT2( DEBUG_GEN, "MH.CreateExtensionsL extension UID=%d", + aUid.iUid ) + + CVtEngExtensionBase* base = reinterpret_cast< CVtEngExtensionBase* > + ( iLocalVideo->CreateCameraPreferencesL() ); + __VTPRINTEXITR( "MH.CreateExtensionsL base [%d]", ( TInt )base ) + return base; + } + +#if defined ( RD_VT_RTF ) + + // if UID is supported R2F + else if ( aUid == KVtEngExtensionRecord2File ) + { + CVtEngExtensionBase* base = reinterpret_cast< CVtEngExtensionBase* > + ( CVtEngRecord2File::NewL() ); + __VTPRINTEXITR( "MH.CreateExtensionsL base [%d]", ( TInt )base ) + return base; + } + // not supported UID + +#endif //RD_VT_RTF + + else + { + __VTPRINTEXITR( "MH.CreateExtensionsL error [%d]", KErrNotSupported ) + User::Leave( KErrNotSupported); + return NULL; + } + } + +// Implementation for TVtEngVideoQuality + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::TVtEngVideoQuality::TVtEngVideoQuality +// ----------------------------------------------------------------------------- +// +CVtEngMediaHandler::TVtEngVideoQuality::TVtEngVideoQuality() + : iCurrent( EVideoQualityNormal ), iParamList( 1 ) + { + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::TVtEngVideoQuality::~TVtEngVideoQuality +// ----------------------------------------------------------------------------- +// +CVtEngMediaHandler::TVtEngVideoQuality::~TVtEngVideoQuality() + { + iParamList.Reset(); + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::TVtEngVideoQuality::SettingVideoQuality +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::TVtEngVideoQuality::SettingVideoQuality( + TInt aId, const TVideoQuality aValue, TBool aSetPeer ) + { + __VTPRINTENTER( "MH.VQ.SettingVideoQuality" ) + iParamList.Append( TVQSParams( aId, aValue, aSetPeer ) ); + __VTPRINTEXIT( "MH.VQ.SettingVideoQuality" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::TVtEngVideoQuality::VideoQuality +// ----------------------------------------------------------------------------- +// +MVtEngMedia::TVideoQuality + CVtEngMediaHandler::TVtEngVideoQuality::VideoQuality() const + { + __VTPRINTENTER( "MH.VQ.VideoQuality" ) + __VTPRINTEXITR( "MH.VQ.VideoQuality %d", iCurrent ) + return iCurrent; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::TVtEngVideoQuality::IsSetPeer +// ----------------------------------------------------------------------------- +// +TBool CVtEngMediaHandler::TVtEngVideoQuality::SettingSucceeded( TInt aId, + TVQSParams& aParams ) + { + __VTPRINTENTER( "MH.VQ.SettingSucceeded" ) + TInt index( FindVQSParam( aId ) ); + TBool foundRecord( index != KErrNotFound ); + if ( foundRecord ) + { + aParams = iParamList[ index ]; + iParamList.Remove( index ); + iParamList.Compress(); + } + __VTPRINTEXITR( "MH.VQ.SettingSucceeded %d", foundRecord ) + return foundRecord; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::TVtEngVideoQuality::IsSetPeer +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::TVtEngVideoQuality::UpdateVideoQuality( + const TVideoQuality aVideoQuality ) + { + __VTPRINTENTER( "MH.VQ.UpdateVideoQuality" ) + iCurrent = aVideoQuality; + __VTPRINTEXIT( "MH.VQ.UpdateVideoQuality" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::TVtEngVideoQuality::SettingFailed +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::TVtEngVideoQuality::SettingFailed( TInt aId ) + { + __VTPRINTENTER( "MH.VQ.SettingFailed" ) + TInt index( FindVQSParam( aId ) ); + if ( index != KErrNotFound ) + { + iParamList.Remove( index ); + iParamList.Compress(); + } + __VTPRINTEXITR( "MH.VQ.SettingFailed %d", index ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::TVtEngVideoQuality::FromTradeOff +// ----------------------------------------------------------------------------- +// +MVtEngMedia::TVideoQuality + CVtEngMediaHandler::TVtEngVideoQuality::FromTradeOff( + const TInt aTradeOff ) const + { + __VTPRINTENTER( "MH.VQ.FromTradeOff" ) + TVideoQuality videoQuality; + + // [0 .. KVtEngTradeOffDetailMax] + if( aTradeOff <= KVtEngTradeOffDetailMax ) + { + videoQuality = EVideoQualityDetail; + } + // ]KVtEngTradeOffDetailMax .. KVtEngTradeOffNormalMax] + else if( aTradeOff <= KVtEngTradeOffNormalMax ) + { + videoQuality = EVideoQualityNormal; + } + // ]KVtEngTradeOffNormalMax .. 31] + else + { + videoQuality = EVideoQualityMotion; + } + __VTPRINTEXITR( "MH.VQ.FromTradeOff %d", videoQuality ) + return videoQuality; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::TVtEngVideoQuality::ToFrameRate +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::TVtEngVideoQuality::ToFrameRate( + const TVideoQuality aVideoQuality ) const + { + __VTPRINTENTER( "MH.VQ.ToFrameRate" ) + TInt frameRate( 0 ); + CVtEngSettings& settings = CVtEngUtility::Settings(); + switch( aVideoQuality ) + { + case EVideoQualityDetail: + frameRate = settings.VideoQualityFrameRateConfig().iDetail; + break; + + case EVideoQualityNormal: + frameRate = settings.VideoQualityFrameRateConfig().iNormal; + break; + + case EVideoQualityMotion: + frameRate = settings.VideoQualityFrameRateConfig().iMotion; + break; + + default: + Panic( EVtEngPanicInvalidVideoQualityValue ); + break; + } + __VTPRINTEXITR( "MH.VQ.ToFrameRate %d", frameRate ) + return frameRate; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::TVtEngVideoQuality::ToTradeOff +// ----------------------------------------------------------------------------- +// +TUint8 CVtEngMediaHandler::TVtEngVideoQuality::ToTradeOff( + const TVideoQuality aVideoQuality ) const + { + __VTPRINTENTER( "MH.VQ.ToTradeOff" ) + TUint8 tradeOff( 0 ); + switch( aVideoQuality ) + { + case EVideoQualityDetail: + tradeOff = KVtEngTradeOffDetailMax; + break; + + case EVideoQualityNormal: + tradeOff = KVtEngTradeOffNormalMax; + break; + + case EVideoQualityMotion: + tradeOff = KVtEngTradeOffMotionMax; + break; + + default: + Panic( EVtEngPanicInvalidVideoQualityValue ); + break; + } + __VTPRINTEXITR( "MH.VQ.ToTradeOff %d", tradeOff ) + return tradeOff; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::TVtEngVideoQuality::FindVQSParam +// ----------------------------------------------------------------------------- +// +TInt CVtEngMediaHandler::TVtEngVideoQuality::FindVQSParam( TInt aId ) const + { + __VTPRINTENTER( "MH.VQ.FindVQSParam" ) + TInt result( KErrNotFound ); + for ( TInt i = iParamList.Count() - 1; i >= 0; i-- ) + { + if ( iParamList[ i ].iId == aId ) + { + result = i; + break; + } + } + __VTPRINTEXITR( "MH.VQ.FindVQSParam %d", result ) + return result; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::TVtEngVideoQuality::TVQSParams::TVQSParams +// ----------------------------------------------------------------------------- +// +CVtEngMediaHandler::TVtEngVideoQuality::TVQSParams::TVQSParams() + { + Mem::FillZ( this, sizeof( TVQSParams ) ); + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::TVtEngVideoQuality::TVQSParams::TVQSParams +// ----------------------------------------------------------------------------- +// +CVtEngMediaHandler::TVtEngVideoQuality::TVQSParams::TVQSParams( + TInt aId, const TVideoQuality aValue, TBool aSetPeer ) + : iId( aId ), iValue( aValue ), iSetPeer( aSetPeer ) + { + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::QueryProtoInterfacesL +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::QueryProtoInterfacesL() + { + __VTPRINTENTER( "MH.QueryProtoInterfacesL" ) + // Ensure call is still connected to prevent unnecessary Protocol + // interface acquisition + CVtEngStateManager* states = CVtEngUtility::StateManager(); + const MVtEngSessionInfo::TSessionState sessionState = + states->SessionState(); + if ( sessionState != MVtEngSessionInfo::EIdle && + sessionState != MVtEngSessionInfo::EClearing ) + + { + // Request the 324M Stack interface + if ( !IsFlag( EProto324IFAcquired ) ) + { + /* + AddOperation( EGet324CtrlInterface, + iSessionCommand->GetProtocolInterfaceL( + EVtH324Config, + ( MVtProtocolCommand*& ) iH324Config )); + */ + MVtProtocolCommand *pCommand = NULL; + AddOperation( EGet324CtrlInterface, + iSessionCommand->GetProtocolInterfaceL( + EVtH324Config, + ( MVtProtocolCommand*& ) pCommand )); + iH324Config = static_cast(pCommand); + } + // Get encoder interface. + /* + AddOperation( EGetH263EncInterface, + iSessionCommand->GetProtocolInterfaceL( + EVtVideoEncoderConfig, + ( MVtProtocolCommand*& ) iH263Encoder )); + */ + MVtProtocolCommand *pCommand = NULL; + AddOperation( EGetH263EncInterface, + iSessionCommand->GetProtocolInterfaceL( + EVtVideoEncoderConfig, + ( MVtProtocolCommand*& ) pCommand )); + iH263Encoder = static_cast(pCommand); + } + __VTPRINTEXIT( "MH.QueryProtoInterfacesL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::ReleaseProtoInterfacesL +// ----------------------------------------------------------------------------- +// +void CVtEngMediaHandler::ReleaseProtoInterfacesL() + { + __VTPRINTENTER( "MH.ReleaseProtoInterfacesL" ) + + // Release interfaces + __VTPRINT( DEBUG_MEDIA, "LCN: MH.324 started to release interfaces" ) + if( iH324Config ) + { + /* + AddOperation( ERemove324CtrlInterface, + iSessionCommand->DeleteProtocolInterfaceL( EVtH324Config, iH324Config ) );*/ + MVtProtocolCommand *pCommand = NULL; + pCommand = static_cast(iH324Config); + AddOperation( ERemove324CtrlInterface, + iSessionCommand->DeleteProtocolInterfaceL( EVtH324Config, pCommand ) ); + iH324Config = 0; + __VTPRINT( DEBUG_MEDIA, "MH.324 started to release" ) + } + + if ( iH263Encoder ) + { + /* + AddOperation( ERemoveH263EncInterface, + iSessionCommand->DeleteProtocolInterfaceL( EVtVideoEncoderConfig, iH263Encoder ) );*/ + MVtProtocolCommand *pCommand = NULL; + pCommand = static_cast(iH263Encoder); + AddOperation( ERemoveH263EncInterface, + iSessionCommand->DeleteProtocolInterfaceL( EVtVideoEncoderConfig, pCommand ) ); + iH263Encoder = 0; + iH263Encoder = 0; + __VTPRINT( DEBUG_MEDIA, "MH.263 started to release" ) + } + __VTPRINTEXIT( "MH.ReleaseProtoInterfacesL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::ExtensionCommandsPending +// ----------------------------------------------------------------------------- +// +TBool CVtEngMediaHandler::ExtensionCommandsPending() const + { + __VTPRINTENTER( "MH.ExtensionCommandsPending" ) + TBool isPending = EFalse; + TInt count( iPendingOps->Count() ); + while ( count-- ) + { + const TOperation op = ( *iPendingOps )[ count ].iOp; + switch ( op ) + { + // extension commands + case ESendIntraframe: + case ESetSupportedResolutions: + case ESetVideoQuality: + case ESendVTSTO: + case ESetFastCsupOptions: + case ESetVendorId: + case ESetIFrameInterval: + isPending = ETrue; +#ifdef _DEBUG + RDebug::Print( _L(" (ext) op=%d,protoCmdId=%d"), + op, ( *iPendingOps )[ count ].iProtoCmdId ); +#else +// in debug mode allow printing all pending ops to log + count = 0; // break loop +#endif + break; + default: + break; + } + } + __VTPRINTEXITR( "MH.ExtensionCommandsPending %d", isPending ) + return isPending; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::MediaAddingValidity +// ----------------------------------------------------------------------------- +// +TBool CVtEngMediaHandler::MediaAddingValidity() const + { + __VTPRINTENTER( "MH.MediaAddingValidity" ) + + TBool addingOK( ETrue ); + CVtEngStateManager* states = CVtEngUtility::StateManager(); + MVtEngSessionInfo::TSessionState sessionState ( states->SessionState() ); + if( sessionState == MVtEngSessionInfo::EClearing || + sessionState == MVtEngSessionInfo::EIdle ) + { + __VTPRINT( DEBUG_MEDIA, "MH.MediaAddingValidity NOT ALLOWED" ) + // State is wrong, adding not allowed. + addingOK = EFalse; + } + + __VTPRINTEXITR( "MH.MediaAddingValidity %d", addingOK ) + + return addingOK; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediaHandler::CancelInitializeShareImage +// ----------------------------------------------------------------------------- +void CVtEngMediaHandler::CancelInitializeShareImage() + { + __VTPRINTENTER( "CVtEngMediaHandler.CancelInitializeShareImage"); + if(iLocalVideo) + { + iLocalVideo->CancelInitializeShareImage(); + } + __VTPRINTEXIT( "CVtEngMediaHandler.CancelInitializeShareImage"); + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Media/CVtEngRemoteVideo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Media/CVtEngRemoteVideo.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,737 @@ +/* +* Copyright (c) 2004-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: Remote video handler. +* +*/ + + + +// INCLUDE FILES +#include "CVtEngRemoteVideo.h" +#include "CVtEngStateManager.h" +#include "MVtEngFrameObserver.h" +#include +#include "CVtEngSettings.h" +#include "VtEngUtils.h" +#include "CVtEngEventManager.h" +#include "VtEngConstants.h" +#include "VtEngPanic.h" +#include "TVtEngRenderingDSA.h" +#include "TVtEngRenderingDP.h" +#include "TVtEngRenderingNGA.h" +#include "TVtEngRenderConfigDSA.h" +#include "TVtEngRenderConfigDP.h" +#include "TVtEngRenderConfigNGA.h" +#include "CVtEngDrawDP.h" +#include "CVtEngDrawDSA.h" +#include "CVtEngDrawNGA.h" +#include +#include +#include +#include +#include + +// LOCAL CONSTANTS AND MACROS +// This active object priority. +const TInt KVtEngRemoteDrawPriority = CActive::EPriorityStandard; + +// Timer priority when not frame watching. +const TInt KVtEngStoppedRenderPriority = CActive::EPriorityLow; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::CVtEngRemoteVideo +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngRemoteVideo::CVtEngRemoteVideo( + MVtSessionCommand& aSessionCommand, + CVtEngStateManager& aStateManager ) : + iSessionCommand( aSessionCommand), + iStateManager( aStateManager ), + iEnableNGA(ETrue) + { + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVtEngRemoteVideo::ConstructL() + { + __VTPRINTENTER( "RV.ConstructL" ) + //We are in the Proto ESetup state + iDrawer = + static_cast< CVtEngDraw* >( VtEngDrawFactory::CreateDrawerL( this , iEnableNGA) ); + //Add protocol Data Sink; + iDisplaySink = iDrawer->DisplaySink(); + iAudioSink = VTProtocolFactory::CreateAudioSink(); + __VTPRINTEXIT( "RV.ConstructL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtEngRemoteVideo* CVtEngRemoteVideo::NewL( + MVtSessionCommand& aSessionCommand, + CVtEngStateManager& aStateManager ) + { + CVtEngRemoteVideo* self = new( ELeave ) + CVtEngRemoteVideo( aSessionCommand, aStateManager ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::CVtEngRemoteVideo +// Destructor. Cannot leave. +// ----------------------------------------------------------------------------- +// +CVtEngRemoteVideo::~CVtEngRemoteVideo() + { + __VTPRINTENTER( "RV.~" ) + VTProtocolFactory::DeleteAudioSink( iAudioSink ); + delete iDrawer; + __VTPRINTEXIT( "RV.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::SetRenderingParametersL +// Sets parameters for rendering the remote video. +// ----------------------------------------------------------------------------- +// +void CVtEngRemoteVideo::SetRenderingParametersL( + const TVtEngRenderingOptionsNGA& aParams ) + { + __VTPRINTENTER( "RV.SetRenderingParametersL NGA" ) + + // If rendering is ongoing, stop it + StopVideoRendering(); + // Set new values + TVtEngRenderConfigNGA config( aParams ); + iDrawer->BaseSetConfigL( config ); + __VTPRINTEXIT( "RV.SetRenderingParametersL NGA" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::SetRenderingParametersL +// Sets parameters for rendering the remote video. +// ----------------------------------------------------------------------------- +// +void CVtEngRemoteVideo::SetRenderingParametersL( + const TVtEngRenderingOptionsDSA& aParams ) + { + __VTPRINTENTER( "RV.SetRenderingParametersL DSA" ) + + __VTPRINT( DEBUG_MEDIA , "================== RV.Params ==================" ) + __VTPRINT2( DEBUG_MEDIA , " aParams.iRect.iTl.iX %d", aParams.iRect.iTl.iX ) + __VTPRINT2( DEBUG_MEDIA , " aParams.iRect.iTl.iY %d", aParams.iRect.iTl.iY ) + __VTPRINT2( DEBUG_MEDIA , " aParams.iRect.iBr.iX %d", aParams.iRect.iBr.iX ) + __VTPRINT2( DEBUG_MEDIA , " aParams.iRect.iBr.iY %d", aParams.iRect.iBr.iY ) + __VTPRINT2( DEBUG_MEDIA , " aParams.iClipRect.iTl.iX %d", + aParams.iClipRect.iTl.iX ) + __VTPRINT2( DEBUG_MEDIA , " aParams.iClipRect.iTl.iY %d", + aParams.iClipRect.iTl.iY ) + __VTPRINT2( DEBUG_MEDIA , " aParams.iClipRect.iBr.iX %d", + aParams.iClipRect.iBr.iX ) + __VTPRINT2( DEBUG_MEDIA , " aParams.iClipRect.iBr.iY %d", + aParams.iClipRect.iBr.iY ) + __VTPRINT( DEBUG_MEDIA , "================== RV.Params ==================" ) + // If rendering is ongoing, stop it + StopVideoRendering(); + // Set new values + TVtEngRenderConfigDSA config( aParams ); + iDrawer->BaseSetConfigL( config ); + __VTPRINTEXIT( "RV.SetRenderingParametersL DSA" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::SetRenderingParametersL +// Sets parameters for rendering the remote video. +// ----------------------------------------------------------------------------- +// +void CVtEngRemoteVideo::SetRenderingParametersL( + const TVtEngRenderingOptionsDP& aParams ) + { + __VTPRINTENTER( "RV.SetRenderingParametersL DP" ) + + __VTPRINT( DEBUG_MEDIA , "================== RV.Params ==================" ) + __VTPRINT2( DEBUG_MEDIA , " aParams.iRect.iTl.iX %d", aParams.iRect.iTl.iX ) + __VTPRINT2( DEBUG_MEDIA , " aParams.iRect.iTl.iY %d", aParams.iRect.iTl.iY ) + __VTPRINT2( DEBUG_MEDIA , " aParams.iRect.iBr.iX %d", aParams.iRect.iBr.iX ) + __VTPRINT2( DEBUG_MEDIA , " aParams.iRect.iBr.iY %d", aParams.iRect.iBr.iY ) + __VTPRINT2( DEBUG_MEDIA , " aParams.iClipRect.iTl.iX %d", + aParams.iClipRect.iTl.iX ) + __VTPRINT2( DEBUG_MEDIA , " aParams.iClipRect.iTl.iY %d", + aParams.iClipRect.iTl.iY ) + __VTPRINT2( DEBUG_MEDIA , " aParams.iClipRect.iBr.iX %d", + aParams.iClipRect.iBr.iX ) + __VTPRINT2( DEBUG_MEDIA , " aParams.iClipRect.iBr.iY %d", + aParams.iClipRect.iBr.iY ) + __VTPRINT( DEBUG_MEDIA , "================== RV.Params ==================" ) + // If rendering is ongoing, stop it + StopVideoRendering(); + // Set new values + TVtEngRenderConfigDP config( aParams ); + iDrawer->BaseSetConfigL( config ); + __VTPRINTEXIT( "RV.SetRenderingParametersL DP" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::StartVideoL +// +// For incoming, this function starts/resumes playing out the media to the +// appropriate sink based on the current settings. +// ----------------------------------------------------------------------------- +// +void CVtEngRemoteVideo::StartVideoL() + { + __VTPRINTENTER( "RV.StartVideoL" ) + if ( iDisplaySink && iDrawer && + ( iDrawer->IsFlag( CVtEngDraw::EFlagInitialized ) || + iDrawer->IsFlag( CVtEngDraw::EBaseConstructCalled ) ) ) + { + iDrawer->BaseStartDrawL(); + } + else + { + User::Leave( KErrNotReady ); + } + __VTPRINTEXIT( "RV.StartVideoL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::StopVideoRendering +// Stops rendering of remote video. +// ----------------------------------------------------------------------------- +// +void CVtEngRemoteVideo::StopVideoRendering() + { + __VTPRINTENTER( "RV.StopVideoRendering" ) + // Stop only if active + if( iDrawer->GetDsaState() ) + { + __VTPRINT( DEBUG_MEDIA, "RV.Stopping" ) + iDrawer->BaseStopDraw(); + } + __VTPRINTEXIT( "RV.StopVideoRendering" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::AddVideoSinkL +// Adds a sink for video to proto. +// ----------------------------------------------------------------------------- +// +TInt CVtEngRemoteVideo::AddVideoSinkL( TInt aChannelId ) + { + __VTPRINTENTER( "RV.AddVideoSinkL" ) + if ( iDisplaySink == NULL ) + { + User::Leave( KErrNotReady ); + } + TInt id = iSessionCommand.AddVideoSinkL( + aChannelId, *iDisplaySink ); + iDrawer->VideoSinkAdded(); + __VTPRINTEXITR( "RV.AddVideoSinkL id=%d", id ) + return id; + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::AddAudioSinkL +// Adds a sink for audio to proto. +// ----------------------------------------------------------------------------- +// +TInt CVtEngRemoteVideo::AddAudioSinkL( TInt aChannelId ) + { + __VTPRINTENTER( "RV.AddAudioSinkL" ) + if ( iAudioSink == NULL ) + { + User::Leave( KErrNotReady ); + } + TInt id = iSessionCommand.AddAudioSinkL( aChannelId, *iAudioSink ); + __VTPRINTEXITR( "RV.AddAudioSinkL id=%d", id ) + return id; + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::GetDsaState +// Returns state of Direct Screen Access. +// ----------------------------------------------------------------------------- +// +TBool CVtEngRemoteVideo::GetDsaState() const + { + return iDrawer->GetDsaState(); + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::PauseVideoL +// +// For an incoming track this function pauses sending +// media to the sink (output device) and stops the sink. +// ----------------------------------------------------------------------------- +// +TInt CVtEngRemoteVideo::PauseVideoL() + { + __VTPRINTENTER( "RV.PauseVideoL" ) + if ( iDisplaySink == NULL ) + { + User::Leave( KErrNotReady ); + } + TInt cmdId = iSessionCommand.PauseVideoL( *iDisplaySink ); + __VTPRINTEXITR( "RV.PauseVideoL id=%d", cmdId ) + return cmdId; + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::AudioSink +// Returns audio sink. +// ----------------------------------------------------------------------------- +// +MVTAudioSink* CVtEngRemoteVideo::AudioSink() + { + return iAudioSink; + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::SetUIForegroundL +// Sets UI foreground state. +// ----------------------------------------------------------------------------- +void CVtEngRemoteVideo::SetUIForegroundL( TBool aForeground ) + { + __VTPRINTENTER( "RV.SetUIForegroundL" ) + if( !iDisplaySink ) + { + User::Leave( KErrNotReady ); + } + if( aForeground ) + { + __VTPRINT( DEBUG_MEDIA, " RV.Resuming" ) + iDisplaySink->Resume(); + } + else + { + __VTPRINT( DEBUG_MEDIA, " RV.Pausing" ) + iDisplaySink->Pause(); + } + iDrawer->BaseSetUIForegroundL( aForeground ); + __VTPRINTEXIT( "RV.SetUIForegroundL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::RequestLastFrame +// Request update last remote video frame through MVtEngFrameObserver::vtSetFrame +// ----------------------------------------------------------------------------- +void CVtEngRemoteVideo::RequestLastFrame() + { + __VTPRINTENTER( "RV.RequestLastFrame" ) + if(iDrawer) + iDrawer->BaseRequestLastFrame(); +__VTPRINTEXIT( "RV.RequestLastFrame" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::CVtEngDraw::~CVtEngDraw +// Destructor. Cannot leave. +// ----------------------------------------------------------------------------- +// +CVtEngRemoteVideo::CVtEngDraw::~CVtEngDraw() + { + __VTPRINTENTER( "RVD.~" ) + Cancel(); + delete iWatcher; + delete iDSA; + if ( iDisplaySink ) + { + iDisplaySink->Destroy(); + } + __VTPRINTEXIT( "RVD.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::CVtEngDraw::CVtEngDraw +// C++ constructor. Cannot leave. +// ----------------------------------------------------------------------------- +// +CVtEngRemoteVideo::CVtEngDraw::CVtEngDraw( MDisplaySinkObserver* aObserver ) : + CActive( KVtEngRemoteDrawPriority ), iCheckpoint( KVtEngWatcherThreshold ), + iObserver( aObserver ), iCallback( WatcherExpired, this ), + iDSUpdated( ETrue ) + { + iSourceSize = TSize( KVtEngRemoteVideoDefaultWidth, + KVtEngRemoteVideoDefaultHeight ); + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::CVtEngDraw::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVtEngRemoteVideo::CVtEngDraw::ConstructL( ) + { + __VTPRINTENTER( "RVD.ConstructL" ) + BaseConstructL(); + // Create sink + iDisplaySink = CreateSinkL(); + iWatcher = CPeriodic::NewL( KVtEngStoppedRenderPriority ); + __VTPRINTEXIT( "RVD.ConstructL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::CVtEngDraw::AbortNow +// Aborts DSA when requested by Window Server. +// ----------------------------------------------------------------------------- +// +void CVtEngRemoteVideo::CVtEngDraw::AbortNow( + RDirectScreenAccess::TTerminationReasons /*aReason*/ ) + { + __VTPRINTENTER( "RVD.AbortNow" ) + ClearFlag( EReadyForeground | EStarted ); + BaseAbortNow(); + __VTPRINTEXIT( "RVD.AbortNow" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::CVtEngDraw::Restart +// Restarts DSA. +// ----------------------------------------------------------------------------- +// +void CVtEngRemoteVideo::CVtEngDraw::Restart( + RDirectScreenAccess::TTerminationReasons /*aReason*/ ) + { + __VTPRINTENTER( "RVD.Restart" ) + TRAPD( err, + { + if ( !IsFlag( EStarted ) ) + { + if ( !iDSA->IsActive() ) + { + iDSA->StartL(); + } + SetFlag( EStarted ); + } + if ( !Config().iClipRect.IsEmpty() ) + { + __VTPRINT3( DEBUG_MEDIA, "RVD.Restart iClipRect.iTl (%d, %d)", + Config().iClipRect.iTl.iX, Config().iClipRect.iTl.iY ); + __VTPRINT3( DEBUG_MEDIA, "RVD.Restart iClipRect.iBr (%d, %d)", + Config().iClipRect.iBr.iX, Config().iClipRect.iBr.iY ); + iDSA->Gc()->SetClippingRect( Config().iClipRect ); + } + BaseRestartL(); + } ); + if ( err != KErrNone ) + { + ClearFlag( EReadyForeground ); + } + else + { + SetFlag( EReadyForeground ); + } + + __VTPRINT2( DEBUG_MEDIA, "RVD.Restart flags %d", iFlags ) + if ( iCheckpoint == KVtEngWatcherThreshold ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_RETURN, "RVD.Restart RFs" ) + TRAP( err, BaseRefreshL() ); + } + __VTPRINTEXITR( "RVD.Restart %d", err ) + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::CVtEngDraw::GetDsaState +// Returns the state of DSA: is drawing ongoing. +// ----------------------------------------------------------------------------- +// +TBool CVtEngRemoteVideo::CVtEngDraw::GetDsaState() const + { + __VTPRINTENTER( "RVD.GetDsaState" ) + TBool active( EFalse ); + active = IsFlag( ERemoteVideoDrawing ); + __VTPRINTEXITR( "RVD.GetDsaState is active=%d", active ) + return active; + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::CVtEngDraw::WatcherExpired +// Checks if frame watcher has expired, ie. no frames are received. +// ----------------------------------------------------------------------------- +// +TInt CVtEngRemoteVideo::CVtEngDraw::WatcherExpired( TAny* aAny ) + { + CVtEngRemoteVideo::CVtEngDraw* drawer = + reinterpret_cast( aAny ); + drawer->HandleWatcherExpired(); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::CVtEngDraw::HandleWatcherExpired +// Does the checking for frame reception. +// If not receiving, notify using client (VT UI). +// ----------------------------------------------------------------------------- +// +void CVtEngRemoteVideo::CVtEngDraw::HandleWatcherExpired() + { + __VTPRINTENTER( "RVD.WatcherExpired" ) + if ( IsFlag( EStarted ) ) + { + __VTPRINT2( DEBUG_MEDIA | DEBUG_RETURN, "RVD.WatcherExpired RF:%d", + iCheckpoint ) + if ( iCheckpoint != KVtEngWatcherThreshold && + IsFlag( EFirstFrameReceived ) ) + { + __VTPRINT( DEBUG_MEDIA | DEBUG_RETURN, "RVD.WatcherExpired RF" ) + TRAP_IGNORE( BaseRefreshL() ); + } + iCheckpoint--; + // Not under zero though. + if ( iCheckpoint < 0 ) + { + iCheckpoint = 0; + } + } + __VTPRINTEXIT( "RVD.WatcherExpired" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::CVtEngDraw::SetFlag +// Sets flags. +// ----------------------------------------------------------------------------- +// +void CVtEngRemoteVideo::CVtEngDraw::SetFlag( TUint aFlags ) + { + iFlags |= aFlags; + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::CVtEngDraw::ClearFlag +// Clears (unsets) flags. +// ----------------------------------------------------------------------------- +// +void CVtEngRemoteVideo::CVtEngDraw::ClearFlag( TUint aFlags ) + { + iFlags &= ~aFlags; + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::CVtEngDraw::IsFlag +// Tests a flag. +// ----------------------------------------------------------------------------- +// +TBool CVtEngRemoteVideo::CVtEngDraw::IsFlag( TUint aFlag ) const + { + return ( iFlags & aFlag ) != 0 ; + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::CVtEngDraw::VideoSinkAdded +// ----------------------------------------------------------------------------- +// +void CVtEngRemoteVideo::CVtEngDraw::VideoSinkAdded() + { + // By clearing this flag every time when sink is added, we assure that + // blind icon is correctly faded in UI. + ClearFlag( EFirstFrameReceived ); + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::CVtEngDraw::Activate +// ----------------------------------------------------------------------------- +// +void CVtEngRemoteVideo::CVtEngDraw::Activate() + { + __VTPRINTENTER( "RVD.Activate" ) + if ( !IsActive() ) + { + __VTPRINT( DEBUG_MEDIA, "RVD.Activate setting active" ) + iStatus = KRequestPending; + SetActive(); + } + __VTPRINTEXIT( "RVD.Activate" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::CVtEngDraw::ConfigUpdatedL +// Set drawing configuration. +// ----------------------------------------------------------------------------- +// +void CVtEngRemoteVideo::CVtEngDraw::ConfigUpdatedL() + { + __VTPRINTENTER( "RVD.ConfigUpdatedL" ) + ClearFlag( EFlagInitialized ); + TRAPD( err, { + BaseVerifyConfigL(); + + if ( IsFlag( EReadyInternal ) ) + { + __VTPRINT( DEBUG_MEDIA, "RVD.SetC started" ) + SetFlag( EStarted ); + __VTPRINT( DEBUG_MEDIA, "RVD.SetC notify rvd start" ) + } + BaseRefreshBitmapsL(); + } ); + if ( err != KErrNone ) + { + __VTPRINT2( DEBUG_MEDIA | DEBUG_RETURN, "RVD.SetC FAILED %d", err ) + CVtEngEventManager::NotifyEvent( KVtEngMediaInitFailure ); + } + User::LeaveIfError( err ); + SetFlag( EFlagInitialized ); + __VTPRINTEXIT( "RVD.ConfigUpdatedL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::CVtEngDraw::DisplaySink +// Returns used display sink. +// ----------------------------------------------------------------------------- +// +MDisplaySink* CVtEngRemoteVideo::CVtEngDraw::DisplaySink() + { + return iDisplaySink; + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::CVtEngDraw::DoCancel +// ----------------------------------------------------------------------------- +// +void CVtEngRemoteVideo::CVtEngDraw::DoCancel() + { + __VTPRINTENTER( "RVD.DoCancel" ) + BaseDoCancel(); + iDisplaySink->Release(); + ClearFlag( EStarted | EFrameWatcherExpired ); + __VTPRINTEXIT( "RVD.DoCancel" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::CVtEngDraw::RunError +// ----------------------------------------------------------------------------- +// +#ifdef VTDEBUG +TInt CVtEngRemoteVideo::CVtEngDraw::RunError( TInt aError ) +#else +TInt CVtEngRemoteVideo::CVtEngDraw::RunError( TInt /* aError */ ) +#endif // VTDEBUG + { + __VTPRINTENTER( "RVD.RunError" ) + ClearFlag( EStarted ); + BaseStopDraw(); + CVtEngEventManager::NotifyEvent( KVtEngRemoteVideoStopped ); + __VTPRINTEXITR( "RVD.RunError %d", aError ) + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::CVtEngDraw::CreateAndStartDSAL +// Create DSA instance. +// ----------------------------------------------------------------------------- +// +void CVtEngRemoteVideo::CVtEngDraw::CreateAndStartDSAL() + { + __VTPRINTENTER( "RVD.CreateAndStartDSAL" ) + delete iDSA; + iDSA = NULL; + iDSA = CDirectScreenAccess::NewL( + *Config().iWsSession, + *Config().iWsSreenDevice, + *Config().iWindow, + *this ); + iDSA->StartL(); + if ( !Config().iClipRect.IsEmpty() ) + { + __VTPRINT( DEBUG_MEDIA, "RVD.CreateAndStartDSAL setting cliprect" ) + iDSA->Gc()->SetClippingRect( Config().iClipRect ); + } + __VTPRINTEXIT( "RVD.CreateAndStartDSAL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngRemoteVideo::VideoFrameSizeChanged +// Callback from DisplaySink to inform the size change +// ----------------------------------------------------------------------------- +// +void CVtEngRemoteVideo:: + VideoFrameSizeChangedL( const TSize& /* aFrom */, const TSize& aTo ) + { + __VTPRINTENTER( "RVD.VideoFrameSizeChangedL" ) + __VTPRINT( DEBUG_MEDIA , " ======= RV.RVD.VideoFrameSizeChangedL ========" ) + __VTPRINT2( DEBUG_MEDIA , " aTo.iWidth: %d", aTo.iWidth) + __VTPRINT2( DEBUG_MEDIA , " aTo.iHeight: %d", aTo.iHeight ) + __VTPRINT( DEBUG_MEDIA , " ======= RV.RVD.VideoFrameSizeChangedL ========" ) + + // Notification of changed layout. + if ( aTo.iHeight == KVtEngResolutionQCIFHeight && + aTo.iWidth == KVtEngResolutionQCIFWidth ) + { + // Store the new size. + iDrawer->iSourceSize = aTo; + CVtEngEventManager::NotifyEvent( KVtEngResolutionToQCIF ); + } + else if ( aTo.iHeight == KVtEngResolutionSQCIFHeight && + aTo.iWidth == KVtEngResolutionSQCIFWidth ) + { + // Store the new size. + iDrawer->iSourceSize = aTo; + CVtEngEventManager::NotifyEvent( KVtEngResolutionToSQCIF ); + } + else + { + // Unlisted resolution. + __VTPRINTEXITR( "RVD.VideoFrameSizeChangedL %d", 0 ) + return; + } + + iDrawer->BaseVideoFrameSizeChangedL( aTo ); + + __VTPRINTEXITR( "RVD.VideoFrameSizeChangedL %d", 1 ) + } + +// VtEngDrawFactory + +// ----------------------------------------------------------------------------- +// VtEngDrawFactory::CreateDrawerL +// ----------------------------------------------------------------------------- +// +MVtEngDraw* VtEngDrawFactory::CreateDrawerL( MDisplaySinkObserver* aObserver, TBool aSupportNGA ) + { + __VTPRINTENTER( "VtEngDrawFactory.CreateDrawerL" ) + MVtEngDraw* drawer = NULL; + if(aSupportNGA) + { + drawer = CVtEngDrawNGA::NewL( aObserver ); + } + else + { + if ( FeatureManager::FeatureSupported( KFeatureIdDisplayPost ) ) + { + drawer = CVtEngDrawDP::NewL( aObserver ); + } + else + { + drawer = CVtEngDrawDSA::NewL( aObserver ); + } + } + __VTPRINTEXIT( "VtEngDrawFactory.CreateDrawerL" ) + return drawer; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/Session/CVtEngSessionHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Session/CVtEngSessionHandler.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,323 @@ +/* +* 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: Session handler. +* +*/ + + + +// INCLUDE FILES +#include "CVtEngSessionHandler.h" +#include "CVtEngOperation.h" +#include "CVtEngStateManager.h" +#include "cvtengincomingcallmonitor.h" +#include "vtengcommands.h" +#include "CVtEngOperation.h" +#include "CVtCtlFactory.h" +#include "MVtCtlCallControl.h" +#include "CVtEngSettings.h" +#include "VtEngUtils.h" +#include "VtCtlTypes.h" // for TVtCtlCSSessionInfoV1 +#include "cvtlogger.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngSessionHandler::CVtEngSessionHandler +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngSessionHandler::CVtEngSessionHandler() + : CActive( CActive::EPriorityStandard ), iIncomingCallMonitor(NULL) + { + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CVtEngSessionHandler::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVtEngSessionHandler::ConstructL() + { + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + StartIncomingCallMonitorL(); + } + +// ----------------------------------------------------------------------------- +// CVtEngSessionHandler::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtEngSessionHandler* CVtEngSessionHandler::NewL( ) + { + CVtEngSessionHandler* self = new( ELeave ) + CVtEngSessionHandler( ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + + +// ----------------------------------------------------------------------------- +// CVtEngSessionHandler::~CVtEngSessionHandler +// Destructor +// +// ----------------------------------------------------------------------------- +// +CVtEngSessionHandler::~CVtEngSessionHandler() + { + __VTPRINTENTER( "SH.~" ) + Cancel(); + Uninitialize(); + delete iIncomingCallMonitor; + __VTPRINTEXIT( "SH.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngSessionHandler::HandleL +// Performs session request. +// +// ----------------------------------------------------------------------------- +// +void CVtEngSessionHandler::HandleL( + CVtEngOperation& /*aOperation*/ ) + { + __VTPRINT( DEBUG_SESSION, "SH.HandleL leave not supported" ) + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CVtEngSessionHandler::State +// Returns session state +// +// ----------------------------------------------------------------------------- +// +MVtEngSessionInfo::TSessionState CVtEngSessionHandler::State( + TBool aForcedRefresh ) const + { + CVtEngStateManager* states = CVtEngUtility::StateManager(); + if ( aForcedRefresh ) + { + states->Update(); + } + return states->SessionState(); + } + +// ----------------------------------------------------------------------------- +// CVtEngSessionHandler::GetDirection +// Returns direction. +// +// ----------------------------------------------------------------------------- +// +TInt CVtEngSessionHandler::GetDirection( + TDirection& aDirection ) const + { + __VTPRINTENTER( "SH.GetDirection" ) + if ( !iSessionControl ) + { + __VTPRINTEXITR( "SH.GetDirection err=%d", KErrNotFound ) + return KErrNotFound; + } + + TVtCtlCSSessionInfoV1 info; + TPckg pckg( info ); + TRAPD( err, iSessionControl->GetSessionInfoL( KActiveSessionId, pckg ) ); + if ( err == KErrNone ) + { + switch ( info.iDirection ) + { + case MVtCtlCallControl::EDirectionMobileOriginated: + aDirection = EDirectionMO; + break; + case MVtCtlCallControl::DirectionMobileTerminated: + aDirection = EDirectionMT; + break; + default: + aDirection = EDirectionNone; + break; + } + } + __VTPRINT2( DEBUG_SESSION, "SH.direction dir=%d", aDirection ) + __VTPRINTEXITR( "SH.GetDirection err=%d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngSessionHandler::GetDuration +// Returns session duration. +// +// ----------------------------------------------------------------------------- +// +TInt CVtEngSessionHandler::GetDuration( + TDuration& aDuration, + TBool& aEnabled ) const + { + if ( !iSessionControl ) + { + return KErrNotFound; + } + + TVtCtlDuration duration; + TInt err ( iSessionControl->GetDuration( KActiveSessionId, duration ) ); + if ( err == KErrNone ) + { + aDuration = duration; + const CVtEngSettings& settings = CVtEngUtility::Settings(); + aEnabled = settings.Config().iCallTimerOn; + } + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngSessionHandler::GetCLI +// +// +// ----------------------------------------------------------------------------- +// +TInt CVtEngSessionHandler::GetCLI( TCLI& aCLI ) const + { + const CVtEngSettings& settings = CVtEngUtility::Settings(); + const TBool isValid = settings.GetCLI( aCLI); + TInt res = KErrNone; + if ( !isValid ) + { + res = KErrNotReady; + } + return res; + } + + +// ----------------------------------------------------------------------------- +// CVtEngSessionHandler::HandleVtSessionEventL +// +// +// ----------------------------------------------------------------------------- +// +void CVtEngSessionHandler::HandleVtSessionEventL( + TVtCtlEvent aEvent, + TAny* /*aParams*/ ) + { + if ( aEvent == KVtCtlEventSessionStatusChanged ) + { + CVtEngStateManager* states = CVtEngUtility::StateManager(); + states->Update( ); + } + } + +// ----------------------------------------------------------------------------- +// CVtEngSessionHandler::InitializeL +// +// +// ----------------------------------------------------------------------------- +// +void CVtEngSessionHandler::InitializeL() + { + __VTPRINTENTER( "SH.Initilialize" ) + if ( iSessionControl ) + { + // already initialized + __VTPRINTEXIT( "SH.Initilialize" ) + return; + } + TInt err = iLib.Load( KVtCtlLibraryName() ); + CleanupClosePushL( iLib ); + if ( err == KErrNone ) + { + TLibraryFunction func = iLib.Lookup( 1 ); + iFactory = reinterpret_cast( func() ); + iSessionControl = iFactory->CreateCallControlL( *this ); + + // Update state + CVtEngStateManager* states = CVtEngUtility::StateManager(); + states->Update(); + } + CleanupStack::Pop(); // lib + __VTPRINTEXIT( "SH.Initilialize" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngSessionHandler::Uninitialize +// +// +// ----------------------------------------------------------------------------- +// +void CVtEngSessionHandler::Uninitialize() + { + if ( iFactory ) + { + iFactory->Delete( iSessionControl ); + delete iFactory; + iFactory = NULL; + iSessionControl = NULL; + } + iLib.Close(); + } + +// ----------------------------------------------------------------------------- +// CVtEngSessionHandler::RealState +// +// +// ----------------------------------------------------------------------------- +// +MVtCtlCallControl::TVtCtlState CVtEngSessionHandler::RealState() const + { + MVtCtlCallControl::TVtCtlState state( MVtCtlCallControl::EUnknown ); + if ( iSessionControl ) + { + state = iSessionControl->GetSessionState( KActiveSessionId ); + __VTPRINT2( DEBUG_SESSION, "SH.realState=%d", state ) + } + return state; + } +// ----------------------------------------------------------------------------- +// CVtEngSessionHandler::RunL +// +// +// ----------------------------------------------------------------------------- +// +void CVtEngSessionHandler::RunL() + { + InitializeL(); + } + +// ----------------------------------------------------------------------------- +// CVtEngSessionHandler::DoCancel +// +// +// ----------------------------------------------------------------------------- +// +void CVtEngSessionHandler::DoCancel() + { + // nothing here + } + +// ----------------------------------------------------------------------------- +// CVtEngSessionHandler::StartIncomingCallMonitorL +// +// +// ----------------------------------------------------------------------------- +// +void CVtEngSessionHandler::StartIncomingCallMonitorL() + { + iIncomingCallMonitor = CVtEngIncomingCallMonitor::NewL(); + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/State/CVtEngDtmfBuffered.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/State/CVtEngDtmfBuffered.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,141 @@ +/* +* 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: Buffered state of DTMF sending. +* +*/ + + + +// INCLUDE FILES +#include "CVtEngDtmfState.h" +#include "VtEngPanic.h" +#include + +// CONSTANTS +const TInt KVtEngDtmfToneBufferSize = 2; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngDtmfBuffered::NewL +// +// ----------------------------------------------------------------------------- +// +CVtEngDtmfState* CVtEngDtmfBuffered::NewL( + MVtEngDtmfHandler& aDtmfHandler, + MVtH324ConfigCommand& aH324Config ) + { + CVtEngDtmfBuffered* self = new ( ELeave ) + CVtEngDtmfBuffered( aDtmfHandler, aH324Config ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); // self + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfBuffered::~CVtEngDtmfBuffered +// +// ----------------------------------------------------------------------------- +// +CVtEngDtmfBuffered::~CVtEngDtmfBuffered() + { + delete iTones; + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfBuffered::SendDtmfL +// +// ----------------------------------------------------------------------------- +// +void CVtEngDtmfBuffered::SendDtmfL( const TVtEngDtmfTone& aTone ) + { + // just add to buffer and wait for completion of pending send operation. + iTones->AppendL( aTone ); + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfBuffered::DtmfSendCompleteL +// +// PSEUDO CODE: +// deallocate Protocol dtmf instance +// if ( previous_sending_OK ) +// if ( tones_in_buffer > 1 ) +// next_state = buffered +// else +// next_state = sending +// endif +// send tone from buffer and change state +// endif +// if ( previous_sending_FAIL or new_sending_FAIL ) +// reset buffer +// next_state = idle +// endif +// +// ----------------------------------------------------------------------------- +// +void CVtEngDtmfBuffered::DtmfSendCompleteL( TInt aError ) + { + __VTPRINTENTER( "DtmfStateBuffered.DtmfSendCompleteL" ) + CVtEngDtmfState::DtmfSendCompleteL( aError ); + const TInt count( iTones->Count() ); + __VTPRINT2( DEBUG_MEDIA , "DtmfStateBuffered.Send bufSize=%d", count ) + + TInt index( KErrNone ); + if ( count && aError == KErrNone ) + { + __VTPRINT2( DEBUG_MEDIA , "DtmfStateBuffered cnt=%d", count ) + const TVtEngDtmfTone& tone = iTones->At( index ); + MVtEngDtmfHandler::TVtEngDtmfState nextState = ( count > 1 ) ? + MVtEngDtmfHandler::EVtDtmfStateBuffered : + MVtEngDtmfHandler::EVtDtmfStateSending; + TRAP( aError, DoSendAndActivateStateL( tone, nextState ) ); + iTones->Delete( index ); + } + + if ( aError != KErrNone ) + { + __VTPRINT2( DEBUG_MEDIA , "DtmfStateBuffered.failed=%d", aError ) + // if failed clear DTMF buffer and go to dtmf idle state + iTones->Reset(); + iDtmfHandler.ActivateState( MVtEngDtmfHandler::EVtDtmfStateIdle ); + } + __VTPRINTEXIT( "DtmfStateBuffered.DtmfSendCompleteL" ) + } + + +// ----------------------------------------------------------------------------- +// CVtEngDtmfBuffered::CVtEngDtmfBuffered +// +// ----------------------------------------------------------------------------- +// +CVtEngDtmfBuffered::CVtEngDtmfBuffered( + MVtEngDtmfHandler& aDtmfHandler, + MVtH324ConfigCommand& aH324Config ) + : CVtEngDtmfState( aDtmfHandler, aH324Config) + { + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfBuffered::ConstructL +// +// ----------------------------------------------------------------------------- +// +void CVtEngDtmfBuffered::ConstructL() + { + iTones = new ( ELeave ) + CArrayFixFlat( KVtEngDtmfToneBufferSize ); + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/State/CVtEngDtmfIdle.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/State/CVtEngDtmfIdle.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,89 @@ +/* +* 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: Idle state of DTMF sending. +* +*/ + + + +// INCLUDE FILES +#include "CVtEngDtmfState.h" +#include "VtEngPanic.h" +#include "MVtEngDtmfHandler.h" +#include +#include + +// ============================ MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// CVtEngDtmfIdle::NewL +// +// ----------------------------------------------------------------------------- +// +CVtEngDtmfState* CVtEngDtmfIdle::NewL( + MVtEngDtmfHandler& aDtmfHandler, + MVtH324ConfigCommand& aH324Config ) + { + CVtEngDtmfIdle* self = new ( ELeave ) + CVtEngDtmfIdle( aDtmfHandler, aH324Config ); + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfIdle::~CVtEngDtmfIdle +// +// ----------------------------------------------------------------------------- +// +CVtEngDtmfIdle::~CVtEngDtmfIdle() + { + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfIdle::SendDtmfL +// +// ----------------------------------------------------------------------------- +// +void CVtEngDtmfIdle::SendDtmfL( const TVtEngDtmfTone& aTone ) + { + __VTPRINTENTER( "DtmfStateIdle.Send" ) + DoSendAndActivateStateL( aTone, MVtEngDtmfHandler::EVtDtmfStateSending ); + __VTPRINTEXIT( "DtmfStateIdle.Send" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfIdle::DtmfSendCompleteL +// +// ----------------------------------------------------------------------------- +// +void CVtEngDtmfIdle::DtmfSendCompleteL( TInt /*aError*/ ) + { + __VTPRINT( DEBUG_MEDIA , "DtmfStateIdle.SendComplete" ) + // Do nothing (should be never called since state is always + // "sending" or "buffered" when sending is completed). + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfIdle::CVtEngDtmfIdle +// +// ----------------------------------------------------------------------------- +// +CVtEngDtmfIdle::CVtEngDtmfIdle( + MVtEngDtmfHandler& aDtmfHandler, + MVtH324ConfigCommand& aH324Config ) + : CVtEngDtmfState( aDtmfHandler, aH324Config ) + { + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/State/CVtEngDtmfSending.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/State/CVtEngDtmfSending.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,92 @@ +/* +* 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: Sending state of DTMF sending. +* +*/ + + + +// INCLUDE FILES +#include "CVtEngDtmfState.h" +#include "VtEngPanic.h" +#include + +// ============================ MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// CVtEngDtmfSending::NewL +// +// ----------------------------------------------------------------------------- +// +CVtEngDtmfState* CVtEngDtmfSending::NewL( + MVtEngDtmfHandler& aDtmfHandler, + MVtH324ConfigCommand& aH324Config ) + { + CVtEngDtmfState* self = new ( ELeave ) + CVtEngDtmfSending( aDtmfHandler, aH324Config ); + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfSending::~CVtEngDtmfSending +// +// ----------------------------------------------------------------------------- +// +CVtEngDtmfSending::~CVtEngDtmfSending() + { + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfSending::SendDtmfL +// +// ----------------------------------------------------------------------------- +// +void CVtEngDtmfSending::SendDtmfL( const TVtEngDtmfTone& aTone ) + { + __VTPRINTENTER( "DtmfStateSending.Send" ) + CVtEngDtmfState& state = iDtmfHandler.ActivateState( + MVtEngDtmfHandler::EVtDtmfStateBuffered ); + // let buffered state handle this + state.SendDtmfL( aTone ); + __VTPRINTEXIT( "DtmfStateSending.Send" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfSending::DtmfSendCompleteL +// +// ----------------------------------------------------------------------------- +// +void CVtEngDtmfSending::DtmfSendCompleteL( TInt aError ) + { + __VTPRINTENTER( "DtmfStateSending.SendComplete" ) + CVtEngDtmfState::DtmfSendCompleteL( aError ); + // sending complete, change state + iDtmfHandler.ActivateState( MVtEngDtmfHandler::EVtDtmfStateIdle ); + __VTPRINTEXIT( "DtmfStateSending.SendComplete" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfSending::CVtEngDtmfSending +// +// ----------------------------------------------------------------------------- +// +CVtEngDtmfSending::CVtEngDtmfSending( + MVtEngDtmfHandler& aDtmfHandler, + MVtH324ConfigCommand& aH324Config ) + : CVtEngDtmfState( aDtmfHandler, aH324Config ) + { + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/State/CVtEngDtmfState.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/State/CVtEngDtmfState.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,71 @@ +/* +* 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: Base state class of DTMF sending. +* +*/ + + + +// INCLUDE FILES +#include "CVtEngDtmfState.h" +#include "MVtEngDtmfHandler.h" +#include + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngDtmfState::CVtEngDtmfState +// +// ----------------------------------------------------------------------------- +// +CVtEngDtmfState::CVtEngDtmfState( + MVtEngDtmfHandler& aDtmfHandler, + MVtH324ConfigCommand& aH324Config ) : + iDtmfHandler( aDtmfHandler ), + iH324Config( aH324Config ) + { + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfState::DtmfSendCompleteL +// +// ----------------------------------------------------------------------------- +// +void CVtEngDtmfState::DtmfSendCompleteL( TInt /*aError*/ ) + { + __VTPRINTENTER( "DtmfState.DtmfSendCompleteL" ) + iDtmfHandler.ReleaseProtoDtmf(); + __VTPRINTEXIT( "DtmfState.DtmfSendCompleteL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngDtmfState::DoSendAndActivateStateL +// +// Requests new Protocol dtmf tone instance from the DTMF handler, sends it and +// changes state. +// +// ----------------------------------------------------------------------------- +// +void CVtEngDtmfState::DoSendAndActivateStateL( + const TVtEngDtmfTone& aDtmf, + MVtEngDtmfHandler::TVtEngDtmfState aNewState ) + { + __VTPRINTENTER( "DtmfState.DoSendAndActivateStateL" ) + MVTUserInput& protoDtmf = iDtmfHandler.ReserveProtoDtmfL( aDtmf ); + iDtmfHandler.StoreCommandId( iH324Config.SendUserInputMessageL( protoDtmf )); + iDtmfHandler.ActivateState( aNewState ); + __VTPRINTEXIT( "DtmfState.DoSendAndActivateStateL" ) + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/State/CVtEngStateAlerting.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/State/CVtEngStateAlerting.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,151 @@ +/* +* Copyright (c) 2004-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: Base class for states +* +*/ + + +// INCLUDE FILES +#include "CVtEngStateAlerting.h" +#include +#include "CVtEngOperation.h" +#include "CVtEngSettings.h" +#include "VtEngUtils.h" +#include "CVtEngAudioHandler.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngStateAlerting::CVtEngStateAlerting +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngStateAlerting::CVtEngStateAlerting( + CVtEngStateManager& aStateManager, + CVtEngEventManager& aEventManager ) + : CVtEngStateBase( aStateManager, aEventManager ) + { + } + +// Destructor +CVtEngStateAlerting::~CVtEngStateAlerting() + { + __VTPRINT( DEBUG_DESTRUCT, "~StateAlrt") + } + + +// ----------------------------------------------------------------------------- +// CVtEngStateAlerting::UpdateL +// Updates state. +// +// ----------------------------------------------------------------------------- +// +void CVtEngStateAlerting::UpdateL() + { + __VTPRINTENTER( "StateAlert.Update" ) + const MVtCtlCallControl::TVtCtlState bearerstate = + SessionHandler().RealState(); + CVtEngStateBase* newState = NULL; + if ( bearerstate == MVtCtlCallControl::EIdle || + bearerstate == MVtCtlCallControl::EDisconnecting ) + { + newState = NewStateL( MVtEngSessionInfo::EIdle ); + } + else + { + newState = NegotiatingOrConnectedStateL(); // or null + } + if ( newState ) + { + newState->OpenL( this ); + } + __VTPRINTEXIT( "StateAlert.Update") + } + +// ----------------------------------------------------------------------------- +// CVtEngStateAlerting::OpenL +// State transition to alerting state. +// +// ----------------------------------------------------------------------------- +// +void CVtEngStateAlerting::DoOpenL() + { + __VTPRINTENTER( "StateAlert.Open" ) + NotifyStateChange( MVtEngSessionInfo::ERemoteAlerting ); + + // Instantiate temporary devsound for audio routing + AudioHandler().SetRoutingEnablerL( ETrue ); + __VTPRINTEXIT( "StateAlert.Open" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngStateAlerting::ValidateCommand +// Returns if a command is valid in idle state. +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngStateAlerting::ValidateCommand( + const TVtEngCommandId aCommandId ) + { + __VTPRINT( DEBUG_DETAIL |DEBUG_GEN, "StateAlert.Validate" ) + TBool okToPerform( EFalse ); + switch ( aCommandId ) + { + case KVtEngInitializeEngine: + case KVtEngInitializeEngineDiag: + case KVtEngInitializeEngineTest: + case KVtEngSetSource: + case KVtEngPrepareViewFinder: + case KVtEngPrepareViewFinderDSA: + case KVtEngPrepareViewFinderDP: + case KVtEngStartViewFinder: + case KVtEngPauseViewFinder: + case KVtEngPrepareRemoteRenderDSA: + case KVtEngPrepareRemoteRenderDP: + case KVtEngPrepareRemoteRenderNGA: + okToPerform = ETrue; + break; + default: + okToPerform = CVtEngStateBase::ValidateCommand( aCommandId ); + break; + } + return okToPerform; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateAlerting::State +// Returns session state. +// +// ----------------------------------------------------------------------------- +// +MVtEngSessionInfo::TSessionState CVtEngStateAlerting::State() const + { + return MVtEngSessionInfo::ERemoteAlerting; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateAlerting::HandleL +// Handles an operation when behavior is state dependent. +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngStateAlerting::HandleL( + CVtEngOperation& aOp ) + { + TBool handled( CVtEngStateBase::HandleL( aOp )); + return handled; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/State/CVtEngStateBase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/State/CVtEngStateBase.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,395 @@ +/* +* Copyright (c) 2004-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: Base class for states +* +*/ + + +// INCLUDE FILES +#include "CVtEngStateBase.h" +#include "CVtEngOperation.h" +#include "CVtEngHandlerContainer.h" +#include "TVtEngOperationUtils.h" +#include "CVtEngStateInitializing.h" +#include "CVtEngStateAlerting.h" +#include "CVtEngStateRinging.h" +#include "CVtEngStateConnected.h" +#include "CVtEngStateClearing.h" +#include "CVtEngStateOpen.h" +#include "CVtEngStateNegotiating.h" +#include "CVtEngStateIdle.h" +#include "CVtEngSettings.h" +#include "MVtEngSessionInfo.h" +#include "VtEngUtils.h" +#include "VtEngPanic.h" +#include + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngStateBase::CVtEngStateBase +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngStateBase::CVtEngStateBase( + CVtEngStateManager& aStateManager, + CVtEngEventManager& aEventManager ) + : iStateManager( aStateManager ), + iEventManager( aEventManager ) + { + } + +// Destructor +CVtEngStateBase::~CVtEngStateBase() + { + } + +// ----------------------------------------------------------------------------- +// CVtEngStateBase::OpenL +// Changes state. +// +// ----------------------------------------------------------------------------- +// +void CVtEngStateBase::OpenL( CVtEngStateBase* aOldState ) + { + __VTPRINTENTER( "StateBase.Open" ) + __VTPRINT( DEBUG_GEN, "StateBase. **** State Change ****" ) + iStateManager.SetState( *this ); + if ( aOldState ) + { + aOldState->Close(); + } + // call derived class open. + DoOpenL(); + __VTPRINTEXIT( "StateBase.Open" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngStateBase::Close +// Closes state. +// +// ----------------------------------------------------------------------------- +// +void CVtEngStateBase::Close() + { + delete this; + } + + +// ----------------------------------------------------------------------------- +// CVtEngStateBase::SaveToSettingsL +// +// Saves configuration to settings. +// ----------------------------------------------------------------------------- +// +void CVtEngStateBase::SaveToSettingsL( CVtEngOperation& aOp ) + { + const TVtEngCommandId command( aOp.Command() ); + + if ( command == KVtEngSetAudioVolume ) + { + MVtEngAudio::TVtEngOutputVolume volume; + TVtEngOpParamUtil::Set( volume, aOp ); + CVtEngSettings& settings = CVtEngUtility::Settings(); + settings.SetVolume( volume.iHandsetVolume, volume.iHandsfreeVolume, ETrue ); + settings.SetVolume( volume.iHandsetVolume, volume.iHandsfreeVolume, EFalse ); + } + } +// ----------------------------------------------------------------------------- +// CVtEngStateBase::NotifyStateChangeL +// Notifies state change to event manager. +// +// ----------------------------------------------------------------------------- +// +void CVtEngStateBase::NotifyStateChange( + MVtEngSessionInfo::TSessionState /*aNewState*/ ) + { + iEventManager.SessionStateChanged( ); + } + +// ----------------------------------------------------------------------------- +// CVtEngStateBase::SetVideoEnabled +// +// +// ----------------------------------------------------------------------------- +// +void CVtEngStateBase::SetVideoEnabled( TBool aEnabled ) + { + CVtEngSettings& settings = CVtEngUtility::Settings(); + settings.SetVideoEnabled( aEnabled ); + } + +// ----------------------------------------------------------------------------- +// CVtEngStateBase::HandleL +// Handles an operation when behavior is state dependent. +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngStateBase::HandleL( CVtEngOperation& aOp ) + { + __VTPRINTENTER( "StateBase.Handle" ) + __VTPRINT2( DEBUG_GEN, "StateBase.Handle cmd=%d", aOp.Command() ) + TBool handled( EFalse ); + switch ( aOp.Command() ) + { + case KVtEngSetAudioRouting: + // Change audio routing + AudioHandler().HandleL( aOp ); + break; + + case KVtEngSetAudioVolume: + case KVtEngIncreaseAudioVolume: + case KVtEngDecreaseAudioVolume: + // Change audio volume + MediaHandler().HandleL( aOp ); + break; + case KVtEngTerminateSession: + default: + break; + } + __VTPRINTEXITR( "StateBase.Handle handled=%d", handled ) + return handled; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateBase::SessionHandler +// Returns session handler. +// +// ----------------------------------------------------------------------------- +// +CVtEngSessionHandler& CVtEngStateBase::SessionHandler() + { + MVtEngSessionInfo& msession = iStateManager.Handlers().Session(); + CVtEngSessionHandler& handler = + static_cast( msession ); + return handler; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateBase::MediaHandler +// Returns media handler. +// +// ----------------------------------------------------------------------------- +// +CVtEngMediaHandler& CVtEngStateBase::MediaHandler() + { + MVtEngMedia& msession = iStateManager.Handlers().Media(); + CVtEngMediaHandler& handler = + static_cast( msession ); + return handler; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateBase::AudioHandler +// Returns audio handler. +// +// ----------------------------------------------------------------------------- +// +CVtEngAudioHandler& CVtEngStateBase::AudioHandler() + { + MVtEngAudio& maudio = iStateManager.Handlers().Audio(); + CVtEngAudioHandler& handler = + static_cast( maudio ); + return handler; + } +// ----------------------------------------------------------------------------- +// CVtEngStateBase::SessionHandler +// Returns session handler. +// +// ----------------------------------------------------------------------------- +// +CVtEngStateBase* CVtEngStateBase::NewStateL( + const MVtEngSessionInfo::TSessionState aState ) + { + CVtEngStateBase* newState = NULL; + switch ( aState ) + { + case MVtEngSessionInfo::EIdle: + newState = new ( ELeave ) + CVtEngStateIdle( iStateManager, iEventManager ); + break; + case MVtEngSessionInfo::EInitializing: + newState = new ( ELeave ) + CVtEngStateInitializing( iStateManager, iEventManager ); + break; + case MVtEngSessionInfo::ERemoteAlerting: + newState = new ( ELeave ) + CVtEngStateAlerting( iStateManager, iEventManager ); + break; + case MVtEngSessionInfo::EReceiving: + newState = new ( ELeave ) + CVtEngStateRinging( iStateManager, iEventManager ); + break; + case MVtEngSessionInfo::EConnected: + newState = new ( ELeave ) + CVtEngStateConnected( iStateManager, iEventManager ); + break; + case MVtEngSessionInfo::ENegotiating: + newState = new ( ELeave ) + CVtEngStateNegotiating( iStateManager, iEventManager ); + break; + case MVtEngSessionInfo::EOpen: + newState = new ( ELeave ) + CVtEngStateOpen( iStateManager, iEventManager ); + break; + case MVtEngSessionInfo::EClearing: + newState = new ( ELeave ) + CVtEngStateClearing( iStateManager, iEventManager ); + break; + default: + Panic( EVtEngPanicInvalidSessionState ); + break; + } + return newState; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateBase::NegotiatingOrConnectedStateL +// +// ----------------------------------------------------------------------------- +// +CVtEngStateBase* CVtEngStateBase::NegotiatingOrConnectedStateL( + TBool aAcceptOnlyNegotiating ) + { + __VTPRINTENTER( "StateBase.NegOrCon" ) + __VTPRINT2( DEBUG_GEN, "StateBase.NegOrCon %d", aAcceptOnlyNegotiating) + const MVtCtlCallControl::TVtCtlState bearerstate = + SessionHandler().RealState(); + CVtEngStateBase* newState = NULL; + if ( bearerstate == MVtCtlCallControl::EConnected ) + { + const MVtProtocolCommand::TVtProtocolState state( MediaHandler().ProtoState() ); + const CVtEngSettings& settings = CVtEngUtility::Settings(); + const TBool readyForConnect = settings.Config().iReadyForConnect; + + __VTPRINT3( DEBUG_GEN, "StateBase.NegOrCon readyForConnect:%d, state:%d", readyForConnect, state) + __VTPRINT2( DEBUG_GEN, "StateBase.NegOrCon iIsDataportLoaned:%d", settings.Config().iIsDataportLoaned) + + if ( readyForConnect && state == MVtProtocolCommand::ESetup && settings.Config().iIsDataportLoaned ) + { + __VTPRINT( DEBUG_GEN | DEBUG_DETAIL, + "StateBase.NegOrCon ready & ESetup") + const TInt res( MediaHandler().Connect() ); + if ( res == KErrNotReady ) + { + // Cannot be done yet, need to wait for an operation + // to complete. + __VTPRINT( DEBUG_GEN | DEBUG_DETAIL, + "StateBase.NegOrCon not ready" ) + } + else if ( res != KErrNone ) + { + __VTPRINT( DEBUG_GEN | DEBUG_DETAIL, + "StateBase.NegOrCon fail") + iEventManager.NotifyEvent( KVtEngNegotiationProblem ); + } + else + { + // change to negotiating state + newState = NewStateL( MVtEngSessionInfo::ENegotiating ); + __VTPRINT( DEBUG_GEN | DEBUG_DETAIL, + "StateBase.NegOrCon-->negotiating") + } + } + else if ( !aAcceptOnlyNegotiating ) + { + newState = NewStateL( MVtEngSessionInfo::EConnected ); + __VTPRINT( DEBUG_GEN | DEBUG_DETAIL, + "StateBase.NegOrCon-->connected") + } + } + __VTPRINTEXIT( "StateBase.NegOrCon" ) + return newState; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateBase::TerminateSessionL +// +// ----------------------------------------------------------------------------- +// +void CVtEngStateBase::TerminateSessionL( CVtEngOperation& aOp ) + { + // State transition to "clearing state" initiates disconnect on protocol. + CVtEngStateBase* newState = NewStateL( MVtEngSessionInfo::EClearing ); + // just store aOp for callback to UI + CVtEngMediaHandler& mHandler = MediaHandler(); + CleanupStack::PushL( newState ); + newState->OpenL( this ); + CleanupStack::Pop(); // newState + mHandler.HandleL( aOp ); + } + +// ----------------------------------------------------------------------------- +// CVtEngStateBase::ValidateCommand +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngStateBase::ValidateCommand( + const TVtEngCommandId aCommandId ) + { + __VTPRINT( DEBUG_DETAIL | DEBUG_GEN, "StateBase.Validate") + TBool okToPerform( EFalse ); + switch ( aCommandId ) + { + // Flow through, ok to execute ==> check the state possibilities + case KVtEngInitializeEngine: + case KVtEngInitializeEngineDiag: + case KVtEngInitializeEngineTest: + case KVtEngResetEngine: + case KVtEngStartRenderRemote: + case KVtEngStopRenderRemote: + case KVtEngPrepareRemoteRender: + case KVtEngPrepareRemoteRenderDSA: + case KVtEngPrepareRemoteRenderDP: + case KVtEngPrepareRemoteRenderNGA: + case KVtEngPrepareViewFinder: + // Media + case KVtEngSetUIForeground: + okToPerform = ETrue; + break; + case KVtEngPrepareCamera: + case KVtEngSetSource: + case KVtEngSetZoomStep: + case KVtEngStartViewFinder: + case KVtEngFreeze: + case KVtEngUnfreeze: + case KVtEngSetVideoQuality: + case KVtEngHandleLayoutChange: + + // Media object sharing + case KVtEngInitializeShareImage: + case KVtEngStartShareImage: + case KVtEngStopShareImage: + + case KVtEngMuteOutgoingAudio: + case KVtEngUnmuteOutgoingAudio: + case KVtEngSetAudioRouting: + case KVtEngSetAudioVolume: + case KVtEngIncreaseAudioVolume: + case KVtEngDecreaseAudioVolume: + case KVtEngRequestLastRemoteFrame: + + okToPerform = + ( MediaHandler().ValidateCommand( aCommandId ) == KErrNone ); + break; + default: + case KVtEngTerminateSession: // valid only in open state + break; + } + return okToPerform; + } + +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/State/CVtEngStateClearing.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/State/CVtEngStateClearing.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,144 @@ +/* +* 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: Base class for states +* +*/ + + +// INCLUDE FILES +#include "CVtEngStateClearing.h" +#include +#include "CVtEngOperation.h" +#include "CVtEngSettings.h" +#include "VtEngUtils.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngStateClearing::CVtEngStateClearing +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngStateClearing::CVtEngStateClearing( + CVtEngStateManager& aStateManager, + CVtEngEventManager& aEventManager ) + : CVtEngStateBase( aStateManager, aEventManager ) + { + } + +// Destructor +CVtEngStateClearing::~CVtEngStateClearing() + { + __VTPRINT( DEBUG_DESTRUCT, "~StateClr") + } + + +// ----------------------------------------------------------------------------- +// CVtEngStateClearing::UpdateL +// Updates state. +// +// ----------------------------------------------------------------------------- +// +void CVtEngStateClearing::UpdateL() + { + __VTPRINTENTER( "StateClr.Update" ) + const MVtCtlCallControl::TVtCtlState bearerstate = + SessionHandler().RealState(); + const MVtProtocolCommand::TVtProtocolState protostate( MediaHandler().ProtoState() ); + + __VTPRINT2( DEBUG_GEN, "StateClr.bearerState=%d", bearerstate ) + __VTPRINT2( DEBUG_GEN, "StateClr.protoState=%d", protostate ) + + if ( bearerstate == MVtCtlCallControl::EIdle || + bearerstate == MVtCtlCallControl::EDisconnecting || + bearerstate == MVtCtlCallControl::EUnknown || + protostate == MVtProtocolCommand::EIdle || + protostate == MVtProtocolCommand::ESetup ) + { + CVtEngStateBase* idleState = NewStateL( MVtEngSessionInfo::EIdle ); + idleState->OpenL( this ); + } + __VTPRINTEXIT( "StateClr.Update" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngStateClearing::OpenL +// State transition to clearing state. +// +// ----------------------------------------------------------------------------- +// +void CVtEngStateClearing::DoOpenL() + { + __VTPRINTENTER( "StateClr.Open") + + // Do disconnect on Protocol, it is possible that disconnect is already + // ongoing and we get error and that's fine. + TInt err( MediaHandler().Disconnect() ); + if ( err != KErrNone && err != KErrAlreadyExists ) + { + __VTPRINT2( DEBUG_GEN, "StateClr.OpenL disconnect fail=%d", err) + } + // Reset settings + CVtEngSettings& settings = CVtEngUtility::Settings(); + settings.ResetAll(); + NotifyStateChange( MVtEngSessionInfo::EClearing ); + __VTPRINTEXIT( "StateClr.Open") + } + +// ----------------------------------------------------------------------------- +// CVtEngStateClearing::ValidateCommand +// Returns if a command is valid in idle state. +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngStateClearing::ValidateCommand( + const TVtEngCommandId aCommandId ) + { + TBool okToPerform( EFalse ); + switch ( aCommandId ) + { + case KVtEngTerminateSession: + break; + default: + okToPerform = CVtEngStateBase::ValidateCommand( aCommandId ); + break; + } + return okToPerform; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateClearing::State +// Returns session state. +// +// ----------------------------------------------------------------------------- +// +MVtEngSessionInfo::TSessionState CVtEngStateClearing::State() const + { + return MVtEngSessionInfo::EClearing; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateClearing::HandleL +// Handles an operation when behavior is state dependent. +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngStateClearing::HandleL( CVtEngOperation& aOp ) + { + TBool handled( CVtEngStateBase::HandleL( aOp )); + return handled; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/State/CVtEngStateConnected.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/State/CVtEngStateConnected.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,159 @@ +/* +* Copyright (c) 2004-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: Base class for states +* +*/ + + +// INCLUDE FILES +#include "CVtEngStateConnected.h" +#include +#include "CVtEngOperation.h" +#include "CVtEngSettings.h" +#include "VtEngUtils.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngStateConnected::CVtEngStateConnected +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngStateConnected::CVtEngStateConnected( + CVtEngStateManager& aStateManager, + CVtEngEventManager& aEventManager ) + : CVtEngStateBase( aStateManager, aEventManager ) + { + } + +// Destructor +CVtEngStateConnected::~CVtEngStateConnected() + { + __VTPRINT( DEBUG_DESTRUCT, "~StateConnected") + } + + +// ----------------------------------------------------------------------------- +// CVtEngStateConnected::UpdateL +// Updates state. +// +// ----------------------------------------------------------------------------- +// +void CVtEngStateConnected::UpdateL() + { + __VTPRINTENTER( "StateConnected.Update") + const MVtCtlCallControl::TVtCtlState bearerstate = + SessionHandler().RealState(); + MVtProtocolCommand::TVtProtocolState state( MediaHandler().ProtoState() ); + + + CVtEngStateBase* newState = NULL; + if ( bearerstate != MVtCtlCallControl::EConnected ) + { + // we've lost bearer connection, go to idle + newState = NewStateL( MVtEngSessionInfo::EIdle ); + } + else if ( state == MVtProtocolCommand::EConnected ) + { + // protocol is open (should always go through neg.state but just in case) + // change to open state + newState = NewStateL( MVtEngSessionInfo::EOpen ); + } + else if ( state == MVtProtocolCommand::EDisconnecting || + state == MVtProtocolCommand::EResetting ) + { + // change to clearing state + newState = NewStateL( MVtEngSessionInfo::EClearing ); + } + else + { + // protocol is set up so connect now if ready + newState = NegotiatingOrConnectedStateL( ETrue ); + } + if ( newState ) + { + newState->OpenL( this ); + } + __VTPRINTEXIT( "StateConnected.Update") + } + +// ----------------------------------------------------------------------------- +// CVtEngStateConnected::DoOpenL +// State transition to connected state. +// +// ----------------------------------------------------------------------------- +// +void CVtEngStateConnected::DoOpenL() + { + __VTPRINTENTER( "StateConnected.Open") + NotifyStateChange( MVtEngSessionInfo::EConnected ); + //start monitor incoming call + __VTPRINTEXIT( "StateConnected.Open") + } + +// ----------------------------------------------------------------------------- +// CVtEngStateConnected::ValidateCommand +// Returns if a command is valid in idle state. +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngStateConnected::ValidateCommand( + const TVtEngCommandId aCommandId ) + { + __VTPRINT( DEBUG_DETAIL |DEBUG_GEN, "StateConnected.Validate") + TBool okToPerform( EFalse ); + switch ( aCommandId ) + { + case KVtEngSetSource: + case KVtEngPrepareViewFinder: + case KVtEngStartViewFinder: + case KVtEngPauseViewFinder: + case KVtEngStopViewFinder: + case KVtEngPrepareRemoteRenderDSA: + case KVtEngPrepareRemoteRenderDP: + case KVtEngPrepareRemoteRenderNGA: + okToPerform = ETrue; + break; + default: + okToPerform = CVtEngStateBase::ValidateCommand( aCommandId ); + break; + } + return okToPerform; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateConnected::State +// Returns session state. +// +// ----------------------------------------------------------------------------- +// +MVtEngSessionInfo::TSessionState CVtEngStateConnected::State() const + { + return MVtEngSessionInfo::EConnected; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateConnected::HandleL +// Handles an operation when behavior is state dependent. +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngStateConnected::HandleL( CVtEngOperation& aOp ) + { + TBool handled( CVtEngStateBase::HandleL( aOp )); + return handled; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/State/CVtEngStateIdle.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/State/CVtEngStateIdle.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,153 @@ +/* +* Copyright (c) 2004-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: Idle state +* +*/ + + +// INCLUDE FILES +#include "CVtEngStateIdle.h" +#include + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngStateIdle::CVtEngStateIdle +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngStateIdle::CVtEngStateIdle( + CVtEngStateManager& aStateManager, + CVtEngEventManager& aEventManager ) + : CVtEngStateBase( aStateManager, aEventManager ) + { + } + +// Destructor +CVtEngStateIdle::~CVtEngStateIdle() + { + __VTPRINT( DEBUG_DESTRUCT, "~Stateidl") + } + + +// ----------------------------------------------------------------------------- +// CVtEngStateIdle::UpdateL +// Updates state +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVtEngStateIdle::UpdateL() + { + __VTPRINTENTER( "StateIdle.Update") + + const MVtCtlCallControl::TVtCtlState state = SessionHandler().RealState(); + CVtEngStateBase* newState = NULL; + + if( iStateManager.PreviousSessionState() == MVtEngSessionInfo::EUnknown ) + { + switch ( state ) + { + case MVtCtlCallControl::EInitializing: + newState = NewStateL( MVtEngSessionInfo::EInitializing ); + break; + case MVtCtlCallControl::EAlerting: + newState = NewStateL( MVtEngSessionInfo::ERemoteAlerting ); + break; + case MVtCtlCallControl::ERinging: + newState = NewStateL( MVtEngSessionInfo::EReceiving ); + break; + case MVtCtlCallControl::EConnected: + newState = NegotiatingOrConnectedStateL(); + break; + default: + break; + } + if ( newState ) + { + CVtEngUtility* utils = CVtEngUtility::EngineUtils(); + + // Notify UI about initial autolock state. UI must have this + // information early enough to deduce if it is allowed to + // go to foreground. + utils->NotifyLockState(); + utils->StartSATListenL(); + newState->OpenL( this ); + } + } + else + { + __VTPRINT( DEBUG_GEN, "StateIdle.Update wrong previous state, ignoring") + } + __VTPRINTEXIT( "StateIdle.Update") + } + +// ----------------------------------------------------------------------------- +// CVtEngStateIdle::OpenL +// State transition to idle. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVtEngStateIdle::DoOpenL() + { + __VTPRINTENTER( "StateIdle.Open") + // Reset settings + CVtEngSettings& settings = CVtEngUtility::Settings(); + settings.ResetAll(); + + NotifyStateChange( MVtEngSessionInfo::EIdle ); + __VTPRINTEXIT( "StateIdle.Open") + } + +// ----------------------------------------------------------------------------- +// CVtEngStateIdle::ValidateCommand +// Returns if a command is valid in idle state. +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngStateIdle::ValidateCommand( + const TVtEngCommandId aCommandId ) + { + __VTPRINT( DEBUG_DETAIL | DEBUG_GEN, "StateIdle.Validate") + TBool okToPerform( EFalse ); + switch ( aCommandId ) + { + case KVtEngPrepareViewFinder: + case KVtEngPrepareRemoteRenderDSA: + case KVtEngPrepareRemoteRenderDP: + case KVtEngPrepareRemoteRender: + case KVtEngPrepareRemoteRenderNGA: + okToPerform = ETrue; + break; + default: + okToPerform = CVtEngStateBase::ValidateCommand( aCommandId ); + break; + } + return okToPerform; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateIdle::State +// Returns session state. +// +// ----------------------------------------------------------------------------- +// +MVtEngSessionInfo::TSessionState CVtEngStateIdle::State() const + { + return MVtEngSessionInfo::EIdle; + } + + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/State/CVtEngStateInitializing.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/State/CVtEngStateInitializing.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,167 @@ +/* +* Copyright (c) 2006 - 2008 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: Initializing state +* +*/ + + +// INCLUDE FILES +#include "CVtEngStateInitializing.h" +#include "CVtEngOperation.h" +#include "CVtEngSettings.h" +#include "VtEngUtils.h" +#include "CVtEngAudioHandler.h" +#include "CVtEngInitializer.h" +#include + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngStateInitializing::CVtEngStateInitializing +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngStateInitializing::CVtEngStateInitializing( + CVtEngStateManager& aStateManager, + CVtEngEventManager& aEventManager ) + : CVtEngStateBase( aStateManager, aEventManager ) + { + } + +// Destructor +CVtEngStateInitializing::~CVtEngStateInitializing() + { + __VTPRINT( DEBUG_DESTRUCT, "~Stateini") + } + + +// ----------------------------------------------------------------------------- +// CVtEngStateInitializing::UpdateL +// Updates state +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVtEngStateInitializing::UpdateL() + { + __VTPRINTENTER( "StateInit.Update") + const MVtCtlCallControl::TVtCtlState bearerstate = + SessionHandler().RealState(); + + CVtEngStateBase* newState = NULL; + if ( bearerstate == MVtCtlCallControl::EIdle || + bearerstate == MVtCtlCallControl::EDisconnecting ) + { + newState = NewStateL( MVtEngSessionInfo::EClearing ); + // Initializer may be waiting for dataport. In that case MediaHandler + // has already signaled reqStatus of CVtEngInitializer which must + // complete KVtEngInitializeEngine command in order uninitialisation to + // finish properly. This scenario may happen in 1st call since phone + // boot, i.e. when dataport name is not already published. + CVtEngUtility::EngineUtils()->Initializer().CancelInit(); + } + else if ( bearerstate == MVtCtlCallControl::EAlerting ) + { + newState = NewStateL( MVtEngSessionInfo::ERemoteAlerting ); + } + else + { + newState = NegotiatingOrConnectedStateL(); // or null + } + if ( newState ) + { + newState->OpenL( this ); + } + __VTPRINTEXIT( "StateInit.Update") + } + +// ----------------------------------------------------------------------------- +// CVtEngStateInitializing::OpenL +// State transition to initializing. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVtEngStateInitializing::DoOpenL() + { + __VTPRINTENTER( "StateInit.Open" ) + NotifyStateChange( MVtEngSessionInfo::EInitializing ); + + // Instantiate temporary devsound for audio routing + AudioHandler().SetRoutingEnablerL( ETrue ); + __VTPRINTEXIT( "StateInit.Open" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngStateInitializing::ValidateCommand +// Returns if a command is valid in initializing state. +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngStateInitializing::ValidateCommand( + const TVtEngCommandId aCommandId ) + { + __VTPRINT( DEBUG_DETAIL | DEBUG_GEN, "StateInit.Validate") + TBool okToPerform( EFalse ); + switch ( aCommandId ) + { + case KVtEngPrepareViewFinder: + case KVtEngPrepareRemoteRenderDSA: + case KVtEngPrepareRemoteRenderDP: + case KVtEngPrepareRemoteRenderNGA: + case KVtEngSetSource: + case KVtEngStartViewFinder: + okToPerform = ETrue; + break; + default: + okToPerform = CVtEngStateBase::ValidateCommand( aCommandId ); + break; + } + return okToPerform; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateInitializing::State +// Returns session state. +// +// ----------------------------------------------------------------------------- +// +MVtEngSessionInfo::TSessionState CVtEngStateInitializing::State() const + { + return MVtEngSessionInfo::EInitializing; + } + + +// ----------------------------------------------------------------------------- +// CVtEngStateInitializing::HandleL +// Handles an operation when behavior is state dependent. +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngStateInitializing::HandleL( CVtEngOperation& aOp ) + { + TBool handled( CVtEngStateBase::HandleL( aOp )); + if ( !handled ) + { + switch ( aOp.Command() ) + { + case KVtEngStartRenderRemote: + SetVideoEnabled( ETrue ); + handled = ETrue; + break; + } + } + return handled; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/State/CVtEngStateManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/State/CVtEngStateManager.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,182 @@ +/* +* 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: Implementation of state manager for session and audio routing states. +* +*/ + + + +// INCLUDE FILES +#include "CVtEngStateManager.h" +#include "CVtEngHandlerContainer.h" +#include "CVtEngStateBase.h" +#include "CVtEngStateIdle.h" +#include "CVtEngStateOpen.h" +#include "CVtEngEventManager.h" +#include "CVtEngStateConnected.h" +#include "CVtEngOperation.h" +#include "cvtlogger.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngStateManager::CVtEngStateManager +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngStateManager::CVtEngStateManager( + CVtEngHandlerContainer& aHandlers, + CVtEngEventManager& aEventManager ) : + iPreviousSessionState( MVtEngSessionInfo::EUnknown ), + iHandlers( aHandlers ), + iEventManager( aEventManager ) + { + } + +// ----------------------------------------------------------------------------- +// CVtEngStateManager::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVtEngStateManager::ConstructL() + { + iSessionState = new ( ELeave ) + CVtEngStateIdle( *this, iEventManager ); + } + +// ----------------------------------------------------------------------------- +// CVtEngStateManager::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtEngStateManager* CVtEngStateManager::NewL( + CVtEngHandlerContainer& aHandlers, + CVtEngEventManager& aEventManager ) + { + __VTPRINT( DEBUG_GEN , "CVtEngStateManager::NewL" ) + CVtEngStateManager* self = new ( ELeave ) + CVtEngStateManager( aHandlers, aEventManager ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + + +// Destructor +CVtEngStateManager::~CVtEngStateManager() + { + __VTPRINT( DEBUG_GEN , "CVtEngStateManager::~" ) + delete iSessionState; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateManager::UpdateL +// Updates current state. +// +// ----------------------------------------------------------------------------- +// +void CVtEngStateManager::Update( ) + { + if ( iSessionState ) + { + TRAPD(err,iSessionState->UpdateL()); + if ( err != KErrNone ) + { + __VTPRINT2( DEBUG_GEN, "SM.update fail=%d", err ) + iEventManager.NotifyEvent( err ); + } + } + } + +// ----------------------------------------------------------------------------- +// CVtEngStateManager::IsCommandPossible +// Checks if a command is possible in current state. +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngStateManager::IsCommandPossible( + const TVtEngCommandId aCommandId ) const + { + if ( iSessionState ) + { + return iSessionState->ValidateCommand( aCommandId ); + } + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateManager::SetState +// Sets new session state. +// +// ----------------------------------------------------------------------------- +// +void CVtEngStateManager::SetState( CVtEngStateBase& aNewState ) + { + if( iSessionState ) + { + iPreviousSessionState = iSessionState->State(); + } + iSessionState = &aNewState; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateManager::HandleOperationL +// +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngStateManager::HandleOperationL( CVtEngOperation& aOp ) + { + __VTPRINT2( DEBUG_GEN, "StateMgr.HandleOp=%d", aOp.Command() ) + TInt handled( EFalse ); + if ( iSessionState ) + { + handled = iSessionState->HandleL( aOp ); + } + __VTPRINT2( DEBUG_GEN | DEBUG_RETURN, "StateMgr.HandleOp handled=%d", + handled ) + return handled; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateManager::SessionState +// Returns session state. +// +// ----------------------------------------------------------------------------- +// +MVtEngSessionInfo::TSessionState CVtEngStateManager::SessionState() const + { + if ( iSessionState ) + { + return iSessionState->State(); + } + return MVtEngSessionInfo::EUnknown; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateManager::PreviousSessionState +// Returns session state. +// +// ----------------------------------------------------------------------------- +// +MVtEngSessionInfo::TSessionState CVtEngStateManager::PreviousSessionState() const + { + return iPreviousSessionState; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/State/CVtEngStateNegotiating.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/State/CVtEngStateNegotiating.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,167 @@ +/* +* Copyright (c) 2004-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: Negotiating state +* +*/ + + +// INCLUDE FILES +#include "CVtEngStateNegotiating.h" +#include + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngStateNegotiating::CVtEngStateNegotiating +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngStateNegotiating::CVtEngStateNegotiating( + CVtEngStateManager& aStateManager, + CVtEngEventManager& aEventManager ) + : CVtEngStateBase( aStateManager, aEventManager ) + { + } + +// Destructor +CVtEngStateNegotiating::~CVtEngStateNegotiating() + { + __VTPRINT( DEBUG_DESTRUCT, "~Stateneg") + } + + +// ----------------------------------------------------------------------------- +// CVtEngStateNegotiating::UpdateL +// Updates state +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVtEngStateNegotiating::UpdateL() + { + __VTPRINTENTER( "StateNegotiate.Update" ) + const MVtCtlCallControl::TVtCtlState bearerstate = + SessionHandler().RealState(); + const MVtProtocolCommand::TVtProtocolState state( MediaHandler().ProtoState() ); + CVtEngStateBase* newState = NULL; + + if ( bearerstate != MVtCtlCallControl::EConnected || + state == MVtProtocolCommand::ESetup ) // <- connect failed + { + newState = NewStateL( MVtEngSessionInfo::EClearing ); + } + else if ( state == MVtProtocolCommand::EConnected ) + { + // change to open state + newState = NewStateL( MVtEngSessionInfo::EOpen ); + } + else if ( state == MVtProtocolCommand::ESetup ) + { + // should not usually happen unless connect fails + newState = NewStateL( MVtEngSessionInfo::EConnected ); + } + if ( newState ) + { + newState->OpenL( this ); + } + __VTPRINTEXIT( "StateNegotiate.Update" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngStateNegotiating::OpenL +// State transition to negotiating. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVtEngStateNegotiating::DoOpenL( ) + { + __VTPRINTENTER( "StateNegotiate.Open" ) + NotifyStateChange( MVtEngSessionInfo::ENegotiating); + __VTPRINTEXIT( "StateNegotiate.Open" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngStateNegotiating::ValidateCommand +// Returns if a command is valid in negotiating state. +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngStateNegotiating::ValidateCommand( + const TVtEngCommandId aCommandId ) + { + __VTPRINT( DEBUG_DETAIL | DEBUG_GEN, "StateNegotiate.Validate") + TBool okToPerform( EFalse ); + switch ( aCommandId ) + { + case KVtEngPrepareViewFinder: + case KVtEngPrepareRemoteRenderDSA: + case KVtEngPrepareRemoteRenderDP: + case KVtEngPrepareRemoteRender: + case KVtEngPrepareRemoteRenderNGA: + case KVtEngStartRenderRemote: // cached to settings + case KVtEngSetSource: + case KVtEngPrepareCamera: + case KVtEngSetZoomStep: + case KVtEngStartViewFinder: + case KVtEngStopViewFinder: + case KVtEngTerminateSession: + okToPerform = ETrue; + break; + default: + okToPerform = CVtEngStateBase::ValidateCommand( aCommandId ); + break; + } + return okToPerform; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateNegotiating::State +// Returns session state. +// +// ----------------------------------------------------------------------------- +// +MVtEngSessionInfo::TSessionState CVtEngStateNegotiating::State() const + { + return MVtEngSessionInfo::ENegotiating; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateNegotiating::HandleL +// Handles an operation when behavior is state dependent. +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngStateNegotiating::HandleL( CVtEngOperation& aOp ) + { + __VTPRINTENTER( "StateNegotiate.HandleL" ) + TBool handled( CVtEngStateBase::HandleL( aOp ) ); + if ( !handled ) + { + switch ( aOp.Command() ) + { + case KVtEngStartRenderRemote: + SetVideoEnabled( ETrue ); + handled = ETrue; + break; + case KVtEngTerminateSession: + TerminateSessionL( aOp ); + break; + } + } + __VTPRINTEXITR( "StateNegotiate.HandleL %d", handled ) + return handled; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/State/CVtEngStateOpen.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/State/CVtEngStateOpen.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,288 @@ +/* +* Copyright (c) 2006 - 2007 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: Open state handle interfaces implementation +* +*/ + + +// INCLUDE FILES +#include "CVtEngStateOpen.h" +#include "CVtEngOperation.h" +#include "CVtEngAudioHandler.h" +#include + +#include "CVtEngExtensions.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngStateOpen::CVtEngStateOpen +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngStateOpen::CVtEngStateOpen( + CVtEngStateManager& aStateManager, + CVtEngEventManager& aEventManager ) + : CVtEngStateBase( aStateManager, aEventManager ) + { + } + +// Destructor +CVtEngStateOpen::~CVtEngStateOpen() + { + __VTPRINT( DEBUG_DESTRUCT, "~StateOpen") + } + + +// ----------------------------------------------------------------------------- +// CVtEngStateOpen::UpdateL +// Updates state +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVtEngStateOpen::UpdateL() + { + __VTPRINTENTER( "StateOpen.Update" ) + const MVtCtlCallControl::TVtCtlState bearerstate = + SessionHandler().RealState(); + + const MVtProtocolCommand::TVtProtocolState protoState( MediaHandler().ProtoState() ); + const TBool bearerIdle = ( bearerstate == MVtCtlCallControl::EIdle || + bearerstate == MVtCtlCallControl::EUnknown ); + const TBool bearerDisconnecting = + ( bearerstate == MVtCtlCallControl::EDisconnecting ); + + CVtEngStateBase* newState = NULL; + + if ( protoState == MVtProtocolCommand::ESetup || + protoState == MVtProtocolCommand::EIdle || + bearerIdle ) + { + newState = NewStateL( MVtEngSessionInfo::EIdle ); + } + else if ( bearerDisconnecting || protoState == MVtProtocolCommand::EDisconnecting ) + { + newState = NewStateL( MVtEngSessionInfo::EClearing ); + } + if ( newState ) + { + newState->OpenL( this ); + } + __VTPRINTEXIT( "StateOpen.Update" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngStateOpen::OpenL +// State transition to open. +// ----------------------------------------------------------------------------- +// +void CVtEngStateOpen::DoOpenL() + { + __VTPRINTENTER( "StateOpen.Open" ) + + // set audio routing (and ouput volume) + RouteAudioL( NULL ); + + NotifyStateChange( MVtEngSessionInfo::EOpen ); + __VTPRINTEXIT( "StateOpen.Open" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngStateOpen::ValidateCommand +// Returns if a command is valid in open state. +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngStateOpen::ValidateCommand( + const TVtEngCommandId aCommandId ) + { + __VTPRINT( DEBUG_DETAIL | DEBUG_GEN, "StateOpen.Validate") + TBool okToPerform( EFalse ); + switch ( aCommandId ) + { + case KVtEngInitializeEngine: // temporary + case KVtEngPrepareCamera: + case KVtEngSetZoomStep: + case KVtEngStartViewFinder: + case KVtEngPauseViewFinder: + case KVtEngStopViewFinder: + case KVtEngStartRenderRemote: + case KVtEngStopRenderRemote: + case KVtEngPauseRenderRemote: + case KVtEngTerminateSession: + case KVtEngStartDtmfTone: + case KVtEngStopDtmfTone: + // Handling of different UIIs, support is there + case KVtEngSetUIIDtmfSupport: + case KVtEngSetUIIBasicStringSupport: + case KVtEngSetUIIIA5StringSupport: + case KVtEngSetUIIGeneralStringSupport: + case KVtEngSwitchToVoice: + okToPerform = ETrue; + break; + + // Extension commands + case KVtEngSetContrast: + case KVtEngSetBrightness: + case KVtEngSetWhiteBalance: + case KVtEngSetColorTone: +#if defined ( RD_VT_RTF ) + case KVtEngStartRecord: + case KVtEngStopRecord: +#endif // RD_VT_RTF + { + // Get extension handle from Utils + __VTPRINT(DEBUG_GEN, "StateOpen extension->ValidateCommand") + okToPerform = CVtEngUtility::Extensions()->ValidateCommand( + aCommandId ); + break; + } + + default: + okToPerform = CVtEngStateBase::ValidateCommand( aCommandId ); + break; + } + return okToPerform; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateOpen::State +// Returns session state. +// +// ----------------------------------------------------------------------------- +// +MVtEngSessionInfo::TSessionState CVtEngStateOpen::State() const + { + return MVtEngSessionInfo::EOpen; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateOpen::HandleL +// Handles an operation when behavior is state dependent. +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngStateOpen::HandleL( CVtEngOperation& aOp ) + { + __VTPRINTENTER( "StateOpen.HandleL" ) + TBool handled( CVtEngStateBase::HandleL( aOp ) ); + switch ( aOp.Command() ) + { + case KVtEngTerminateSession: + TerminateSessionL( aOp ); + handled = ETrue; + break; + + case KVtEngSwitchToVoice: + { + CVtEngStateBase* newState = + NewStateL( MVtEngSessionInfo::EClearing ); + CleanupStack::PushL( newState ); + newState->OpenL( this ); + CleanupStack::Pop(); + // aOp is not passed to media handler because mediator command + // sender signals completion, see + // CVtEngMdtrCommandSender::HandleVtEventL + } + break; + + // Extension commands + case KVtEngSetContrast: + case KVtEngSetBrightness: + case KVtEngSetWhiteBalance: + case KVtEngSetColorTone: +#if defined ( RD_VT_RTF ) + case KVtEngStartRecord: + case KVtEngStopRecord: +#endif // RD_VT_RTF + CallExtensionL( &aOp); + break; + default: + break; + } + __VTPRINTEXITR( "StateOpen.HandleL %d", handled ) + return handled; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateOpen::RouteAudioL +// Handles audio routing operation. +// +// ----------------------------------------------------------------------------- +// +void CVtEngStateOpen::RouteAudioL( + CVtEngOperation* aOp ) + { + __VTPRINTENTER( "StateOpen.RouteAudioL" ) + CVtEngSettings& settings = CVtEngUtility::Settings(); + const CVtEngSettings::TVtEngVideoCallConfig& config = settings.Config(); + + CVtEngAudioHandler& audioHandler = AudioHandler(); + MVtEngAudio::TAudioRoutingState routingState( MVtEngAudio::EAudioWiredHeadset ); + audioHandler.GetRoutingState( routingState ); + + TBool routeAudio( ETrue ); + TInt volume( config.iAudio.iVolume.iHandsfreeVolume ); + switch ( routingState ) + { + case MVtEngAudio::EAudioWiredHeadset: + routeAudio = EFalse; + // fall thru + case MVtEngAudio::EAudioHandset: + case MVtEngAudio::EAudioBT: + volume = config.iAudio.iVolume.iHandsetVolume; + break; + // use default values + case MVtEngAudio::EAudioLoudspeaker: + default: + break; + } + __VTPRINT3( DEBUG_GEN | DEBUG_DETAIL, + "StateOpen.RouteAudioL route=%d,vol=%d", routeAudio,volume ) + if ( aOp == NULL || ( aOp && routeAudio ) ) + { + // set volume if state was changed (called from DoOpenL) or + // audio routing will be changed + __VTPRINT( DEBUG_GEN | DEBUG_DETAIL, "StateOpen.RouteAudioL SetVol" ) + MediaHandler().SetVolume( volume ); + } + + // *** AUDIO && ( aOp != NULL ) *** + if ( routeAudio && ( aOp != NULL ) ) + { + if ( aOp ) + { + audioHandler.HandleL( *aOp ); + } + } + __VTPRINTEXIT( "StateOpen.RouteAudioL" ) + } + + +// ----------------------------------------------------------------------------- +// CVtEngStateOpen::CallExtensionL +// Handles extension operations. +// +// ----------------------------------------------------------------------------- +// +void CVtEngStateOpen::CallExtensionL( + CVtEngOperation* aOp) + { + __VTPRINTENTER( "StateOpen.CallExtensionL" ) + CVtEngUtility::Extensions()->OfferOperationL( aOp ); + __VTPRINTEXIT( "StateOpen.CallExtensionL" ) + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/Src/State/CVtEngStateRinging.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/State/CVtEngStateRinging.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,140 @@ +/* +* Copyright (c) 2004-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: Ringing state handle interfaces implementation +* +*/ + + +// INCLUDE FILES +#include "CVtEngStateRinging.h" +#include "CVtEngInitializer.h" +#include "VtEngUtils.h" +#include + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngStateRinging::CVtEngStateRinging +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngStateRinging::CVtEngStateRinging( + CVtEngStateManager& aStateManager, + CVtEngEventManager& aEventManager ) + : CVtEngStateBase( aStateManager, aEventManager ) + { + } + +// Destructor +CVtEngStateRinging::~CVtEngStateRinging() + { + __VTPRINT( DEBUG_DESTRUCT, "~StateRing") + } + + +// ----------------------------------------------------------------------------- +// CVtEngStateRinging::UpdateL +// Updates state +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVtEngStateRinging::UpdateL() + { + __VTPRINTENTER( "StateRing.Update" ) + const MVtCtlCallControl::TVtCtlState bearerstate = + SessionHandler().RealState(); + CVtEngStateBase* newState = NULL; + switch ( bearerstate ) + { + case MVtCtlCallControl::EConnected: + newState = NegotiatingOrConnectedStateL(); + break; + case MVtCtlCallControl::EDisconnecting: + case MVtCtlCallControl::EIdle: + newState = NewStateL( MVtEngSessionInfo::EIdle ); + // Initializer may be waiting for dataport. In that case MediaHandler + // has already signaled reqStatus of CVtEngInitializer which must + // complete KVtEngInitializeEngine command in order uninitialisation to + // finish properly. This scenario may happen in 1st call since phone + // boot, i.e. when dataport name is not already published. + CVtEngUtility::EngineUtils()->Initializer().CancelInit(); + break; + default: + break; + } + if ( newState ) + { + newState->OpenL( this ); + } + __VTPRINTEXIT( "StateRing.Update") + } + +// ----------------------------------------------------------------------------- +// CVtEngStateRinging::OpenL +// State transition to Ring. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVtEngStateRinging::DoOpenL() + { + __VTPRINTENTER( "StateRing.Open") + NotifyStateChange( MVtEngSessionInfo::EReceiving ); + __VTPRINTEXIT( "StateRing.Open") + } + +// ----------------------------------------------------------------------------- +// CVtEngStateRinging::ValidateCommand +// Returns if a command is valid in ringing state. +// +// ----------------------------------------------------------------------------- +// +TBool CVtEngStateRinging::ValidateCommand( + const TVtEngCommandId aCommandId ) + { + __VTPRINT( DEBUG_DETAIL | DEBUG_GEN, "Statering.Validate") + TBool okToPerform( EFalse ); + switch ( aCommandId ) + { + case KVtEngSetSource: + case KVtEngPrepareViewFinder: + case KVtEngStartViewFinder: + case KVtEngPauseViewFinder: + case KVtEngPrepareRemoteRenderDSA: + case KVtEngPrepareRemoteRenderDP: + case KVtEngPrepareRemoteRender: + case KVtEngPrepareRemoteRenderNGA: + case KVtEngStartRenderRemote: + okToPerform = ETrue; + break; + default: + okToPerform = CVtEngStateBase::ValidateCommand( aCommandId ); + break; + } + return okToPerform; + } + +// ----------------------------------------------------------------------------- +// CVtEngStateRinging::State +// Returns session state. +// +// ----------------------------------------------------------------------------- +// +MVtEngSessionInfo::TSessionState CVtEngStateRinging::State() const + { + return MVtEngSessionInfo::EReceiving; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/bwins/VIDEOTELENGU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/bwins/VIDEOTELENGU.DEF Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,9 @@ +EXPORTS + ??1CVtEngModel@@UAE@XZ @ 1 NONAME ; CVtEngModel::~CVtEngModel(void) + ?Audio@CVtEngModel@@QBEAAVMVtEngAudio@@XZ @ 2 NONAME ; class MVtEngAudio & CVtEngModel::Audio(void) const + ?CommandHandler@CVtEngModel@@QBEAAVMVtEngCommandHandler@@XZ @ 3 NONAME ; class MVtEngCommandHandler & CVtEngModel::CommandHandler(void) const + ?Extension@CVtEngModel@@QAEPAXABVTUid@@@Z @ 4 NONAME ; void * CVtEngModel::Extension(class TUid const &) + ?Media@CVtEngModel@@QBEAAVMVtEngMedia@@XZ @ 5 NONAME ; class MVtEngMedia & CVtEngModel::Media(void) const + ?NewL@CVtEngModel@@SAPAV1@AAVMVtEngEventObserver@@AAVMVtEngCommandObserver@@@Z @ 6 NONAME ; class CVtEngModel * CVtEngModel::NewL(class MVtEngEventObserver &, class MVtEngCommandObserver &) + ?Session@CVtEngModel@@QBEAAVMVtEngSessionInfo@@XZ @ 7 NONAME ; class MVtEngSessionInfo & CVtEngModel::Session(void) const + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/data/videoteleng_stub.SIS Binary file vtengines/videoteleng/data/videoteleng_stub.SIS has changed diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/videoteleng/data/videoteleng_stub.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/data/videoteleng_stub.pkg Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,31 @@ +; +; Copyright (c) 2009 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: +; +; Languages +&EN + +; Header +#{"videoteleng"}, (0x101F867F), 1, 0, 0, TYPE=SA + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + +;Files +""-"z:\sys\bin\videoteleng.dll" +""-"z:\sys\bin\cscallctrl.dll" +""-"z:\sys\bin\vtlogger.dll" diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/vtmediatorplugin/data/vtmediatorplugin.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/vtmediatorplugin/data/vtmediatorplugin.pkg Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,35 @@ +; +; Copyright (c) 2009 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: +; + +; vtmediatorplugin.pkg +; +; Languages +&EN + +;Header +#{"vtmediatorplugin patch"},(0x2001599F),10,1,0,TYPE=PU + +; localized vendor name +%{"Nokia"} + +; unique vendor name +:"Nokia" + +"\epoc32\release\armv5\udeb\vtmediatorplugin.dll"-"!:\sys\bin\vtmediatorplugin.dll" +"\epoc32\data\z\resource\plugins\vtmediatorplugin.rsc"-"!:\sys\bin\vtmediatorplugin.rsc" + + +; End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/vtmediatorplugin/data/vtmediatorplugin.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/vtmediatorplugin/data/vtmediatorplugin.rss Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,55 @@ +/* +* Copyright (c) 2008 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: Resource file for VT Mediator plugin. +* +*/ + + +// RESOURCE IDENTIFIER +// n/a + +// INCLUDES +#include +#include + + +// ----------------------------------------------------------------------------- +// theInfo +// ECom interface definition for the VT Mediator plugin. +// ----------------------------------------------------------------------------- +RESOURCE REGISTRY_INFO theInfo + { + resource_format_version = RESOURCE_FORMAT_VERSION_2; + dll_uid = 0x2001599F; + interfaces = + { + INTERFACE_INFO + { + interface_uid = KMediatorPluginInterfaceUid; + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = 0x200159A0; + version_no = 1; + display_name = "VT Mediator Plugin"; + default_data = "Mediator"; + opaque_data = ""; + rom_only = 1; + } + }; + } + }; + } + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/vtmediatorplugin/data/vtmediatorplugin.sis Binary file vtengines/vtmediatorplugin/data/vtmediatorplugin.sis has changed diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/vtmediatorplugin/data/vtmediatorplugin_stub.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/vtmediatorplugin/data/vtmediatorplugin_stub.pkg Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,30 @@ +; +; Copyright (c) 2009 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: +; +; Languages +&EN + +; Header +#{"vtmediatorplugin"}, (0x2001599F), 1, 0, 0, TYPE=SA + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + +;Files +""-"z:\sys\bin\vtmediatorplugin.dll" +""-"z:\resource\plugins\vtmediatorplugin.r*" diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/vtmediatorplugin/data/vtmediatorplugin_stub.sis Binary file vtengines/vtmediatorplugin/data/vtmediatorplugin_stub.sis has changed diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/vtmediatorplugin/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/vtmediatorplugin/group/bld.inf Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,32 @@ +/* +* Copyright (c) 2008 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 Telephony Mediator Plugin +* +*/ + +#include + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS +../inc/vtinternalmediatorapi.h |../../../inc/vtinternalmediatorapi.h + +../data/vtmediatorplugin_stub.sis /epoc32/data/z/system/install/vtmediatorplugin_stub.sis + +// Export IBY file +../rom/vtmediatorplugin.iby CORE_APP_LAYER_IBY_EXPORT_PATH(vtmediatorplugin.iby) + +PRJ_MMPFILES +vtmediatorplugin.mmp diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/vtmediatorplugin/group/vtmediatorplugin.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/vtmediatorplugin/group/vtmediatorplugin.mmp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2008 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 telephony mediator plugin +* +*/ + + +#include +#include // for APP_LAYER_SYSTEMINCLUDE macro + +// Build target + +CAPABILITY CAP_ECOM_PLUGIN +TARGET vtmediatorplugin.dll +TARGETTYPE PLUGIN +UID 0x10009D8D 0x2001599F +VENDORID VID_DEFAULT + +SOURCEPATH ../data +START RESOURCE vtmediatorplugin.rss +TARGET vtmediatorplugin.rsc +END + +SOURCEPATH ../src +SOURCE cvtmediatorplugin.cpp +SOURCE vtmediatorpluginproxy.cpp + +USERINCLUDE ../inc +SYSTEMINCLUDE ../../../inc +SYSTEMINCLUDE /epoc32/include/ecom +APP_LAYER_SYSTEMINCLUDE + +LIBRARY apparc.lib +LIBRARY apgrfx.lib +LIBRARY euser.lib +LIBRARY ws32.lib +LIBRARY ecom.lib +LIBRARY mediatorclient.lib +LIBRARY mediatorpluginbase.lib + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/vtmediatorplugin/inc/cvtmediatorplugin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/vtmediatorplugin/inc/cvtmediatorplugin.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,347 @@ +/* +* Copyright (c) 2008 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 Telephony mediator plugin header +* +*/ + + +#ifndef C_VTMEDIATORPLUGIN_H +#define C_VTMEDIATORPLUGIN_H + +// INCLUDES +#include +#include +#include +#include +#include +#include +#include +#include +#include + + + +using namespace TelephonyMediator; +using namespace MediatorService; + +class TelephonyMediator::TTelephonyCallDataParam; +class CMediatorCommandInitiator; +/** +* Mediator plugin for CS video telephony. Fullfills responsibilities: +* - launches Video Telephone application +* - caches CLI and Dataport information for VT app for time between +* the data is broadcasted to time VT is ready to receive it. +* @since S60 5.0 +*/ + +class CVtMediatorPlugin : public CMediatorPluginBase, + public MMediatorNotifications, + public MMediatorEventObserver, + public MMediatorCommandObserver, + public MMediatorCommandResponseObserver + { +public: + + static CMediatorPluginBase* NewL(); + + /** + * Destructor. + */ + ~CVtMediatorPlugin(); + +public: // From Base class + + virtual void StartL(); + +public: // From MMediatorNotifications + + /** + * Raises VT specific CLI/dataport event when event is registered by VT app, + * or when the information is available + * + * @since Series 60 3.1 + * @param aDomain The identifier of the domain. + * @param aCategory The identifier of the category. + * @param aEvents The list of events that have been registered. + * @return None. + */ + virtual void MediatorEventsAddedL( TUid aDomain, + TUid aCategory, + const REventList& aEvents ); + + /** + * New commands have been registered. The commands can now be subscribed. + * The list can contain 1-n new commands into the category. + * + * @since Series 60 3.1 + * @param aDomain The identifier of the domain. + * @param aCategory The identifier of the category. + * @param aCommands List of commands that have been registered. + * @return None. + */ + virtual void MediatorCommandsAddedL( TUid aDomain, + TUid aCategory, + const RCommandList& aCommands ); + + /** + * A category has been removed. All subscriptions are cancelled. + * + * @since Series 60 3.1 + * @param aDomain The identifier of the domain. + * @param aCategory The identifier of the category. + * @return None. + */ + virtual void MediatorCategoryRemovedL( TUid aDomain, TUid aCategory ); + + /** + * List of events has been removed. All subscriptions are cancelled. + * List can contain 1-n events from the specified category. + * + * @since Series 60 3.1 + * @param aDomain The identifier of the domain. + * @param aCategory The identifier of the category. + * @param aEvents The list of events removed. + * @return None. + */ + virtual void MediatorEventsRemovedL( TUid aDomain, + TUid aCategory, + const REventList& aEvents ); + + /** + * List of commands have been removed. All subscriptions are cancelled. + * List can contain 1-n commands from the specified category. + * + * @since Series 60 3.1 + * @param aDomain The identifier of the domain. + * @param aCategory The identifier of the category. + * @param aCommands The list of commands removed + * @return None. + */ + virtual void MediatorCommandsRemovedL( TUid aDomain, + TUid aCategory, + const MediatorService::RCommandList& aCommands ); + +public: // from MMediatorCommandObserver + + /** + * @see MMediatorCommandObserver::MediatorCommandL + */ + virtual void MediatorCommandL( TUid aDomain, + TUid aCategory, + TInt aCommandId, + TVersion aVersion, + const TDesC8& aData ); + + /** + * @see MMediatorCommandObserver::CancelMediatorCommand + */ + virtual void CancelMediatorCommand( TUid aDomain, + TUid aCategory, + TInt aCommandId ); + +public:// from MMediatorCommandResponseObserver + /** + * @see MMediatorCommandResponseObserver::CommandResponseL + */ + virtual void CommandResponseL( TUid aDomain, + TUid aCategory, + TInt aCommandId, + TInt aStatus, + const TDesC8& aData ); + +public: // from MMediatorEventObserver + + /** + * A Mediator Service event. + * + * @since Series 60 3.1 + * @param aDomain The identifier of the domain. + * @param aCategory The identifier of the category. + * @param aEventId The identifier of the event. + * @param aData The parameters of the event. + * @return None. + */ + virtual void MediatorEventL( TUid aDomain, + TUid aCategory, + TInt aEventId, + const TDesC8& aData ); + +public: // new + static TInt EventRaiserCallback( TAny* aAny ); + +private: // constructors + + CVtMediatorPlugin(); void ConstructL(); + + enum TInternalState { + /** + * Waiting for video call state to reach value that is suitable + * for launching Video Telephone application. In this state + * video call is not ongoing. + */ + EWaitingAppLaunch, + + /** + * Waiting for VT application's readiness to receive video call info + * events. In this state video call is ongoing and VT application + * is starting up. + */ + EWaitingEventRegistration, + + /** + * VT application is ready to receive video call info events. + */ + EReady + }; + +private: // new functions + void ChangeCallDataEventSubscriptionL( + const REventList& aEvents, + const TBool aEventRegistered ); + + void HandleVtCommandUnregistrationL(); + + void HandleVtCommandRegistrationL(); + + void LaunchVtAppL(); + + void SaveCallData( const TelephonyMediator::TTelephonyCallDataParam& aData, TVtVideoTelephonyCallInformation& iVtCallInfo); + + void HandleDataportCommandL( const TDesC8& aData ); + + void ClearData(TVtVideoTelephonyCallInformation& aVtCallInfo, TCallState& aCallState); + + void RegisterVtInternalEventL(); + //test + void RegisterVtInternalEvent_2L(); + + void RegisterDataportCommandL(); + + void RaiseVtEventL(); + + /** + * Starts VT application if video call state transition is suitable. + */ + void HandleCallStateChangeL( const TelephonyMediator::TTelephonyCallDataParam& aData ); + + TBool IsEnoughMemory(); + + void FreeRam(); + + void StopDeathActiveL(); + +private: + // for detecting subscription to video call information from VT app. + CMediatorNotifications* iMediatorNotifications; + + // for sending video call information events + CMediatorEventProvider* iEventProvider; + + // for receiving CLI from Telephony + CMediatorEventConsumer* iEventConsumer; + + // for responding to dataport/releasedataport command from Telephony + CMediatorCommandResponder* iCommandResponder; + + // for issue command to vt app + CMediatorCommandInitiator* iCommandInitiator; + + // supported mediator commands + MediatorService::RCommandList iCommandList; + + // plugin's internal state + TInternalState iState; + + // cached active video call state (from last call data event from Telephony) + TCallState iActiveVideoCallState; + + TVtVideoTelephonyCallInformation iActiveVideoCallInfo; + + // cached waiting video call state (from last call data event from Telephony) + TCallState iWaitingVideoCallState; + + TVtVideoTelephonyCallInformation iWaitingVideoCallInfo; + + // for raising event to VT asynchronously when it starts up + CAsyncCallBack* iCallBack; + + class CAppDeathActive; + // Owned application death waiter. + CAppDeathActive* iAppDeathActive; + + // Owned application thread. + RThread iAppThread; + + // Application thread id. + TThreadId iAppThreadId; + + /** + * Active object for waiting thread death. + * + * @since 2.6 + * @lib videotelcomms.lib + */ + NONSHARABLE_CLASS( CAppDeathActive ) : public CActive + { + public: // Constructors + + /** + * Constructor. + */ + CAppDeathActive( CVtMediatorPlugin& aMediatorPlugin, + RThread& aAppThread ); + + /** + * Destructor. + */ + ~CAppDeathActive(); + + public: // New functions + + /** + * Starts active object. + */ + void Start(); + + public: // From base classes + + /** + * @see CActive::RunL. + */ + virtual void RunL(); + + /** + * @see CActive::DoCancel. + */ + virtual void DoCancel(); + + /** + * @see CActive::RunError. + */ + virtual TInt RunError( TInt aError ); + + private: + + // Reference to starter. + CVtMediatorPlugin& iMediatorPlugin; + + // Reference to thread. + RThread& iAppThread; + + }; + + }; + +#endif // C_VTMEDIATORPLUGIN_H + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/vtmediatorplugin/inc/vtinternalmediatorapi.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/vtmediatorplugin/inc/vtinternalmediatorapi.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,100 @@ +/* +* Copyright (c) 2008 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: Message Interface between VT mediator plugin and VT application +* +*/ + + +#ifndef VTINTERNALMEDIATORAPI_H +#define VTINTERNALMEDIATORAPI_H + +// INCLUDES +#include + +/** The category UID for the messages in this header file. + * UID for category is not real UID, it just need to unique in Domain + */ +const TUid KCatVideotelInternalEvents = { 0x101F8690 }; +const TUid KCatVideotelInternalCommands = { 0x101F8691 }; + +/** Version number of this API */ +const TInt KVideotelMdtrEventVersionMajor( 1 ); +const TInt KVideotelMdtrEventVersionMinor( 0 ); +const TInt KVideotelMdtrEventVersionBuild( 0 ); + +/** Version number of this API */ +const TInt KVideotelMdtrCommandsVersionMajor( 1 ); +const TInt KVideotelMdtrCommandsVersionMinor( 0 ); +const TInt KVideotelMdtrCommandsVersionBuild( 0 ); + +struct TVtVideoTelephonyCallInformation +{ + /** Max length of display text */ + enum { TDisplayTextMaxLength = 100 }; + enum { TPhoneNumMaxLength = 100 }; + + /** Display text type definition */ + typedef TBuf TDisplayText; + + /** Remote end CLI identifier (name/number/call id) */ + TDisplayText iDisplayText; + + /** Call id of the video call */ + TInt iCallId; + + /** Indicates voice call creation possibility to remote end (number is + * available) + */ + TBool iVoiceCallPossible; + + /** Dataport name or empty buffer if not specified in the event */ + TName iDataport; + + /** + * Defines which parts of the event date is valid + */ + enum TMessageDataValidity { + EDisplayTextValid = 0x01, + EDataportValid = 0x02 + }; + + /** Display text type definition */ + typedef TBuf TPhoneNumText; + + /** Remote end CLI identifier (name/number/call id) */ + TPhoneNumText iPhoneNumText; + + /** Event data validity */ + TUint iEventDataValidity; + +}; + +typedef TPckgBuf TVtMediatorInfoPackage; + +/** Events bwtween Video Telephony Mediator plugin and VT application. */ +enum TVideotelMdtrEvents + { + /** + * Event with TVtVideoTelephonyCallInformation as content + * Consuming event requires capability ECapabilityReadDeviceData + */ + EVtMediatorEventVideoCallInformation = 0 + }; + +enum TVideotelMdtrCommands + { + EVtMediatorReleaseDataport = 0 + }; + +#endif // VTINTERNALMEDIATORAPI_H diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/vtmediatorplugin/rom/vtmediatorplugin.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/vtmediatorplugin/rom/vtmediatorplugin.iby Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,25 @@ +/* +* Copyright (c) 2008 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: IBY file + * +*/ + +#ifndef __VTMEDIATORPLUGIN_IBY__ +#define __VTMEDIATORPLUGIN_IBY__ + +#ifdef __CS_VIDEO_TELEPHONY +ECOM_PLUGIN( vtmediatorplugin.dll, vtmediatorplugin.rsc) +#endif +#endif + diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/vtmediatorplugin/src/cvtmediatorplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/vtmediatorplugin/src/cvtmediatorplugin.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,1025 @@ +/* +* Copyright (c) 2008 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 Telephony mediator plugin header +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "cvtmediatorplugin.h" + + +// CONSTANTS +#ifdef _DEBUG +#define TRACE(x) RDebug::Print( _L(x) ); +#define TRACE2(x,y) RDebug::Print( _L(x),y ); +#else +#define TRACE(x) +#define TRACE2(x,y) +#endif + +// This array's values are used in algorithm defining if video telephone +// application should be started. Previous state value is substracted from new +// state value and if result is greater than zero, app is started. +// This tackles transitions where a state is for some reason skipped, +// e.g. idle -> connected (dialling/ringing/answering states were not detected). +// Negative value indicates call clearing. +static const TInt KVtCallStateActionArray[] = { + 0, //ECallStateUnknown + 0, //ECallStateIdle + 1, // ECallStateDialling + 0, // ECallStateEmergencyDialling (not valid video call state) + 1, // ECallStateRinging + 1, // ECallStateConnecting + 1, // ECallStateConnected + 0, // ECallStateHangingUp + 0, // ECallStateHeld (not valid video call state) + 1, // ECallStateAnswering + 0, // ECallStateRejecting + 0 // ECallStateDisconnecting + }; + +static const TInt KVtAppNotReady = 5000; + +static const TInt KVtEngMdtrCmdTimeout = 500000; + +static const TInt KVtInitCallId = -1000; + +// array granularity is 2 (use dataport, release dataport commands) +static const TInt KVtMdtrCmdArrayGranularity = 2; + +const TUid KVtCmVideoTelUiUid = { 0x101F8681 }; + +static const TInt KRamNeededForVideoCalls = 4000000; + +// VT application path +_LIT( KVtCmVideoTelUiPath, "\\sys\\bin\\videotelui.exe" ); + + +// ----------------------------------------------------------------------------- +// CMediatorTestPlugin::CMediatorTestPlugin +// First phase construction. +// ----------------------------------------------------------------------------- +CVtMediatorPlugin::CVtMediatorPlugin() : CMediatorPluginBase(), + iCommandList( KVtMdtrCmdArrayGranularity ), + iState( EWaitingAppLaunch ), + iActiveVideoCallState( ECallStateUnknown ), + iWaitingVideoCallState( ECallStateUnknown ) + + { + ClearData(iActiveVideoCallInfo, iActiveVideoCallState); + ClearData(iWaitingVideoCallInfo, iWaitingVideoCallState); + } + +CMediatorPluginBase* CVtMediatorPlugin::NewL() + { + TRACE("CVtMediatorPlugin::NewL<") + CVtMediatorPlugin* self = new (ELeave) CVtMediatorPlugin; + TRACE("CVtMediatorPlugin::NewL>") + return self; + } + +// ----------------------------------------------------------------------------- +// Destructor. +// ----------------------------------------------------------------------------- +CVtMediatorPlugin::~CVtMediatorPlugin() + { + TRACE("CVtMediatorPlugin::~CVtMediatorPlugin<") + + if ( iMediatorNotifications ) + { + iMediatorNotifications->UnregisterNotificationObserver(); + delete iMediatorNotifications; + } + + // ignore error + if ( iEventConsumer ) + { + iEventConsumer->UnsubscribeEvent( + KMediatorTelephonyDomain, + KCatEventsFromTelephony, + EPhoneEventCallData ); + delete iEventConsumer; + } + + // ignore error + if ( iEventProvider ) + { + iEventProvider->UnregisterEvent( + KMediatorVideoTelephonyDomain, + KCatVideotelInternalEvents, + EVtMediatorEventVideoCallInformation ); + delete iEventProvider; + } + + // ignore error + if ( iCommandResponder ) + { + iCommandResponder->UnregisterCommand( + KMediatorVideoTelephonyDomain, + KCatPhoneToVideotelCommands, + iCommandList ); + iCommandList.Close(); + delete iCommandResponder; + } + + delete iCommandInitiator; + + + if( iAppDeathActive ) + { + delete iAppDeathActive; + iAppThread.Close(); + } + + TRACE("CVtMediatorPlugin::~CVtMediatorPlugin>") + } + +// ----------------------------------------------------------------------------- +// StartL. +// ----------------------------------------------------------------------------- +void CVtMediatorPlugin::StartL() + { + TRACE("CVtMediatorPlugin.StartL<") + + // for monitoring VT app starting + iMediatorNotifications = CMediatorNotifications::NewL(); + iMediatorNotifications->RegisterNotificationObserver( this ); + + // consumer for call data events + iEventConsumer = CMediatorEventConsumer::NewL( this ); + + iCommandInitiator = CMediatorCommandInitiator::NewL( this ); + + + RegisterVtInternalEventL(); + + RegisterDataportCommandL(); + + TRACE("CVtMediatorPlugin.StartL>") + } + +// ----------------------------------------------------------------------------- +// MediatorEventL. +// ----------------------------------------------------------------------------- +void CVtMediatorPlugin::MediatorEventL( TUid /*aDomain*/, + TUid aCategory, + TInt aEventId, + const TDesC8& aData ) + { + TRACE("CVtMediatorPlugin.MediatorEventL<") + if ( aCategory == KCatEventsFromTelephony && + aEventId == EPhoneEventCallData ) + { + TTelephonyCallDataParamPackage pckg; + pckg.Copy( aData ); + const TTelephonyCallDataParam telCallData = pckg(); + HandleCallStateChangeL( telCallData ); + } + TRACE("CVtMediatorPlugin.MediatorEventL>") + } +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin::MediatorEventsAddedL +// +// subscribes to CLI event when it is registered +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::MediatorEventsAddedL( TUid aDomain/*aDomain*/, + TUid aCategory, + const REventList& aEvents ) + { + TRACE("CVtMediatorPlugin.MediatorEventsAddedL<") + + if ( aCategory == KCatEventsFromTelephony ) + { + ChangeCallDataEventSubscriptionL( aEvents, ETrue ); + } + TRACE("CVtMediatorPlugin.MediatorEventsAddedL>") + } + +// ----------------------------------------------------------------------------- +// ?classname::?member_function +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::MediatorCommandsAddedL( TUid /*aDomain*/, + TUid aCategory, + const RCommandList& /*aCommands*/ ) + { + TRACE("CVtMediatorPlugin.MediatorCommandsAddedL<") + if ( aCategory == KCatPhoneToVideotelCommands ) + { + HandleVtCommandRegistrationL(); + } + TRACE("CVtMediatorPlugin.MediatorCommandsAddedL>") + } + +// ----------------------------------------------------------------------------- +// ?classname::?member_function +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::MediatorCategoryRemovedL( TUid /*aDomain*/, + TUid /*aCategory*/ ) + { + } + +// ----------------------------------------------------------------------------- +// ?classname::?member_function +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::MediatorEventsRemovedL( TUid /*aDomain*/, + TUid aCategory, + const REventList& aEvents ) + { + TRACE("CVtMediatorPlugin.MediatorEventsRemovedL<") + if ( aCategory == KCatEventsFromTelephony ) + { + ChangeCallDataEventSubscriptionL( aEvents, EFalse ); + } + TRACE("CVtMediatorPlugin.MediatorEventsRemovedL>") + } + +// ----------------------------------------------------------------------------- +// ?classname::?member_function +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::MediatorCommandsRemovedL( TUid /*aDomain*/, + TUid aCategory, + const RCommandList& /*aCommands*/ ) + { + TRACE("CVtMediatorPlugin.MediatorCommandsRemovedL<") + if ( aCategory == KCatPhoneToVideotelCommands ) + { + // VT has unregistered commands, meaning it is shutting down + HandleVtCommandUnregistrationL(); + } + TRACE("CVtMediatorPlugin.MediatorCommandsRemovedL>") + } + +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin::MediatorCommandL +// +// +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::MediatorCommandL( TUid aDomain, + TUid aCategory, + TInt aCommandId, + TVersion /*aVersion*/, + const TDesC8& aData ) + { + TRACE("CVtMediatorPlugin.MediatorCommandL<") + if ( aCategory == KCatPhoneToVideotelCommands ) + { + if ( aCommandId == EVtCmdUseDataport ) + { +#ifdef _DEBUG + // error in responding is ignored but printed on debug build + const TInt err = +#endif + iCommandResponder->IssueResponse( + aDomain, aCategory, aCommandId, KErrNone, KNullDesC8() ); + TRACE2("CVtMediatorPlugin.MediatorCommandL EVtCmdUseDataport err=%d", err ) + HandleDataportCommandL( aData ); + } + else if ( aCommandId == EVtCmdReleaseDataport ) + { + if ( EReady == iState ) + { + const TVersion version( + KVideotelMdtrCommandsVersionMajor, + KVideotelMdtrCommandsVersionMinor, + KVideotelMdtrCommandsVersionBuild ); + +#ifdef _DEBUG + // error in responding is ignored but printed on debug build + const TInt err = +#endif + iCommandInitiator->IssueCommand( + KMediatorVideoTelephonyDomain, + KCatVideotelInternalCommands, + EVtMediatorReleaseDataport, + version, + KNullDesC8() ); + TRACE2("CVtMediatorPlugin.MediatorCommandL EVtCmdReleaseDataport, send to VT err=%d", err ) + + } + else + { +#ifdef _DEBUG + // error in responding is ignored but printed on debug build + const TInt err = +#endif + iCommandResponder->IssueResponse( + aDomain, + aCategory, + aCommandId, + KErrNone, + KNullDesC8() ); + TRACE2("CVtMediatorPlugin.MediatorCommandL EVtCmdReleaseDataport, just Resp err=%d", err ) + } + + } + } + TRACE("CVtMediatorPlugin.MediatorCommandL>") + } + +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin::CommandResponseL +// +// +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::CommandResponseL( TUid aDomain, TUid aCategory, + TInt aCommandId, TInt /*aStatus*/, const TDesC8& /*aData*/ ) + { + TRACE("CVtMediatorPlugin.CommandResponseL<") + if( ( aDomain == KMediatorVideoTelephonyDomain ) && + ( aCategory == KCatVideotelInternalCommands ) ) + { + TInt res = + iCommandResponder->IssueResponse( + KMediatorVideoTelephonyDomain, + KCatPhoneToVideotelCommands, + EVtCmdReleaseDataport, + KErrNone, + KNullDesC8() ); + TRACE2("CVtMediatorPlugin.CommandResponseL, IssueResponse res: %d", res ) + User::LeaveIfError( res ); + } + TRACE("CVtMediatorPlugin.CommandResponseL>") + } + +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin::CancelMediatorCommand +// +// no-op +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::CancelMediatorCommand( TUid /*aDomain*/, + TUid /*aCategory*/, + TInt /*aCommandId*/ ) + { + } +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin::ChangeCallDataEventSubscriptionL +// +// Takes care of 'call data' event subscription. +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::ChangeCallDataEventSubscriptionL( + const REventList& aEvents, + const TBool aEventRegistered ) + { + TRACE("CVtMediatorPlugin.ChangeCLIEventSubscription<") + + TInt res( KErrNone ); + TInt eventCount = aEvents.Count(); + while ( eventCount-- ) + { + const TEvent& aEvent = aEvents[ eventCount ]; + if ( aEvent.iEventId == EPhoneEventCallData ) + { + if ( aEventRegistered ) + { + // Phone has registered Call data event => subscribe it + const TVersion version( + KTelephonyEventsVersionMajor, + KTelephonyEventsVersionMinor, + KTelephonyEventsVersionBuild ); + res = iEventConsumer->SubscribeEvent( + KMediatorTelephonyDomain, + KCatEventsFromTelephony, + EPhoneEventCallData, version ); + } + else + { + // Phone has unregistered Call data event => unsubscribe it + res = iEventConsumer->UnsubscribeEvent( + KMediatorTelephonyDomain, + KCatEventsFromTelephony, + EPhoneEventCallData ); + } + TRACE2(" (un)subscribe result=%d", res ) + eventCount = 0; // break loop + } + } + + TRACE2("CVtMediatorPlugin.ChangeCLIEventSubscription result=%d>", res ) + User::LeaveIfError( res ); + } + +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin::HandleVtCommandRegistrationL +// +// +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::HandleVtCommandRegistrationL() + { + TRACE("CVtMediatorPlugin.HandleVtCommandRegistrationL<" ) + if ( iState == EWaitingEventRegistration ) + { + // VT app registered commands => it can also receive events + // NOTE: it is expected that VT application first subscribes + // to internal events and only after that registers commands to + // avoid timing problems. + iState = EReady; + delete iCallBack; + iCallBack = NULL; + TCallBack cb( &EventRaiserCallback, this ); + iCallBack = new ( ELeave ) CAsyncCallBack( cb, + CActive::EPriorityStandard ); + TRACE("CVtMediatorPlugin enque async callback" ) + iCallBack->CallBack(); + } + TRACE("CVtMediatorPlugin.HandleVtCommandRegistrationL>" ) + } + +TInt CVtMediatorPlugin::EventRaiserCallback( TAny* aAny ) + { + TRACE("CVtMediatorPlugin.EventRaiserCallback<" ) + CVtMediatorPlugin* plugin = reinterpret_cast( aAny ); + delete plugin->iCallBack; + plugin->iCallBack = NULL; + TRAP_IGNORE( plugin->RaiseVtEventL() ); + TRACE("CVtMediatorPlugin.EventRaiserCallback>" ) + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin:: +// +// +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::HandleVtCommandUnregistrationL() + { + // unregistration means that VT app is shutting down. + TRACE("CVtMediatorPlugin.HandleVtCommandUnregistrationL<" ) + ClearData(iActiveVideoCallInfo, iActiveVideoCallState); + //ClearData(iWaitingVideoCallInfo); + TRACE("CVtMediatorPlugin.HandleVtCommandUnregistrationL>" ) + } + + +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin:: +// +// +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::LaunchVtAppL() + { + + TRACE("CVtMediatorPlugin.LaunchVtAppL<" ) + + if ( !IsEnoughMemory() ) + { + const TVersion KTelephonyCmdVersion( + KTelephonyCommandsVersionMajor, + KTelephonyCommandsVersionMinor, + KTelephonyCommandsVersionBuild ); + const TInt res = + iCommandInitiator->IssueCommand( + KMediatorTelephonyDomain, + KCatVideoTelToPhoneCommands, + EVtCmdLowMemory, + KTelephonyCmdVersion, + KNullDesC8() ); + ClearData(iActiveVideoCallInfo, iActiveVideoCallState); + ClearData(iWaitingVideoCallInfo, iWaitingVideoCallState); + TRACE("CVtMediatorPlugin.LaunchVtAppL, Insufficient Memory" ) + return; + } + + iAppDeathActive = new ( ELeave ) CAppDeathActive( *this, iAppThread ); + + RWsSession wsSession; + User::LeaveIfError( wsSession.Connect() ); + CleanupClosePushL( wsSession ); + + TInt wgId = 0; + TBool found = EFalse; + + // Check if there is already application running. Then we do not + // start new one - rather we just monitor the existing one. + while ( ( wgId != KErrNotFound ) && !found ) + { + CApaWindowGroupName::FindByAppUid( + KVtCmVideoTelUiUid, + wsSession, + wgId ); + + TApaTask task( wsSession ); + task.SetWgId( wgId ); + if ( task.Exists() ) + { + if ( iAppThread.Open( task.ThreadId() ) == KErrNone ) + { + TExitType exitType = iAppThread.ExitType(); + found = ( exitType == EExitPending ); + + if ( found ) + { + iAppThreadId = task.ThreadId(); + } + } + } + + if ( !found ) + { + iAppThread.Close(); + } + } + CleanupStack::PopAndDestroy(); // CleanupClosePushL + + // If application was not found, then launch new application. + if ( !found ) + { + TThreadId threadId; +#ifndef SYMBIAN_SUPPORT_UI_FRAMEWORKS_V1 + CApaCommandLine* cmd = CApaCommandLine::NewLC(); + cmd->SetExecutableNameL( KVtCmVideoTelUiPath ); +#else // !SYMBIAN_SUPPORT_UI_FRAMEWORKS_V1 + CApaCommandLine* cmd = CApaCommandLine::NewLC( KVtCmVideoTelUiPath ); +#endif // SYMBIAN_SUPPORT_UI_FRAMEWORKS_V1 + cmd->SetCommandL( EApaCommandBackground ); + + RApaLsSession session; + User::LeaveIfError( session.Connect() ); + CleanupClosePushL( session ); + + TInt err = session.StartApp( *cmd, threadId ); + if ( err > KErrNone ) + { + err = KErrGeneral; + } + User::LeaveIfError( err ); + CleanupStack::PopAndDestroy( 2, cmd ); // CleanupClosePushL, cmd + User::LeaveIfError( iAppThread.Open( threadId ) ); + iAppThreadId = threadId; + } + + // Start active objects. + iState = EWaitingEventRegistration; + iAppDeathActive->Start(); + TRACE("CVtMediatorPlugin.LaunchVtAppL>" ) + } + + +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin:: +// +// +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::SaveCallData( const TTelephonyCallDataParam& aData, TVtVideoTelephonyCallInformation& iVtCallInfo ) + { + TRACE("CVtMediatorPlugin.SaveCallData<" ) + iVtCallInfo.iDisplayText = aData.iCLIText.Left( + TVtVideoTelephonyCallInformation::TDisplayTextMaxLength ); + + TRACE2("CVtMediatorPlugin.SaveCallData iDisplayText=%S", + &iVtCallInfo.iDisplayText ); + + iVtCallInfo.iCallId = aData.iCallId; + + if ( KNullDesC() != aData.iRemotePhoneNumber ) + { + iVtCallInfo.iVoiceCallPossible = ETrue; + } + iVtCallInfo.iPhoneNumText = aData.iRemotePhoneNumber; + iVtCallInfo.iEventDataValidity |= + TVtVideoTelephonyCallInformation::EDisplayTextValid; + TRACE2("CVtMediatorPlugin.SaveCallData data saved=%d>", + aData.iCallType == ECallTypeVideo ) + } + + +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin:: +// +// +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::HandleDataportCommandL( const TDesC8& aData ) + { + TRACE("CVtMediatorPlugin.HandleDataportCommandL<" ) + TDataPortPackage pckg; + pckg.Copy( aData ); + iActiveVideoCallInfo.iDataport = pckg(); + iActiveVideoCallInfo.iEventDataValidity |= + TVtVideoTelephonyCallInformation::EDataportValid; + RaiseVtEventL(); + TRACE("CVtMediatorPlugin.HandleDataportCommandL>" ) + } + + +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin::ClearData +// +// +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::ClearData(TVtVideoTelephonyCallInformation& aVtCallInfo, TCallState& aCallState) + { + TRACE("CVtMediatorPlugin.ClearData<" ) + if ( aVtCallInfo.iCallId == iActiveVideoCallInfo.iCallId ) + { + iState = EWaitingAppLaunch; + } + aVtCallInfo.iEventDataValidity = 0; + aVtCallInfo.iDataport.Zero(); + aVtCallInfo.iVoiceCallPossible = EFalse; + //for video call, it should be 9/10 + //for other call, it will be from -1 to 8 + aVtCallInfo.iCallId = KVtInitCallId; + aVtCallInfo.iDisplayText.Zero(); + aCallState = ECallStateIdle; + TRACE("CVtMediatorPlugin.ClearData>" ) + } + +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin::RegisterVtInternalEventL +// +// +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::RegisterVtInternalEventL() + { + TRACE("CVtMediatorPlugin.RegisterVtInternalEventL<" ) + iEventProvider = CMediatorEventProvider::NewL(); + + TVersion version( + KVideotelMdtrEventVersionMajor, + KVideotelMdtrEventVersionMinor, + KVideotelMdtrEventVersionBuild ); + + TCapabilitySet capSet; + capSet.SetEmpty(); + capSet.AddCapability( ECapabilityReadDeviceData ); + + const TInt err = iEventProvider->RegisterEvent( + KMediatorVideoTelephonyDomain, + KCatVideotelInternalEvents, + EVtMediatorEventVideoCallInformation, + version, + capSet ); + + + TRACE2("CVtMediatorPlugin.RegisterVtInternalEventL err=%d>", err ) + User::LeaveIfError( err ); + } + +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin::RegisterDataportCommandL +// +// +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::RegisterDataportCommandL() + { + TRACE("CVtMediatorPlugin.RegisterDataportCommandL<" ) + iCommandResponder = CMediatorCommandResponder::NewL( this ); + + TCapabilitySet capSet; + capSet.SetEmpty(); + capSet.AddCapability( ECapabilityWriteDeviceData ); + MediatorService::TCommand command; + + command.iCaps = capSet; + command.iVersion = TVersion( + KPhoneToVideotelCmdVersionMajor, + KPhoneToVideotelCmdVersionMinor, + KPhoneToVideotelCmdVersionBuild ); + command.iTimeout = KVtEngMdtrCmdTimeout; + + // enable microphone command + command.iCommandId = EVtCmdUseDataport; + iCommandList.Append( command ); + + // Releasedataport command + capSet.SetEmpty(); + capSet.AddCapability( ECapabilityPowerMgmt ); + command.iCommandId = EVtCmdReleaseDataport; + iCommandList.Append( command ); + + const TInt err = iCommandResponder->RegisterCommand( + KMediatorVideoTelephonyDomain, + KCatPhoneToVideotelCommands, + iCommandList ); + + TRACE2("CVtMediatorPlugin.RegisterDataportCommandL err=%d>", err ) + User::LeaveIfError( err ); + } + +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin::RaiseVtEventL +// +// Raises VT call info event if in suitable state, i.e. VT app has subscribed +// the event. +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::RaiseVtEventL() + { + TRACE("CVtMediatorPlugin.RaiseVtEventL<" ) + TInt result = KVtAppNotReady; // does not cause leave + TRACE2("CVtMediatorPlugin.RaiseVtEventL iState=%d>", + iState ) + TRACE2("CVtMediatorPlugin.RaiseVtEventL iActiveVideoCallState=%d>", + iActiveVideoCallState ) + if ( iState == EReady && // application subscribed to the event + + // don't send event if video call is not starting/ongoing + ( iActiveVideoCallState >= ECallStateDialling && + iActiveVideoCallState <= ECallStateConnected ) ) + { + const TVersion version( + KVideotelMdtrEventVersionMajor, + KVideotelMdtrEventVersionMinor, + KVideotelMdtrEventVersionBuild ); + + const TVtMediatorInfoPackage pckg( iActiveVideoCallInfo ); + result = iEventProvider->RaiseEvent( + KMediatorVideoTelephonyDomain, + KCatVideotelInternalEvents, + EVtMediatorEventVideoCallInformation, + version, + pckg + ); + } + TRACE2("CVtMediatorPlugin.RaiseVtEventL result=%d>", result ) + User::LeaveIfError( result ); + } + +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin::HandleCallStateChangeL +// +// Compares previous and new video call states and resolves based on result +// if Video telephone applicaton should be launched. +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::HandleCallStateChangeL( + const TTelephonyCallDataParam& aData ) + { + TRACE("CVtMediatorPlugin.HandleCallStateChangeL<" ) + + TRACE2("CVtMediatorPlugin.HandleCallStateChangeL calltype=%d>", + aData.iCallType ) + TRACE2("CVtMediatorPlugin.HandleCallStateChangeL saved Activecallid=%d>", + iActiveVideoCallInfo.iCallId ) + TRACE2("CVtMediatorPlugin.HandleCallStateChangeL saved Waitingcallid=%d>", + iWaitingVideoCallInfo.iCallId ) + TRACE2("CVtMediatorPlugin.HandleCallStateChangeL callid=%d>", + aData.iCallId ) + TRACE2("CVtMediatorPlugin.HandleCallStateChangeL ActiveCallOldState=%d>", + iActiveVideoCallState ) + TRACE2("CVtMediatorPlugin.HandleCallStateChangeL WaitingCallOldState=%d>", + iWaitingVideoCallState ) + TRACE2("CVtMediatorPlugin.HandleCallStateChangeL NewState=%d>", + aData.iCallState ) + + //if the call is waitingcall, just save/clear + if ( aData.iCallType == ECallTypeVideo || + // check also call id because in call clearing states call type may + // be unspecified but call id is saved in call setup and we can + // compare to it. + iActiveVideoCallInfo.iCallId == aData.iCallId || + iWaitingVideoCallInfo.iCallId == aData.iCallId ) + { + TBool isWaitingCall = ETrue; + + /** + * firstly we should check the callid to identify if it is a waitingcal/activecall + * imagine the usecase that long press endkey to shutdown both calls. + * after that checking iState + */ + if ( iWaitingVideoCallInfo.iCallId == aData.iCallId ) + { + isWaitingCall = ETrue; + } + else if ( iActiveVideoCallInfo.iCallId == aData.iCallId ) + { + isWaitingCall = EFalse; + } + //no vt app launched, this happens while vt first launching or end key to shutdown both calls + else if ( iState == EWaitingAppLaunch ) + { + isWaitingCall = EFalse; + } + + TRACE2("CVtMediatorPlugin.HandleCallStateChangeL isWaitingCall=%d>", + isWaitingCall) + + TCallState& callState = isWaitingCall?iWaitingVideoCallState:iActiveVideoCallState; + TVtVideoTelephonyCallInformation& vtCallInfo = isWaitingCall?iWaitingVideoCallInfo:iActiveVideoCallInfo; + + TBool launchNeeded = KVtCallStateActionArray[ aData.iCallState ] - + KVtCallStateActionArray[callState] > 0; + if ( isWaitingCall ) + { + launchNeeded = EFalse; + } + callState = aData.iCallState; + + switch ( callState ) + { + case ECallStateDialling: + case ECallStateRinging: + case ECallStateConnecting: + case ECallStateConnected: + SaveCallData( aData, vtCallInfo); + break; + default: + // data becomes invalid in other states (=call clearing/idle) + ClearData(vtCallInfo, callState); + break; + } + if ( launchNeeded ) + { + LaunchVtAppL(); + } + if ( !isWaitingCall ) + { + RaiseVtEventL(); + } + } + + TRACE("CVtMediatorPlugin.HandleCallStateChangeL>" ) + } + +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin::IsEnoughMemory +// +// Check if there is enough memory to launch +// ----------------------------------------------------------------------------- +// +TBool CVtMediatorPlugin::IsEnoughMemory() + { + TRACE("CVtMediatorPlugin::IsEnoughMemory<" ) + // Fetch amount of free memory. + TMemoryInfoV1Buf memory; + UserHal::MemoryInfo( memory ); + TInt freeRam = (TInt)( memory().iFreeRamInBytes ); + TRACE2("CVtMediatorPlugin::IsEnoughMemory: freeRam = %d", freeRam ) + + TBool enoughRam = ETrue; + + if ( freeRam < KRamNeededForVideoCalls ) + { + FreeRam(); + freeRam = (TInt)( memory().iFreeRamInBytes ); + TRACE2("CVtMediatorPlugin::IsEnoughMemory: after free, freeRam = %d", freeRam ) + if ( freeRam < KRamNeededForVideoCalls ) + { + enoughRam = EFalse; + TRACE ("CVtMediatorPlugin::IsEnoughMemory : Not enough RAM") + + } + } + TRACE("CVtMediatorPlugin::IsEnoughMemory>" ) + return enoughRam; + } +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin::FreeRam +// Try to free memory to match the memory usage of VT +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::FreeRam() + { + TRACE("CVtMediatorPlugin.FreeRam()<") + User::CompressAllHeaps(); + TRACE("CVtMediatorPlugin.FreeRam()>") + } + +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin::StopDeathActiveL +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::StopDeathActiveL() + { + TRACE("CVtMediatorPlugin.StopDeathActive<") + delete iAppDeathActive; + iAppThread.Close(); + //if there is a waiting call, check if we need to launch it + TRACE2("CVtMediatorPlugin.StopDeathActive WaitintCallID=%d>", + iWaitingVideoCallInfo.iCallId) + if ( iWaitingVideoCallInfo.iCallId != KVtInitCallId ) + { + iActiveVideoCallInfo = iWaitingVideoCallInfo; + iActiveVideoCallState = iWaitingVideoCallState; + ClearData(iWaitingVideoCallInfo, iWaitingVideoCallState); + + if ( iActiveVideoCallState == ECallStateDialling || + iActiveVideoCallState == ECallStateRinging || + iActiveVideoCallState == ECallStateConnecting || + iActiveVideoCallState == ECallStateConnected || + iActiveVideoCallState == ECallStateAnswering ) + { + LaunchVtAppL(); + RaiseVtEventL(); + } + } + TRACE("CVtMediatorPlugin.StopDeathActive>") + } +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin::CAppDeathActive::CAppDeathActive +// ----------------------------------------------------------------------------- +// +CVtMediatorPlugin::CAppDeathActive::CAppDeathActive( + CVtMediatorPlugin& aMediatorPlugin, + RThread& aAppThread + ) + : CActive( CActive::EPriorityStandard ), + iMediatorPlugin( aMediatorPlugin ), + iAppThread( aAppThread ) + + { + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin::CAppDeathActive::~CAppDeathActive +// ----------------------------------------------------------------------------- +// +CVtMediatorPlugin::CAppDeathActive::~CAppDeathActive() + { + TRACE("CVtMediatorPlugin.~CAppDeathActive") + Cancel(); + } + +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin::CAppDeathActive::Start +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::CAppDeathActive::Start() + { + TRACE("CVtMediatorPlugin.Start<") + Cancel(); + iAppThread.Logon( iStatus ); + SetActive(); + TRACE("CVtMediatorPlugin.Start>") + } + +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin::CAppDeathActive::RunL +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::CAppDeathActive::RunL() + { + //do something here + TRACE("CVtMediatorPlugin.RunL<") + iMediatorPlugin.StopDeathActiveL(); + TRACE("CVtMediatorPlugin.RunL>") + + } + +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin::CAppDeathActive::DoCancel +// ----------------------------------------------------------------------------- +// +void CVtMediatorPlugin::CAppDeathActive::DoCancel() + { + iAppThread.LogonCancel( iStatus ); + } + +// ----------------------------------------------------------------------------- +// CVtMediatorPlugin::CAppDeathActive::RunError +// ----------------------------------------------------------------------------- +// +TInt CVtMediatorPlugin::CAppDeathActive::RunError( TInt /*aError*/ ) + { + return KErrNone; + } diff -r d9b6a8729acd -r dcbddbbaf8fd vtengines/vtmediatorplugin/src/vtmediatorpluginproxy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/vtmediatorplugin/src/vtmediatorpluginproxy.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,40 @@ +/* +* Copyright (c) 2008 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: Source file for MediatorTest Plugin Proxy +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include "cvtmediatorplugin.h" + + +// Provides a key value pair table, this is used to identify +// the correct construction function for the requested interface. +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY( 0x200159A0, CVtMediatorPlugin::NewL ) + }; + +// Function used to return an instance of the proxy table. +EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount) + { + aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); + return ImplementationTable; + } + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/EABI/DisplaySinkU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/EABI/DisplaySinkU.DEF Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,5 @@ +EXPORTS + _Z11CreateSinkLR18TDisplaySinkParamsRK6TDesC8 @ 1 NONAME + _ZN18TDisplaySinkParamsC1Ev @ 2 NONAME + _ZN18TDisplaySinkParamsC2Ev @ 3 NONAME + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/EABI/VtImageConverterU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/EABI/VtImageConverterU.DEF Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,32 @@ +EXPORTS + _ZN24CVTYUVFbsBitmapConverter15SetDestinationLERK10CFbsBitmap @ 1 NONAME + _ZN24CVTYUVFbsBitmapConverter15SetDestinationLEi @ 2 NONAME + _ZN24CVTYUVFbsBitmapConverter8ProcessLEv @ 3 NONAME + _ZN24CVTYUVFbsBitmapConverterD0Ev @ 4 NONAME + _ZN24CVTYUVFbsBitmapConverterD1Ev @ 5 NONAME + _ZN24CVTYUVFbsBitmapConverterD2Ev @ 6 NONAME + _ZN25CVSFbsBitmapIYUVConverter10SetSourceLERK10CFbsBitmap @ 7 NONAME + _ZN25CVSFbsBitmapIYUVConverter4NewLERK10CFbsBitmap @ 8 NONAME + _ZN25CVSFbsBitmapIYUVConverter8ProcessLEv @ 9 NONAME + _ZN25CVSFbsBitmapIYUVConverterD0Ev @ 10 NONAME + _ZN25CVSFbsBitmapIYUVConverterD1Ev @ 11 NONAME + _ZN25CVSFbsBitmapIYUVConverterD2Ev @ 12 NONAME + _ZN25CVTIYUVFbsBitmapConverter4NewLERK5TSizeRK10CFbsBitmap @ 13 NONAME + _ZN25CVTIYUVFbsBitmapConverter4NewLERK5TSizei @ 14 NONAME + _ZN25CVTYV12FbsBitmapConverter4NewLERK5TSizeRK10CFbsBitmap @ 15 NONAME + _ZN25CVTYV12FbsBitmapConverter4NewLERK5TSizei @ 16 NONAME + _ZN30CVTYUVPlanarFbsBitmapConverter10SetSourceLERK5TSizeRK6TDesC8 @ 17 NONAME + _ZN30CVTYUVPlanarFbsBitmapConverter10SetSourceLERK6TDesC8 @ 18 NONAME + _ZN30CVTYUVPlanarFbsBitmapConverter14SetSourceSizeLERK5TSize @ 19 NONAME + _ZNK25CVSFbsBitmapIYUVConverter7YUVDataEv @ 20 NONAME + _ZTI24CVTYUVFbsBitmapConverter @ 21 NONAME ; ## + _ZTI25CVSFbsBitmapIYUVConverter @ 22 NONAME ; ## + _ZTI25CVTIYUVFbsBitmapConverter @ 23 NONAME ; ## + _ZTI25CVTYV12FbsBitmapConverter @ 24 NONAME ; ## + _ZTI30CVTYUVPlanarFbsBitmapConverter @ 25 NONAME ; ## + _ZTV24CVTYUVFbsBitmapConverter @ 26 NONAME ; ## + _ZTV25CVSFbsBitmapIYUVConverter @ 27 NONAME ; ## + _ZTV25CVTIYUVFbsBitmapConverter @ 28 NONAME ; ## + _ZTV25CVTYV12FbsBitmapConverter @ 29 NONAME ; ## + _ZTV30CVTYUVPlanarFbsBitmapConverter @ 30 NONAME ; ## + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/EABI/VtImageTransformsU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/EABI/VtImageTransformsU.DEF Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,59 @@ +EXPORTS + _ZN12CVtImageIYUV4NewLERK5TSize @ 1 NONAME + _ZN12CVtImageIYUV4NewLERK5TSizeR5TPtr8 @ 2 NONAME + _ZN12CVtImageIYUV4NewLERK5TSizeRK6TDesC8 @ 3 NONAME + _ZN12CVtImageIYUV9SetImageLER5TPtr8 @ 4 NONAME + _ZN12CVtImageIYUV9SetImageLERK6TDesC8 @ 5 NONAME + _ZN12CVtImageIYUVD0Ev @ 6 NONAME + _ZN12CVtImageIYUVD1Ev @ 7 NONAME + _ZN12CVtImageIYUVD2Ev @ 8 NONAME + _ZN14CVtImageBitmap10SetBitmapLEi @ 9 NONAME + _ZN14CVtImageBitmap4NewLERK5TSize12TDisplayMode @ 10 NONAME + _ZN14CVtImageBitmap4NewLEi @ 11 NONAME + _ZN14CVtImageBitmap7ResizeLERK5TSize @ 12 NONAME + _ZN14CVtImageBitmapD0Ev @ 13 NONAME + _ZN14CVtImageBitmapD1Ev @ 14 NONAME + _ZN14CVtImageBitmapD2Ev @ 15 NONAME + _ZN14CVtImageScaler11SetQualityLENS_8TQualityE @ 16 NONAME + _ZN14CVtImageScaler4NewLER22MVtImageScalerObserverNS_8TQualityEN7CActive9TPriorityE @ 17 NONAME + _ZN14CVtImageScaler6ScaleLERK8CVtImageRS0_ @ 18 NONAME + _ZN14CVtImageScalerD0Ev @ 19 NONAME + _ZN14CVtImageScalerD1Ev @ 20 NONAME + _ZN14CVtImageScalerD2Ev @ 21 NONAME + _ZN15CVtImageRotator4NewLER23MVtImageRotatorObserverN7CActive9TPriorityE @ 22 NONAME + _ZN15CVtImageRotator7RotateLERK8CVtImageRS0_RKNS_14TRotationAngleE @ 23 NONAME + _ZN15CVtImageRotatorD0Ev @ 24 NONAME + _ZN15CVtImageRotatorD1Ev @ 25 NONAME + _ZN15CVtImageRotatorD2Ev @ 26 NONAME + _ZNK12CVtImageIYUV12UVPlaneWidthEv @ 27 NONAME + _ZNK12CVtImageIYUV13UVPlaneHeightEv @ 28 NONAME + _ZNK12CVtImageIYUV1UEv @ 29 NONAME + _ZNK12CVtImageIYUV1VEv @ 30 NONAME + _ZNK12CVtImageIYUV1YEv @ 31 NONAME + _ZNK12CVtImageIYUV5ImageEv @ 32 NONAME + _ZNK14CVtImageBitmap6BitmapEv @ 33 NONAME + _ZNK8CVtImage4TypeEv @ 34 NONAME + _ZTI12CVtImageIYUV @ 35 NONAME ; ## + _ZTI14CVtImageBitmap @ 36 NONAME ; ## + _ZTI14CVtImageScaler @ 37 NONAME ; ## + _ZTI15CVtImageRotator @ 38 NONAME ; ## + _ZTI25CVtImageScalerImplNearest @ 39 NONAME ; ## + _ZTI26CVtImageScalerImplBilinear @ 40 NONAME ; ## + _ZTI28CVtImageRotatorImplClockwise @ 41 NONAME ; ## + _ZTI29CVtImageRotatorImplMirrorFlip @ 42 NONAME ; ## + _ZTI33CVtImageScalerImplWeightedAverage @ 43 NONAME ; ## + _ZTV12CVtImageIYUV @ 44 NONAME ; ## + _ZTV14CVtImageBitmap @ 45 NONAME ; ## + _ZTV14CVtImageScaler @ 46 NONAME ; ## + _ZTV15CVtImageRotator @ 47 NONAME ; ## + _ZTV25CVtImageScalerImplNearest @ 48 NONAME ; ## + _ZTV26CVtImageScalerImplBilinear @ 49 NONAME ; ## + _ZTV28CVtImageRotatorImplClockwise @ 50 NONAME ; ## + _ZTV29CVtImageRotatorImplMirrorFlip @ 51 NONAME ; ## + _ZTV33CVtImageScalerImplWeightedAverage @ 52 NONAME ; ## + _ZN14CVtImageScaler5ScaleERK8CVtImageRS0_ @ 53 NONAME + _ZN15CVtImageRotator6RotateERK8CVtImageRS0_RKNS_14TRotationAngleE @ 54 NONAME + _ZN14CVtImageScaler9ScaleNowLERK8CVtImageRS0_ @ 55 NONAME + _ZTI18CVtImageScalerImpl @ 56 NONAME ; ## + _ZTV18CVtImageScalerImpl @ 57 NONAME ; ## + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/bmarm/DISPLAYSINKU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/bmarm/DISPLAYSINKU.DEF Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,9 @@ +EXPORTS + SetBitmapAvailable__12CDisplaySinkQ212CDisplaySink9TBitmapNo @ 1 NONAME R3UNUSED ; CDisplaySink::SetBitmapAvailable(CDisplaySink::TBitmapNo) + Release__12CDisplaySink @ 2 NONAME R3UNUSED ; CDisplaySink::Release(void) + ResumeSink__12CDisplaySink @ 3 NONAME R3UNUSED ; CDisplaySink::ResumeSink(void) + NewSinkL__12CDisplaySinkG18TDisplaySinkParamsRC6TDesC8 @ 4 NONAME ; CDisplaySink::NewSinkL(TDisplaySinkParams, TDesC8 const &) + UpdateSinkParamsL__12CDisplaySinkRC18TDisplaySinkParamsRi @ 5 NONAME R3UNUSED ; CDisplaySink::UpdateSinkParamsL(TDisplaySinkParams const &, int &) + "_._12CDisplaySink" @ 6 NONAME R3UNUSED ; CDisplaySink::~CDisplaySink(void) + __18TDisplaySinkParams @ 7 NONAME R3UNUSED ; TDisplaySinkParams::TDisplaySinkParams(void) + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/bmarm/VTIMAGECONVERTERU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/bmarm/VTIMAGECONVERTERU.DEF Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,18 @@ +EXPORTS + "_._25CVSFbsBitmapIYUVConverter" @ 1 NONAME R3UNUSED ; CVSFbsBitmapIYUVConverter::~CVSFbsBitmapIYUVConverter(void) + NewL__25CVTIYUVFbsBitmapConverterRC5TSizeRC10CFbsBitmap @ 2 NONAME R3UNUSED ; CVTIYUVFbsBitmapConverter::NewL(TSize const &, CFbsBitmap const &) + NewL__25CVTIYUVFbsBitmapConverterRC5TSizei @ 3 NONAME R3UNUSED ; CVTIYUVFbsBitmapConverter::NewL(TSize const &, int) + NewL__25CVTYV12FbsBitmapConverterRC5TSizeRC10CFbsBitmap @ 4 NONAME R3UNUSED ; CVTYV12FbsBitmapConverter::NewL(TSize const &, CFbsBitmap const &) + NewL__25CVTYV12FbsBitmapConverterRC5TSizei @ 5 NONAME R3UNUSED ; CVTYV12FbsBitmapConverter::NewL(TSize const &, int) + ProcessL__24CVTYUVFbsBitmapConverter @ 6 NONAME R3UNUSED ; CVTYUVFbsBitmapConverter::ProcessL(void) + ProcessL__25CVSFbsBitmapIYUVConverter @ 7 NONAME R3UNUSED ; CVSFbsBitmapIYUVConverter::ProcessL(void) + SetDestinationL__24CVTYUVFbsBitmapConverterRC10CFbsBitmap @ 8 NONAME R3UNUSED ; CVTYUVFbsBitmapConverter::SetDestinationL(CFbsBitmap const &) + SetDestinationL__24CVTYUVFbsBitmapConverteri @ 9 NONAME R3UNUSED ; CVTYUVFbsBitmapConverter::SetDestinationL(int) + SetSourceL__25CVSFbsBitmapIYUVConverterRC10CFbsBitmap @ 10 NONAME R3UNUSED ; CVSFbsBitmapIYUVConverter::SetSourceL(CFbsBitmap const &) + SetSourceL__30CVTYUVPlanarFbsBitmapConverterRC5TSizeRC6TDesC8 @ 11 NONAME R3UNUSED ; CVTYUVPlanarFbsBitmapConverter::SetSourceL(TSize const &, TDesC8 const &) + SetSourceL__30CVTYUVPlanarFbsBitmapConverterRC6TDesC8 @ 12 NONAME R3UNUSED ; CVTYUVPlanarFbsBitmapConverter::SetSourceL(TDesC8 const &) + SetSourceSizeL__30CVTYUVPlanarFbsBitmapConverterRC5TSize @ 13 NONAME R3UNUSED ; CVTYUVPlanarFbsBitmapConverter::SetSourceSizeL(TSize const &) + YUVData__C25CVSFbsBitmapIYUVConverter @ 14 NONAME R3UNUSED ; CVSFbsBitmapIYUVConverter::YUVData(void) const + "_._24CVTYUVFbsBitmapConverter" @ 15 NONAME R3UNUSED ; CVTYUVFbsBitmapConverter::~CVTYUVFbsBitmapConverter(void) + NewL__25CVSFbsBitmapIYUVConverterRC10CFbsBitmap @ 16 NONAME R3UNUSED ; CVSFbsBitmapIYUVConverter::NewL(CFbsBitmap const &) + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/bmarm/VTIMAGETRANSFORMSU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/bmarm/VTIMAGETRANSFORMSU.DEF Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,28 @@ +EXPORTS + "_._15CVtImageRotator" @ 1 NONAME R3UNUSED ; CVtImageRotator::~CVtImageRotator(void) + Image__C12CVtImageIYUV @ 2 NONAME R3UNUSED ; CVtImageIYUV::Image(void) const + NewL__12CVtImageIYUVRC5TSize @ 3 NONAME R3UNUSED ; CVtImageIYUV::NewL(TSize const &) + NewL__12CVtImageIYUVRC5TSizeR5TPtr8 @ 4 NONAME R3UNUSED ; CVtImageIYUV::NewL(TSize const &, TPtr8 &) + NewL__12CVtImageIYUVRC5TSizeRC6TDesC8 @ 5 NONAME R3UNUSED ; CVtImageIYUV::NewL(TSize const &, TDesC8 const &) + NewL__14CVtImageBitmapRC5TSize12TDisplayMode @ 6 NONAME R3UNUSED ; CVtImageBitmap::NewL(TSize const &, TDisplayMode) + NewL__14CVtImageBitmapi @ 7 NONAME R3UNUSED ; CVtImageBitmap::NewL(int) + NewL__14CVtImageScalerR22MVtImageScalerObserverQ214CVtImageScaler8TQualityQ27CActive9TPriority @ 8 NONAME R3UNUSED ; CVtImageScaler::NewL(MVtImageScalerObserver &, CVtImageScaler::TQuality, CActive::TPriority) + NewL__15CVtImageRotatorR23MVtImageRotatorObserverQ27CActive9TPriority @ 9 NONAME R3UNUSED ; CVtImageRotator::NewL(MVtImageRotatorObserver &, CActive::TPriority) + ResizeL__14CVtImageBitmapRC5TSize @ 10 NONAME R3UNUSED ; CVtImageBitmap::ResizeL(TSize const &) + RotateL__15CVtImageRotatorRC8CVtImageR8CVtImageRCQ215CVtImageRotator14TRotationAngle @ 11 NONAME ; CVtImageRotator::RotateL(CVtImage const &, CVtImage &, CVtImageRotator::TRotationAngle const &) + ScaleL__14CVtImageScalerRC8CVtImageR8CVtImage @ 12 NONAME R3UNUSED ; CVtImageScaler::ScaleL(CVtImage const &, CVtImage &) + SetBitmapL__14CVtImageBitmapi @ 13 NONAME R3UNUSED ; CVtImageBitmap::SetBitmapL(int) + SetImageL__12CVtImageIYUVR5TPtr8 @ 14 NONAME R3UNUSED ; CVtImageIYUV::SetImageL(TPtr8 &) + SetImageL__12CVtImageIYUVRC6TDesC8 @ 15 NONAME R3UNUSED ; CVtImageIYUV::SetImageL(TDesC8 const &) + SetQualityL__14CVtImageScalerQ214CVtImageScaler8TQuality @ 16 NONAME R3UNUSED ; CVtImageScaler::SetQualityL(CVtImageScaler::TQuality) + Type__C8CVtImage @ 17 NONAME R3UNUSED ; CVtImage::Type(void) const + UVPlaneHeight__C12CVtImageIYUV @ 18 NONAME R3UNUSED ; CVtImageIYUV::UVPlaneHeight(void) const + UVPlaneWidth__C12CVtImageIYUV @ 19 NONAME R3UNUSED ; CVtImageIYUV::UVPlaneWidth(void) const + U__C12CVtImageIYUV @ 20 NONAME R3UNUSED ; CVtImageIYUV::U(void) const + V__C12CVtImageIYUV @ 21 NONAME R3UNUSED ; CVtImageIYUV::V(void) const + Y__C12CVtImageIYUV @ 22 NONAME R3UNUSED ; CVtImageIYUV::Y(void) const + "_._12CVtImageIYUV" @ 23 NONAME R3UNUSED ; CVtImageIYUV::~CVtImageIYUV(void) + "_._14CVtImageBitmap" @ 24 NONAME R3UNUSED ; CVtImageBitmap::~CVtImageBitmap(void) + "_._14CVtImageScaler" @ 25 NONAME R3UNUSED ; CVtImageScaler::~CVtImageScaler(void) + Bitmap__C14CVtImageBitmap @ 26 NONAME R3UNUSED ; CVtImageBitmap::Bitmap(void) const + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/bwins/DISPLAYSINKU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/bwins/DISPLAYSINKU.DEF Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,4 @@ +EXPORTS + ??0TDisplaySinkParams@@QAE@XZ @ 1 NONAME ; TDisplaySinkParams::TDisplaySinkParams(void) + ?CreateSinkL@@YAPAVMDisplaySink@@AAVTDisplaySinkParams@@ABVTDesC8@@@Z @ 2 NONAME ; class MDisplaySink * CreateSinkL(class TDisplaySinkParams &, class TDesC8 const &) + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/bwins/VTIMAGECONVERTERU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/bwins/VTIMAGECONVERTERU.DEF Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,18 @@ +EXPORTS + ??1CVSFbsBitmapIYUVConverter@@UAE@XZ @ 1 NONAME ; public: virtual __thiscall CVSFbsBitmapIYUVConverter::~CVSFbsBitmapIYUVConverter(void) + ??1CVTYUVFbsBitmapConverter@@UAE@XZ @ 2 NONAME ; public: virtual __thiscall CVTYUVFbsBitmapConverter::~CVTYUVFbsBitmapConverter(void) + ?NewL@CVSFbsBitmapIYUVConverter@@SAPAV1@ABVCFbsBitmap@@@Z @ 3 NONAME ; public: static class CVSFbsBitmapIYUVConverter * __cdecl CVSFbsBitmapIYUVConverter::NewL(class CFbsBitmap const &) + ?NewL@CVTIYUVFbsBitmapConverter@@SAPAV1@ABVTSize@@ABVCFbsBitmap@@@Z @ 4 NONAME ; public: static class CVTIYUVFbsBitmapConverter * __cdecl CVTIYUVFbsBitmapConverter::NewL(class TSize const &,class CFbsBitmap const &) + ?NewL@CVTIYUVFbsBitmapConverter@@SAPAV1@ABVTSize@@H@Z @ 5 NONAME ; public: static class CVTIYUVFbsBitmapConverter * __cdecl CVTIYUVFbsBitmapConverter::NewL(class TSize const &,int) + ?NewL@CVTYV12FbsBitmapConverter@@SAPAV1@ABVTSize@@ABVCFbsBitmap@@@Z @ 6 NONAME ; public: static class CVTYV12FbsBitmapConverter * __cdecl CVTYV12FbsBitmapConverter::NewL(class TSize const &,class CFbsBitmap const &) + ?NewL@CVTYV12FbsBitmapConverter@@SAPAV1@ABVTSize@@H@Z @ 7 NONAME ; public: static class CVTYV12FbsBitmapConverter * __cdecl CVTYV12FbsBitmapConverter::NewL(class TSize const &,int) + ?ProcessL@CVSFbsBitmapIYUVConverter@@QAEXXZ @ 8 NONAME ; public: void __thiscall CVSFbsBitmapIYUVConverter::ProcessL(void) + ?ProcessL@CVTYUVFbsBitmapConverter@@UAEXXZ @ 9 NONAME ; public: virtual void __thiscall CVTYUVFbsBitmapConverter::ProcessL(void) + ?SetDestinationL@CVTYUVFbsBitmapConverter@@UAEXABVCFbsBitmap@@@Z @ 10 NONAME ; public: virtual void __thiscall CVTYUVFbsBitmapConverter::SetDestinationL(class CFbsBitmap const &) + ?SetDestinationL@CVTYUVFbsBitmapConverter@@UAEXH@Z @ 11 NONAME ; public: virtual void __thiscall CVTYUVFbsBitmapConverter::SetDestinationL(int) + ?SetSourceL@CVSFbsBitmapIYUVConverter@@QAEXABVCFbsBitmap@@@Z @ 12 NONAME ; public: void __thiscall CVSFbsBitmapIYUVConverter::SetSourceL(class CFbsBitmap const &) + ?SetSourceL@CVTYUVPlanarFbsBitmapConverter@@UAEXABVTDesC8@@@Z @ 13 NONAME ; public: virtual void __thiscall CVTYUVPlanarFbsBitmapConverter::SetSourceL(class TDesC8 const &) + ?SetSourceL@CVTYUVPlanarFbsBitmapConverter@@UAEXABVTSize@@ABVTDesC8@@@Z @ 14 NONAME ; public: virtual void __thiscall CVTYUVPlanarFbsBitmapConverter::SetSourceL(class TSize const &,class TDesC8 const &) + ?SetSourceSizeL@CVTYUVPlanarFbsBitmapConverter@@UAEXABVTSize@@@Z @ 15 NONAME ; public: virtual void __thiscall CVTYUVPlanarFbsBitmapConverter::SetSourceSizeL(class TSize const &) + ?YUVData@CVSFbsBitmapIYUVConverter@@QBE?AVTPtrC8@@XZ @ 16 NONAME ; public: class TPtrC8 __thiscall CVSFbsBitmapIYUVConverter::YUVData(void)const + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/bwins/VTIMAGETRANSFORMSU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/bwins/VTIMAGETRANSFORMSU.DEF Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,31 @@ +EXPORTS + ??1CVtImageBitmap@@UAE@XZ @ 1 NONAME ; public: virtual __thiscall CVtImageBitmap::~CVtImageBitmap(void) + ??1CVtImageIYUV@@UAE@XZ @ 2 NONAME ; public: virtual __thiscall CVtImageIYUV::~CVtImageIYUV(void) + ??1CVtImageRotator@@UAE@XZ @ 3 NONAME ; public: virtual __thiscall CVtImageRotator::~CVtImageRotator(void) + ??1CVtImageScaler@@UAE@XZ @ 4 NONAME ; public: virtual __thiscall CVtImageScaler::~CVtImageScaler(void) + ?Bitmap@CVtImageBitmap@@QBEAAVCFbsBitmap@@XZ @ 5 NONAME ; public: class CFbsBitmap & __thiscall CVtImageBitmap::Bitmap(void)const + ?Image@CVtImageIYUV@@QBE?AVTPtrC8@@XZ @ 6 NONAME ; public: class TPtrC8 __thiscall CVtImageIYUV::Image(void)const + ?NewL@CVtImageBitmap@@SAPAV1@ABVTSize@@W4TDisplayMode@@@Z @ 7 NONAME ; public: static class CVtImageBitmap * __cdecl CVtImageBitmap::NewL(class TSize const &,enum TDisplayMode) + ?NewL@CVtImageBitmap@@SAPAV1@H@Z @ 8 NONAME ; public: static class CVtImageBitmap * __cdecl CVtImageBitmap::NewL(int) + ?NewL@CVtImageIYUV@@SAPAV1@ABVTSize@@@Z @ 9 NONAME ; public: static class CVtImageIYUV * __cdecl CVtImageIYUV::NewL(class TSize const &) + ?NewL@CVtImageIYUV@@SAPAV1@ABVTSize@@AAVTPtr8@@@Z @ 10 NONAME ; public: static class CVtImageIYUV * __cdecl CVtImageIYUV::NewL(class TSize const &,class TPtr8 &) + ?NewL@CVtImageIYUV@@SAPAV1@ABVTSize@@ABVTDesC8@@@Z @ 11 NONAME ; public: static class CVtImageIYUV * __cdecl CVtImageIYUV::NewL(class TSize const &,class TDesC8 const &) + ?NewL@CVtImageRotator@@SAPAV1@AAVMVtImageRotatorObserver@@W4TPriority@CActive@@@Z @ 12 NONAME ; public: static class CVtImageRotator * __cdecl CVtImageRotator::NewL(class MVtImageRotatorObserver &,enum CActive::TPriority) + ?NewL@CVtImageScaler@@SAPAV1@AAVMVtImageScalerObserver@@W4TQuality@1@W4TPriority@CActive@@@Z @ 13 NONAME ; public: static class CVtImageScaler * __cdecl CVtImageScaler::NewL(class MVtImageScalerObserver &,enum CVtImageScaler::TQuality,enum CActive::TPriority) + ?ResizeL@CVtImageBitmap@@QAEXABVTSize@@@Z @ 14 NONAME ; public: void __thiscall CVtImageBitmap::ResizeL(class TSize const &) + ?RotateL@CVtImageRotator@@QAEXABVCVtImage@@AAV2@ABW4TRotationAngle@1@@Z @ 15 NONAME ; public: void __thiscall CVtImageRotator::RotateL(class CVtImage const &,class CVtImage &,enum CVtImageRotator::TRotationAngle const &) + ?ScaleL@CVtImageScaler@@QAEXABVCVtImage@@AAV2@@Z @ 16 NONAME ; public: void __thiscall CVtImageScaler::ScaleL(class CVtImage const &,class CVtImage &) + ?SetBitmapL@CVtImageBitmap@@QAEXH@Z @ 17 NONAME ; public: void __thiscall CVtImageBitmap::SetBitmapL(int) + ?SetImageL@CVtImageIYUV@@QAEXAAVTPtr8@@@Z @ 18 NONAME ; public: void __thiscall CVtImageIYUV::SetImageL(class TPtr8 &) + ?SetImageL@CVtImageIYUV@@QAEXABVTDesC8@@@Z @ 19 NONAME ; public: void __thiscall CVtImageIYUV::SetImageL(class TDesC8 const &) + ?SetQualityL@CVtImageScaler@@QAEXW4TQuality@1@@Z @ 20 NONAME ; public: void __thiscall CVtImageScaler::SetQualityL(enum CVtImageScaler::TQuality) + ?Type@CVtImage@@QBE?AW4TVtImageType@1@XZ @ 21 NONAME ; public: enum CVtImage::TVtImageType __thiscall CVtImage::Type(void)const + ?U@CVtImageIYUV@@QBEPAEXZ @ 22 NONAME ; public: unsigned char * __thiscall CVtImageIYUV::U(void)const + ?UVPlaneHeight@CVtImageIYUV@@QBEHXZ @ 23 NONAME ; public: int __thiscall CVtImageIYUV::UVPlaneHeight(void)const + ?UVPlaneWidth@CVtImageIYUV@@QBEHXZ @ 24 NONAME ; public: int __thiscall CVtImageIYUV::UVPlaneWidth(void)const + ?V@CVtImageIYUV@@QBEPAEXZ @ 25 NONAME ; public: unsigned char * __thiscall CVtImageIYUV::V(void)const + ?Y@CVtImageIYUV@@QBEPAEXZ @ 26 NONAME ; public: unsigned char * __thiscall CVtImageIYUV::Y(void)const + ?Scale@CVtImageScaler@@QAEXABVCVtImage@@AAV2@@Z @ 27 NONAME ; void CVtImageScaler::Scale(class CVtImage const &, class CVtImage &) + ?Rotate@CVtImageRotator@@QAEXABVCVtImage@@AAV2@ABW4TRotationAngle@1@@Z @ 28 NONAME ; void CVtImageRotator::Rotate(class CVtImage const &, class CVtImage &, enum CVtImageRotator::TRotationAngle const &) + ?ScaleNowL@CVtImageScaler@@QAEXABVCVtImage@@AAV2@@Z @ 29 NONAME ; void CVtImageScaler::ScaleNowL(class CVtImage const &, class CVtImage &) + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/data/displaysink_stub.SIS Binary file vtprotocolplugins/DisplaySink/data/displaysink_stub.SIS has changed diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/data/displaysink_stub.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/data/displaysink_stub.pkg Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,31 @@ +; +; Copyright (c) 2009 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: +; + +; Languages +&EN +; Header +#{"displaysink"}, (0x101F8693), 1, 0, 0, TYPE=SA + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + +;Files +""-"z:\sys\bin\displaysink.dll" +""-"z:\sys\bin\VtImageConverter.dll" +""-"z:\sys\bin\VtImageTransforms.dll" diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/group/DisplaySink.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/group/DisplaySink.mmp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,53 @@ +/* +* Copyright (c) 2004 - 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: Project definition file for Display Sink subsystem +* +*/ + + +#include +#include "../inc/DisplaySinkUids.hrh" + +TARGET displaysink.dll +TARGETTYPE dll +VENDORID VID_DEFAULT + +UID KSharedLibraryUidDefine KUidDisplaySinkLibrary + +SOURCEPATH ../src +SOURCE CDisplaySink.cpp + +SOURCE CDisplaySinkNGA.cpp +SOURCE CDisplaySinkDP.cpp +SOURCE vtyuvconverter.cpp +SOURCE CDisplaySinkDSA.cpp + + +USERINCLUDE ../inc +APP_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE ../../../inc +SYSTEMINCLUDE /epoc32/include/mmf/common +SYSTEMINCLUDE /epoc32/include/mmf/server + +LIBRARY featmgr.lib +LIBRARY euser.lib +LIBRARY mmfcontrollerframework.lib +LIBRARY fbscli.lib +LIBRARY vtimageconverter.lib +LIBRARY vtimagetransforms.lib + +CAPABILITY CAP_GENERAL_DLL + +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/group/VtImageConverter.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/group/VtImageConverter.mmp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,43 @@ +/* +* Copyright (c) 2004 - 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: Project definition file for Display Sink subsystem +* +*/ + + + +#include +#include "../inc/VtImageConverterUids.hrh" + +TARGET vtimageconverter.dll +TARGETTYPE dll +VENDORID VID_DEFAULT + +UID KSharedLibraryUidDefine KUidVtImageConverterLibrary + +USERINCLUDE ../inc +APP_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE /epoc32/include/libc + +SOURCEPATH ../src +SOURCE CVtImageConverter.cpp + +LIBRARY gdi.lib +LIBRARY euser.lib +LIBRARY fbscli.lib + +CAPABILITY CAP_GENERAL_DLL + +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/group/VtImageTransforms.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/group/VtImageTransforms.mmp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,54 @@ +/* +* Copyright (c) 2004 - 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: Project definition file for Video Source image transforms +* +*/ + + +#include +#include "../inc/CVtImageTransformsUids.hrh" + +TARGET vtimagetransforms.dll +TARGETTYPE dll +VENDORID VID_DEFAULT + +UID KSharedLibraryUidDefine KUidVtImageTransformsLibrary + +SOURCEPATH ../src +SOURCE CVtImage.cpp +SOURCE CVtImageBitmap.cpp +SOURCE CVtImageIYUV.cpp +SOURCE CVtImageScaler.cpp +SOURCE CVtImageScalerImpl.cpp +SOURCE CVtImageScalerImplNearest.cpp +SOURCE CVtImageScalerImplWeightedAverage.cpp +SOURCE CVtImageScalerImplBilinear.cpp +SOURCE CVtImageRotator.cpp +SOURCE CVtImageRotatorImpl.cpp +SOURCE CVtImageRotatorImplMirrorFlip.cpp +SOURCE CVtImageRotatorImplClockwise.cpp + +USERINCLUDE ../inc +APP_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE /epoc32/include/mmf/server +SYSTEMINCLUDE /epoc32/include/mmf/common + +LIBRARY euser.lib +LIBRARY fbscli.lib +LIBRARY bitmaptransforms.lib + +CAPABILITY CAP_GENERAL_DLL + +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/group/bld.inf Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2004 - 2007 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: Component definition file for Display Sink subsystem. +* +*/ + + + + +#include + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS + +../inc/cvtimageconverter.h |../../../inc/cvtimageconverter.h +../inc/cvtimageconverter.inl |../../../inc/cvtimageconverter.inl +../inc/mdisplaysink.h |../../../inc/mdisplaysink.h +../inc/TDisplaySinkParamsDSA.h |../../../inc/tdisplaysinkparamsdsa.h +../inc/tdisplaysinkparamsdsa.inl |../../../inc/tdisplaysinkparamsdsa.inl +../inc/TDisplaySinkParamsDP.h |../../../inc/tdisplaysinkparamsdp.h +../inc/TDisplaySinkParamsNGA.h |../../../inc/tdisplaysinkparamsnga.h +../inc/cvtimage.h |../../../inc/cvtimage.h +../inc/CVtImageBitmap.h |../../../inc/cvtimagebitmap.h +../inc/CVtImageIYUV.h |../../../inc/cvtimageiyuv.h +../inc/CVtImageScaler.h |../../../inc/cvtimagescaler.h +../inc/cvtimagerotator.h |../../../inc/cvtimagerotator.h + +// Export SIS stub file +../data/displaysink_stub.SIS /epoc32/data/z/system/install/displaysink_stub.sis + +// Export IBY file +../rom/DisplaySink.iby CORE_APP_LAYER_IBY_EXPORT_PATH(displaysink.iby) + +PRJ_MMPFILES +VtImageTransforms.mmp +VtImageConverter.mmp +DisplaySink.mmp + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/CDisplaySink.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/CDisplaySink.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,671 @@ +/* +* Copyright (c) 2004 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: DisplaySink subsystem. +* +*/ + + + + +#ifndef CDISPLAYSINK_H +#define CDISPLAYSINK_H + +// INCLUDE FILES + +#include +#include +#include +#include +#include +#include +#include + +#include "mdisplaysink.h" + +// CONSTANTS + +// QCIF size +#define QCIF TSize( 176, 144 ) + +// Number of bitmap sets (big/small) in array +const TInt KBitmapTableCount = 2; + +// FORWARD DECLARATIONS + +class CDisplaySink; +class CVTYUVFbsBitmapConverter; +class CVtCallback; +class CVtImageIYUV; +class CMMFDataBuffer; +class CVtFrameQueue; + +// CLASS DECLARATION + +/** +* CVtFrameQueue +* +* Storage class for DisplaySink. Used in situations where EmptyBufferL() is +* called and there's no available bitmaps (or buffers). This class will +* hold one buffer until next SetBitmapAvailable() is called. Instance operates +* in protocol thread's active scheduler. +* +* @lib DisplaySink.lib +*/ +NONSHARABLE_CLASS( CVtFrameQueue ) : public CActive + { + +public: // new methods + /** + * C++ constructor. + */ + CVtFrameQueue(); + + /** + * Adds this to protocol thread's active scheduler. + */ + TInt ThreadLogon(); + + /** + * Releases stored buffer, when sink is stopped. + */ + void SinkStoppedL(); + + /** + * Deques from protocol thread's active scheduler. + */ + void ThreadLogoff(); + + /** + * Stores buffer & supplier. + */ + void Store( MVTVideoSource& aSupplier, CMMFDataBuffer* aBuffer, TSize aFrameSize, TPtr8& aPtr ); + + /** + * Returns ETrue if buffer is being stored, EFalse otherwise. + */ + TBool IsStored() const; + + /** + * Returns stored buffer. + */ + TVtMMFDataBuffer Buffer(); + + /** + * Releases stored buffer. Supplier's BufferEmptiedL() is called. Call + * is executed in protocol thread's context. + */ + void Release(); + +private: + + /** + * Calls BufferEmptiedL() for supplier. This call always happens in protocol + * thread context. + * @param aBuffer Pointer reference to a buffer to be released. + */ + void DoReleaseBufferL( CMMFDataBuffer*& aBuffer ); + +private: // from CActive + /** + * @see CActive::RunL + */ + void RunL(); + + /** + * @see CActive::DoCancel + */ + void DoCancel(); + +private: + // Stored supplier + MVTVideoSource* iSupplier; + // Stored buffer + CMMFDataBuffer* iBuffer; + + TSize iFrameSize; + TPtr8* iPtr; + // Pre-opened thread object that is used for signalling the delayed + // BufferEmptiedL() call + RThread iThread; + // Buffer to be released on next RunL() + CMMFDataBuffer* iReleaseBuffer; + }; + +/** +* CVtCallback +* +* +* @lib DisplaySink.lib +*/ +NONSHARABLE_CLASS( CVtCallback ) : public CActive + { + +private: + + /** + * Callback type. Currently only size changes are supported. If new callback + * types are needed, add them here. + */ + enum TCallBackType + { + EVideoFrameSizeChanged + }; + +public: + + /** + * C++ constructor. + */ + CVtCallback( MDisplaySinkObserver& aObserver ); + + /** + * C++ destructor. + */ + ~CVtCallback(); + + /** + * Video frame size has been changed. Old and new size are given as + * parameter. + */ + void VideoFrameSizeChangedL( const TSize& aFrom, const TSize& aTo ); + + /** + * Returns callback result. + */ + TInt Result() const; + + /** + * Boolean variable that tells wether or not call back has been served. + */ + TBool Completed() const; + +private: + + /** + * Issues callback. Because callback receiver can be in same or different + * thread this is made as own function that checks whether or not other + * thread needs to be signalled. + */ + void IssueCallbackL(); + +private: // from CActive + + /** + * See CActive documentation. + */ + void RunL(); + + /** + * See CActive documentation. + */ + void DoCancel(); + + /** + * See CActive documentation. + */ + TInt RunError( TInt aError ); + +private: + + // Owner thread's id + TThreadId iOwnThreadId; + + // Pointer to observer + MDisplaySinkObserver* iObserver; + + // Callback type + TCallBackType iCallBackType; + + // Old size + TSize iFrom; + + // New size + TSize iTo; + + // Callback result + TInt iResult; + + // Has callback been completed? + TBool iCompleted; + }; + + +/** +* MVTVideoSink interface implementation +* +* @lib DisplaySink.lib +*/ +NONSHARABLE_CLASS( CDisplaySink ) : public CBase, public MDisplaySink, + public MVTVideoSink +{ +protected: // inner classes + + // Structure containing bitmap related data + class TBitmapEntry + { + public: // data + + // ETrue if this bitmap entry is free + TBool iIsFree; + }; + +private: // from MDisplaySink + + /** + * @see MDisplaySink::Destroy + */ + void Destroy(); + + /** + * @see MDisplaySink::SetBitmapAvailable + */ + void SetBitmapAvailable( TBitmapNo aBitmapNo ); + + /** + * @see MDisplaySink::Release + */ + void Release(); + + /** + * @see MDisplaySink::UpdateSinkParamsL + */ + void UpdateSinkParamsL( const TDisplaySinkParams& aParams, TBool& aUpdated ); + + /** + * @see MDisplaySink::Pause + */ + void Pause(); + + /** + * @see MDisplaySink::Resume + */ + void Resume(); + + /** + * @see MDisplaySink::operator MVTVideoSink& + */ + operator MVTVideoSink&(); + + /** + * @see MDisplaySink::NextFrame + */ + void NextFrame(); + +private: // from MVTVideoSink + /** + * From MVTVideoOutput. See MVTVideoOutput for description. + */ + virtual void SetFormatL( const TDesC8& aFormat ); + + /** + * From MVTVideoOutput. See MVTVideoOutput for description. + */ + virtual void SetVideoFrameSizeL( const TSize& aSize ); + + /** + * From MVTVideoOutput. See MVTVideoOutput for description. + */ + virtual void GetVideoFrameSizeL( TSize& aSize ) const; + + /** + * From MVTVideoSink. See MVTVideoSink for description. + */ + virtual void EmptyBufferL( + TVtMMFDataBuffer aDataBuffer, + MVTVideoSource* aSupplier, + TMediaId aMediaId ); + + /** + * From MVTVideoSink. See MVTVideoSink for description. + */ + virtual void BufferFilledL( CMMFBuffer* aBuffer ); + + /** + * From MVTVideoSink. See MVTVideoSink for description. + */ + virtual TBool CanCreateSinkBuffer(); + + /** + * From MVTVideoSink. See MVTVideoSink for description. + */ + virtual CMMFBuffer* CreateSinkBufferL( + TMediaId aMediaId, + TBool &aReference ); + + /** + * From MVTVideoSink. See MVTVideoSink for description. + */ + virtual TInt SinkThreadLogon( MAsyncEventHandler& aEventHandler ); + + /** + * From MVTVideoSink. See MVTVideoSink for description. + */ + virtual void SinkThreadLogoff(); + + /** + * From MVTVideoSink. See MVTVideoSink for description. + */ + virtual TInt SinkPrimeL(); + + /** + * From MVTVideoSink. See MVTVideoSink for description. + */ + virtual TInt SinkPlayL(); + + /** + * From MVTVideoSink. See MVTVideoSink for description. + */ + virtual TInt SinkPauseL(); + + /** + * From MVTVideoSink. See MVTVideoSink for description. + */ + virtual TInt SinkStopL(); + +private: + const RArray& GetMultimediaTypesL() const; + + +protected: // Constructors and destructor + + /** + * C++ default constructor. + */ + CDisplaySink(); + + /** + * Destructor. + */ + ~CDisplaySink(); + +protected: // New functions + + /** + * By default Symbian 2nd phase constructor is private. + * @param "aParams" Initialization parameters. + * @param "aInitData" Initialization parameters. Not used. + * @exception Can leave with one of the system wide error codes. + */ + void ConstructL( TDisplaySinkParams& aParams, const TDesC8& aInitData ); + + /** + * Thread logon that may leave. This will be trapped and possible + * error code is returned to the caller of SinkThreadLogon(). + * @exception Can leave with one of the system wide error codes. + */ + void SinkThreadLogonL(); + + /** + * Sets limit for displaysink frame rate. + */ + void SetFrameRateLimit( + TDisplaySinkParams::TFrameRateLimit aFrameRateLimit ); + + /** + * Resets frame rate limitter. + */ + void ResetFrameRateLimitter(); + + /** + * Does frame rate limitter validation and also checks if sink is paused. + */ + TBool IsOkToSendFrame(); + + /** + * Opens fbs session and sets flag, if open succeeds. + */ + void FbsConnectL(); + + /** + * Opens VT engine thread. + */ + void ThreadOpenL(); + + /** + * Closes fbs session (if open succeeded earlier). + */ + void FbsDisconnect(); + + /** + * Closes VT thread (if open succeeded earlier). + */ + void ThreadClose(); + + /** + * Cleanup operation for SinkThradLogon. + */ + static void SinkThreadLogonCleanup( TAny* aPtr ); + +private: // new methods implemented in derived classes + + /** + * Called from ConstructL() to allow inherited classes to do their own + * construction. + */ + virtual void BaseConstructL( TDisplaySinkParams& aParams, + const TDesC8& aInitData ) = 0; + + /** + * Converts image. Calls DoConvertL() to do the task. + * @return KErrNone or one of the system wide error codes. + */ + virtual TBool BaseConvert( const TVtMMFDataBuffer& aBuffer ) = 0; + + /** + * Called from SinkThreadLogonL(). + */ + virtual void BaseSinkThreadLogonL() = 0; + + /** + * Called from SinkThreadLogogg(). + */ + virtual void BaseSinkThreadLogoff() = 0; + + /** + * Called from UpdateSinkParamsL(). + */ + virtual void BaseUpdateSinkParamsL( const TDisplaySinkParams& aParams ) = 0; + + /** + * Updates sink params. + * @exception May leave with one of the system wide error codes (e.g. in + * out of memory situaton). + */ + virtual void BaseDoUpdateParamsL() = 0; + + /** + * Called when video frame size is set. + * @exception May leave with one of the system wide error codes (e.g. in + * out of memory situaton). + */ + virtual void BaseSetVideoFrameSizeL( const TSize& aSize ) = 0; + + /** + * Returns ETrue if given frame size matches with expected frame size. + * Implemented in derived classes because in some cases (e.g. when rotation + * is enabled), size calculation is more complicated. + */ + virtual TBool BaseSizesMatch( const TSize& aSize ) = 0; + + /** + * Returns reference to TBitmapEntry. + */ + virtual TBitmapEntry& BitmapEntry( TInt aIndex ) = 0; + + /** + * EmptyBuffer handling. + */ + virtual void BaseEmptyBufferL( TVtMMFDataBuffer& aVTMMFBuffer ) = 0; + + /** + * Bitmap availability handling. + */ + virtual void BaseSetBitmapAvailable( TBitmapNo aBitmapNo ) = 0; + + /** + * Called when source frame size changes. + */ + virtual void BaseVideoFrameSizeChangedL( const TSize& aNewSize ) = 0; + +protected: // Data + + // Video source that provides buffer filled with video frame(s) + MVTVideoSource* iSupplier; + + // Event handler to notify events + MAsyncEventHandler* iEventHandler; + + // Buffer containing video frame(s) and to be converted + CMMFBuffer* iBuffer; + + // Sink data type code as fourCC code + TFourCC iSinkFourCC; + + // Sink state enumeration + enum TState + { + EStopped, + EPrimed, + EPlaying + }; + + // Sink state + TState iState; + + // Array of MIME types supported by sink + RArray iVTMimeTypes; + + // Video frame size + TSize iFrameSize; + + // Thread ID of thread to notify after video frame is converted + TThreadId iThreadId; + + // Handle to thread to notify after video frame is converted + RThread iThread; + + // Pointer to iStatus member of the Active Object to notify + // after video frame is converted + TRequestStatus* iRequestStatusPtr; + + // Critical section to serialize access to iBitmapTable + RCriticalSection iBitmapCS; + + // Semaphore to force thread context switch after video frame + // is converted + RSemaphore iSync; + + + // This is set to ETrue when new params are set, this pointer + // is also used as flag when parameter update is requested. + TBool* iParamsUpdated; + + // This flag variable will be set to ETrue when sink parameters + // need to be updated (e.g. when frame size changes from QCIF + // to Sub QCIF or vice versa) + TBool iWaitingForUpdate; + + // Contains expected frame size (this is taken from given bitmaps). + TSize iExpectedFrameSize; + + // Active object that will call callbacks to VT engine in VT + // engine's thread context. + CVtCallback* iVTSignaller; + + // If ETrue, sink does not convert data that is given to it + TBool iReleased; + + // Output MIME type holder + TBuf8< 128 > iYuv420PlanarDesc; + + // Frame rate interval in milliseconds + TInt iFrameRateInterval; + + // Time since last frame was sent (in milliseconds) + TInt iMilliSecondsSinceLastFrame; + + // Time stamp for last frame sent + TTime iLastFrameTime; + + // When paused remote video will no be sent to VT engine + TBool iPaused; + + // DisplaySink params flags + TUint32 iDSFlags; + + // Is set to ETrue when SinkThreadLogon() is called. + TUint32 iInitFlags; + + // Initialization flags + enum TInitFlags + { + // This flag is set, when SinkThreadLogon() is called + ESinkThreadLogonCalled = ( 1 << 0 ), + + // This flag is set, when FbsSession has been connected + EFbsSessionConnected = ( 1 << 1 ), + + // This flag is set, when handle to Sink Thread has been opened + EThreadOpened = ( 1 << 2 ) + }; + + // Frame queue for holding for holding frames until target conversion + // buffer is ready. + CVtFrameQueue* iVideoFrameQueue; + + // friend classes + + + }; + +/** +* Safe cleanup for synchronization primitives. +* +* @lib DisplaySink.lib +*/ +template < class T > +class CleanupSignal + { +public: + static void PushL( T& aPtr ); +private: + static void Signal( TAny *aPtr ); + }; + +template < class T > +void CleanupSignal< T >::PushL( T& aRef ) + { + CleanupStack::PushL( TCleanupItem( &Signal, &aRef ) ); + } + +template < class T > +void CleanupSignal< T >::Signal( TAny *aPtr ) + { + static_cast< T* >( aPtr )->Signal(); + } + +/** +* Pushes signalable object into cleanup stack. +*/ +template < class T > +void CleanupSignalPushL( T& aRef ) + { + CleanupSignal< T >::PushL( aRef ); + } + +#endif // CDISPLAYSINK_H + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/CDisplaySinkDP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/CDisplaySinkDP.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,159 @@ +/* +* Copyright (c) 2004 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: DisplaySink subsystem. +* +*/ + + + + +#ifndef CDISPLAYSINKDP_H +#define CDISPLAYSINKDP_H + +// INCLUDE FILES + +#include "CDisplaySink.h" +#include "TDisplaySinkParamsDP.h" + +// CLASS DECLARATION + +/** +* Displaysink implementation for Display Posting. +* +* @lib displaysink.lib +* @since Series 60 3.1 +*/ +NONSHARABLE_CLASS( CDisplaySinkDP ) : public CDisplaySink + { +public: // static constructor + + /** + * Static constructor that may leave. + */ + static CDisplaySinkDP* NewL( TDisplaySinkParams& aParams, + const TDesC8& aInitData ); + +private: // constructors and destructor + + /** + * C++ default constructor. + */ + CDisplaySinkDP(); + + /** + * destructor + */ + ~CDisplaySinkDP(); + +private: // from CDisplaySink + + /** + * @see CDisplaySink::BaseConstructL + */ + void BaseConstructL( TDisplaySinkParams& aParams, + const TDesC8& aInitData ); + + /** + * @see CDisplaySink::BaseConvert + */ + TBool BaseConvert( const TVtMMFDataBuffer& aBuffer ); + + /** + * @see CDisplaySink::BaseSinkThreadLogonL + */ + void BaseSinkThreadLogonL(); + + /** + * @see CDisplaySink::BaseSinkThreadLogoff + */ + void BaseSinkThreadLogoff(); + + /** + * @see CDisplaySink::BaseUpdateSinkParamsL + */ + void BaseUpdateSinkParamsL( const TDisplaySinkParams& aParams ); + + /** + * @see CDisplaySink::BaseDoUpdateParamsL + */ + void BaseDoUpdateParamsL(); + + /** + * @see CDisplaySink::BaseDoUpdateParamsL + */ + void BaseSetVideoFrameSizeL( const TSize& aSize ); + + /** + * @see CDisplaySink::BaseSizesMatch + */ + TBool BaseSizesMatch( const TSize& aSize ); + + /** + * @see CDisplaySink::BitmapEntry + */ + TBitmapEntry& BitmapEntry( TInt aIndex ); + + /** + * @see CDisplaySink::BaseEmptyBufferL + */ + void BaseEmptyBufferL( TVtMMFDataBuffer& aVTMMFBuffer ); + + /** + * @see CDisplaySink::BaseSetBitmapAvailable + */ + void BaseSetBitmapAvailable( TBitmapNo aBitmapNo ); + + /** + * @see CDisplaySink::BaseVideoFrameSizeChangedL + */ + void BaseVideoFrameSizeChangedL( const TSize& aNewSize ); + +private: // MDisplaySink + + /** + * @see MDisplaySink::NextFrame + */ + void NextFrame(); + +private: // new methods + + /** + * Updates expected frame size. + * @exception May leave with KErrNotSupported, if bitmap sizes do not match. + */ + void UpdateExpectedFrameSizeL(); + +private: // new classes + + // Class posting buffer related data + class TBitmapEntryDP : public TBitmapEntry + { + public: // data + + // Pointer to Posting Buffer pointer + CPostingSurface::TPostingBuff** iBuffer; + }; + +private: // data + + // Array of bitmap related structures + TBitmapEntryDP iBitmapTable[ KBitmapTableCount ]; + + // Store for saving new parameters in UpdateSinkParamsL() call + TDisplaySinkParamsDP iNewParams; + }; + +#endif // CDISPLAYSINKDP_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/CDisplaySinkDSA.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/CDisplaySinkDSA.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,197 @@ +/* +* Copyright (c) 2004 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: DisplaySink subsystem. +* +*/ + + + + +#ifndef CDISPLAYSINKDSA_H +#define CDISPLAYSINKDSA_H + +// INCLUDE FILES + +#include "CDisplaySink.h" +#include "TDisplaySinkParamsDSA.h" + +// CLASS DECLARATION + +/** +* Displaysink implementation for Direct Screen access. +* +* @lib displaysink.lib +* @since Series 60 3.1 +*/ +NONSHARABLE_CLASS( CDisplaySinkDSA ) : public CDisplaySink, + public MVtImageRotatorObserver + { +public: // static constructor + + /** + * Static constructor that may leave. + */ + static CDisplaySinkDSA* NewL( TDisplaySinkParams& aParams, + const TDesC8& aInitData ); + +private: // constructors and destructor + + /** + * C++ default constructor. + */ + CDisplaySinkDSA(); + + /** + * destructor + */ + ~CDisplaySinkDSA(); + +private: // from CDisplaySink + + /** + * @see CDisplaySink::BaseConstructL + */ + void BaseConstructL( TDisplaySinkParams& aParams, + const TDesC8& aInitData ); + + /** + * @see CDisplaySink::BaseConvert + */ + TBool BaseConvert( const TVtMMFDataBuffer& aBuffer ); + + /** + * @see CDisplaySink::BaseSinkThreadLogonL + */ + void BaseSinkThreadLogonL(); + + /** + * @see CDisplaySink::BaseSinkThreadLogoff + */ + void BaseSinkThreadLogoff(); + + /** + * @see CDisplaySink::BaseUpdateSinkParamsL + */ + void BaseUpdateSinkParamsL( const TDisplaySinkParams& aParams ); + + /** + * @see CDisplaySink::BaseDoUpdateParamsL + */ + void BaseDoUpdateParamsL(); + + /** + * @see CDisplaySink::BaseDoUpdateParamsL + */ + void BaseSetVideoFrameSizeL( const TSize& aSize ); + + /** + * @see CDisplaySink::BaseSizesMatch + */ + TBool BaseSizesMatch( const TSize& aSize ); + + /** + * @see CDisplaySink::BitmapEntry + */ + TBitmapEntry& BitmapEntry( TInt aIndex ); + + /** + * @see CDisplaySink::BaseEmptyBufferL + */ + void BaseEmptyBufferL( TVtMMFDataBuffer& aVTMMFBuffer ); + + /** + * @see CDisplaySink::BaseSetBitmapAvailable + */ + void BaseSetBitmapAvailable( TBitmapNo aBitmapNo ); + + /** + * @see CDisplaySink::BaseVideoFrameSizeChangedL + */ + void BaseVideoFrameSizeChangedL( const TSize& aNewSize ); + +private: // from MVtImageRotatorObserver + + /** + * @see MVtImageRotatorObserver::RotationFinished + */ + void RotationFinished( TInt aError ); + +private: // new methods + + /** + * Updates expected frame size. + * @exception May leave with KErrNotSupported, if bitmap sizes do not match. + */ + void UpdateExpectedFrameSizeL(); + + /** + * Converts image. Calls DoConvertL() to do the task. + * @param "aBitmapNo" CFbsBitmap number to use for converted image. + * @param "aConverted" Reference to boolean that will be ETrue if buffer + * was converted, EFalse otherwise. + * @return KErrNone or one of the system wide error codes. + */ + void ConvertL( const TPtrC8& aBuffer, TBool& aConverted ); + + /** + * Convert YUV420Planar image to a CFbsBitmap. + * @param "aBitmapNo" CFbsBitmap number to use for converted image. + * @return KErrNone or one of the system wide error codes. + */ + void DoConvertL( const TPtrC8& aBuffer, TBitmapNo aBitmapNo ); + +private: // new classes + + // Class containing bitmap related data + class TBitmapEntryDSA : public TBitmapEntry + { + public: // data + + // Handle to target bitmap + TInt iHandle; // QCIF + }; + +private: // data + + // Array of bitmap related structures + TBitmapEntryDSA iBitmapTable[ KBitmapTableCount ]; + + // Converter for bitmap 1, created into Protocol thread's heap + CVTYUVFbsBitmapConverter* iYUVBitmapConverter1; // owned + + // Converter for bitmap 2, created into Protocol thread's heap + CVTYUVFbsBitmapConverter* iYUVBitmapConverter2; // owned + + // Converter for bitmap, created into VT thread's heap + CVTYUVFbsBitmapConverter* iYUVBitmapConverterVT; + + // Pointer to image rotator instance. + CVtImageRotator* iRotator; // owned + + // Source YUV image for image transforms + CVtImageIYUV* iSourceImg; + + // Target YUV image for image transforms + CVtImageIYUV* iTargetImg; + + // Rotation angle + CVtImageRotator::TRotationAngle iRotationAngle; + + // Store for saving new parameters in UpdateSinkParamsL() call + TDisplaySinkParamsDSA iNewParams; + }; + +#endif // CDISPLAYSINKDSA_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/CDisplaySinkNGA.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/CDisplaySinkNGA.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,157 @@ +/* +* Copyright (c) 2004-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: Displaysink implementation for NGA. +* +*/ + +#ifndef CDISPLAYSINKNGA_H +#define CDISPLAYSINKNGA_H + +// INCLUDE FILES +#include "CDisplaySink.h" +#include "TDisplaySinkParamsNGA.h" + +// CLASS DECLARATION + +/** +* Displaysink implementation for NGA. +* +* @lib displaysink.lib +* @since Series 60 3.1 +*/ +NONSHARABLE_CLASS( CDisplaySinkNGA ) : public CDisplaySink + { +public: // static constructor + + /** + * Static constructor that may leave. + */ + static CDisplaySinkNGA* NewL( TDisplaySinkParams& aParams, + const TDesC8& aInitData ); + +private: // constructors and destructor + + /** + * C++ default constructor. + */ + CDisplaySinkNGA(); + + /** + * destructor + */ + ~CDisplaySinkNGA(); + +private: // from CDisplaySink + + + /** + * @see CDisplaySink::BaseConstructL + */ + void BaseConstructL( TDisplaySinkParams& aParams, + const TDesC8& aInitData ); + + /** + * @see CDisplaySink::BaseConvert + */ + TBool BaseConvert( const TVtMMFDataBuffer& aBuffer ); + + /** + * @see CDisplaySink::BaseSinkThreadLogonL + */ + void BaseSinkThreadLogonL(); + + /** + * @see CDisplaySink::BaseSinkThreadLogoff + */ + void BaseSinkThreadLogoff(); + + /** + * @see CDisplaySink::BaseUpdateSinkParamsL + */ + void BaseUpdateSinkParamsL( const TDisplaySinkParams& aParams ); + + /** + * @see CDisplaySink::BaseDoUpdateParamsL + */ + void BaseDoUpdateParamsL(); + + /** + * @see CDisplaySink::BaseDoUpdateParamsL + */ + void BaseSetVideoFrameSizeL( const TSize& aSize ); + + /** + * @see CDisplaySink::BaseSizesMatch + */ + TBool BaseSizesMatch( const TSize& aSize ); + + /** + * @see CDisplaySink::BitmapEntry + */ + TBitmapEntry& BitmapEntry( TInt aIndex ); + + /** + * @see CDisplaySink::BaseEmptyBufferL + */ + void BaseEmptyBufferL( TVtMMFDataBuffer& aVTMMFBuffer ); + + /** + * @see CDisplaySink::BaseSetBitmapAvailable + */ + void BaseSetBitmapAvailable( TBitmapNo aBitmapNo ); + + /** + * @see CDisplaySink::BaseVideoFrameSizeChangedL + */ + void BaseVideoFrameSizeChangedL( const TSize& aNewSize ); + +private: // MDisplaySink + + /** + * @see MDisplaySink::NextFrame + */ + void NextFrame(); + +private: // new methods + + /** + * Updates expected frame size. + * @exception May leave with KErrNotSupported, if bitmap sizes do not match. + */ + void UpdateExpectedFrameSizeL(); + +private: // new classes + + // Class submit buffer related data + class TBitmapEntryNGA : public TBitmapEntry + { + public: // data + + // Pointer to Surface Buffer pointer + //TVideoFrameBuffer** iBuffer; + TUint8** iBuffer; + }; + +private: // data + + // Array of bitmap related structures + TBitmapEntryNGA iBitmapTable[ KBitmapTableCount ]; + + // Store for saving new parameters in UpdateSinkParamsL() call + TDisplaySinkParamsNGA iNewParams; + }; + +#endif // CDISPLAYSINKNGA_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/CVtImageBitmap.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/CVtImageBitmap.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,162 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + + + + +#ifndef CVTIMAGEBITMAP_H +#define CVTIMAGEBITMAP_H + +// INCLUDE FILES + +#include "cvtimage.h" + +// FORWARD DECLARATIONS + +class CFbsBitmap; + +// CLASS DECLARATIONS + +/** +* CFbsBitmap image implementation. +* +* @lib videosource.lib +*/ +class CVtImageBitmap : public CVtImage + { + public: + + /** + * Creates new instance of CVtImageBitmap. + * @param "aBitmapHandle" Handle of bitmap to "bind" this instance to. + * @exception In error situation leaves with one of the system wide + * error codes. + * @return Pointer to newly created instance. + */ + IMPORT_C static CVtImageBitmap* NewL( TInt aBitmapHandle ); + + /** + * Creates new instance of CVtImageBitmap. + * @param "aSize" Size of the image in pixels. + * @param "aDisplayMode" Display mode of the image. + * @exception In error situation leaves with one of the system wide + * error codes. + * @return Pointer to newly created instance. + */ + IMPORT_C static CVtImageBitmap* NewL( + const TSize& aSize, + TDisplayMode aDisplayMode ); + + /** + * C++ destructor. + */ + IMPORT_C ~CVtImageBitmap(); + + /** + * Resizes the image to new dimension. + * @exception In error situation leaves with one of the system wide + * error codes. + * @param "aSize" New size of the image in pixels. + */ + IMPORT_C void ResizeL( const TSize& aSize ); + + /** + * Sets new bitmap this image references to. + * @param "aBitmapHandle" Handle of the bitmap this image will be + * referencing to. + * @exception In error situation leaves with one of the system wide + * error codes. + */ + IMPORT_C void SetBitmapL( TInt aBitmapHandle ); + + /** + * Returns constant reference to CFbsBitmap owned by this instance. + * @exception In error situation leaves with one of the system wide + * error codes. + * @return Constant reference to CFbsBitmap. + */ + IMPORT_C CFbsBitmap& Bitmap() const; + + public: // from CVtImage + + /** + * From CVtImage. See CVtImage for description. + */ + TBool NeedHeapLock() const; + + /** + * From CVtImage. See CVtImage for description. + */ + TVtDisplayMode DisplayMode() const; + + /** + * From CVtImage. See CVtImage for description. + */ + TSize Size() const; + + /** + * From CVtImage. See CVtImage for description. + */ + TInt BytesPerRow() const; + + /** + * From CVtImage. See CVtImage for description. + */ + TUint32* DataAddress() const; + + /** + * From CVtImage. See CVtImage for description. + */ + TUint32* LineAddress( TInt aLine ) const; + + private: + + /** + * C++ constructor. + */ + CVtImageBitmap(); + + /** + * Second phase constructor. + * @param "aSize" Size of the image in pixels. + * @param "aDisplayMode" Display mode of the image. + * @exception In error situation leaves with one of the system wide + * error codes. + */ + void ConstructL( const TSize& aSize, TDisplayMode aDisplayMode ); + + /** + * Second phase constructor. + * @param "aBitmapHandle" Handle of bitmap to "bind" this instance to. + * @exception In error situation leaves with one of the system wide + * error codes. + */ + void ConstructL( TInt aBitmapHandle ); + + private: + + // CFbsImage this image instance references to + CFbsBitmap* iBitmap; // owned + }; + + +#endif // CVTIMAGEBITMAP_H + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/CVtImageIYUV.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/CVtImageIYUV.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,231 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + + + + +#ifndef CVTIMAGEIYUV_H +#define CVTIMAGEIYUV_H + +// INCLUDE FILES + +#include "cvtimage.h" + +// CLASS DECLARATIONS + +/** +* CFbsBitmap image implementation. +* +* @lib videosource.lib +*/ +class CVtImageIYUV : public CVtImage + { + public: + + /** + * Creates new instance of CVtImageIYUV. + * @param "aSize" Size of the image in pixels. + * @exception In error situation leaves with one of the system wide + * error codes. + * @return Pointer to newly created instance. + */ + IMPORT_C static CVtImageIYUV* NewL( const TSize& aSize ); + + /** + * Creates new instance of CVtImageIYUV. + * @param "aSize" Size of the image in pixels. + * @param "aImage" Image data as 8-bit descriptor. Image data is copied into + * this instance. + * @exception In error situation leaves with one of the system wide + * error codes. + * @return Pointer to newly created instance. + */ + IMPORT_C static CVtImageIYUV* NewL( const TSize& aSize, const TDesC8& aImage ); + + /** + * Creates new instance of CVtImageIYUV. + * @param "aSize" Size of the image in pixels. + * @param "aImage" Image data as 8-bit descriptor. This image will be referenced + * and thus changes to this instance will be visible in the caller descriptor + * as well. Also descriptor must remain accessible lifetime of the current + * instance or until new non-referenced image is set. + * @exception In error situation leaves with one of the system wide + * error codes. + * @return Pointer to newly created instance. + */ + IMPORT_C static CVtImageIYUV* NewL( const TSize& aSize, TPtr8& aImage ); + + /** + * C++ destructor. + */ + IMPORT_C ~CVtImageIYUV(); + + /** + * Updates image with given data. + * @param "aImage" New image. + * @param "aImage" Image data as 8-bit descriptor. Image data is copied into + * this instance. + * @exception In error situation leaves with one of the system wide + * error codes. + */ + IMPORT_C void SetImageL( const TDesC8& aImage ); + + /** + * Updates image with given data. + * @param "aImage" Image data as 8-bit descriptor. This image will be referenced + * and thus changes to this instance will be visible in the caller descriptor + * as well. Also descriptor must remain accessible lifetime of the current + * instance or until new non-referenced image is set. + * @exception In error situation leaves with one of the system wide + * error codes. + */ + IMPORT_C void SetImageL( TPtr8& aImage ); + + /** + * Returns image as descriptor. + * @return Image as 8-bit descriptor. + */ + IMPORT_C TPtrC8 Image() const; + + /** + * Returns pointer to Y plane of this image. + * @return Pointer to Y plane of this image. + */ + IMPORT_C TUint8* Y() const; + + /** + * Returns pointer to U plane of this image. + * @return Pointer to U plane of this image. + */ + IMPORT_C TUint8* U() const; + + /** + * Returns pointer to V plane of this image. + * @return Pointer to V plane of this image. + */ + IMPORT_C TUint8* V() const; + + /** + * Returns width of the U and V plane in bytes. + * @return Width of the U and V plane in bytes. + */ + IMPORT_C TInt UVPlaneWidth() const; + + /** + * Returns height of the U and V plane in bytes. + * @return Height of the U and V plane in bytes. + */ + IMPORT_C TInt UVPlaneHeight() const; + + public: // from CVtImage + + /** + * From CVtImage. See CVtImage for description. + */ + TBool NeedHeapLock() const; + + /** + * From CVtImage. See CVtImage for description. + */ + TVtDisplayMode DisplayMode() const; + + /** + * From CVtImage. See CVtImage for description. + */ + TSize Size() const; + + /** + * From CVtImage. See CVtImage for description. + */ + TInt BytesPerRow() const; + + /** + * From CVtImage. See CVtImage for description. + */ + TUint32* DataAddress() const; + + /** + * From CVtImage. See CVtImage for description. + */ + TUint32* LineAddress( TInt aLine ) const; + + + private: + + /** + * Returns size of the image in bytes (all planes + * included). + * @return Size of the image in bytes. + */ + TInt ImageSize() const; + + /** + * C++ constructor. + */ + CVtImageIYUV( const TSize& aSize ); + + /** + * Second phase constructor. + * @exception In error situation leaves with one of the system wide + * error codes. + */ + void ConstructL( const TDesC8* aImage ); + + /** + * Validates given size. + * @exception If the size is not correct leaves with KErrArgument. + */ + void ValidateSizeL( const TSize& aSize ); + + /** + * Checks the size of the given descriptor against required size. + * @exception If the size is not correct leaves with KErrArgument. + */ + void CheckDescriptorSizeL( const TDesC8& aImage ); + + /** + * Sets Y, U and V plane pointers. + */ + void SetYUVPointers(); + private: + + // Size of the image + TSize iSize; + + // Image data + HBufC8* iImage; // owned + + // Image data ptr descriptor + TPtr8 iPtrImage; + + // Ptr to Y plane + TUint8* iY; + + // Ptr to U plane + TUint8* iU; + + // Ptr to V plane + TUint8* iV; + }; + + +#endif // CVTIMAGEIYUV_H + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/CVtImageRotatorImpl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/CVtImageRotatorImpl.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,120 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + + + +#ifndef CVTIMAGEROTATORIMPL_H +#define CVTIMAGEROTATORIMPL_H + +// INCLUDE FILES + +#include "cvtimagerotator.h" + +// FORWARD DECLARATIONS + +class CVtImage; + +// CLASS DECLARATIONS + +/** +* Image scaler implementation. +* +* @lib videosource.lib +*/ +class CVtImageRotatorImpl : public CBase + { + public: + + /** + * Sets scaler params. + * @param "aParams" Scaling params, including source and target images. + * @exception In error situation leaves with one of the system wide + * error codes. + */ + void SetSourceTargetL( const CVtImage& aSource, CVtImage& aTarget ); + + /** + * Method to check whether bitmap heap locking is needed or not during + * scaling process. + * @exception In error situation leaves with one of the system wide + * error codes. + * @return ETrue if bitmap heap lock is needed, EFalse otherwise. + */ + TBool NeedHeapLock() const; + + /** + * Pure virtual rotation method. + * @param "aContinue" When method returns, this parameter will contain + * ETrue if new call is needed (i.e. scaling is not yet finished) or + * EFalse if scaling is complete. + * @return KErrNone or one of the system wide error codes. + */ + virtual TInt Rotate( TBool& aContinue ) = 0; + + /** + * Pure virtual method for checking specific rotation angle support. + * @param "aAngle" Rotation type that will be needed. + * @return ETrue if aAngle is one of the supported rotation types + * EFalse otherwise. + */ + virtual TBool SupportsRotationAngle( const CVtImageRotator::TRotationAngle& aAngle ) = 0; + + /** + * Sets rotation angle to be used. + * @param "aAngle" Rotation type that will be needed. + */ + void SetAngle( const CVtImageRotator::TRotationAngle& aAngle ); + + protected: + + /** + * C++ constructor. + * @param "aAngle" Rotation type that will be needed. + */ + CVtImageRotatorImpl( const CVtImageRotator::TRotationAngle& aAngle ); + + private: + + /** + * Pure virtual source and target image validation method. + * @param "aSource" Constant reference to source image. + * @param "aTarget" Constant reference to target image. + * @exception If source or target is not valid, this method leaves + * with KErrNotSupported. + */ + virtual void ValidateSourceTargetL( + const CVtImage& aSource, + CVtImage& aTarget ) = 0; + + protected: + + // Source for scaling + const CVtImage* iSource; // not owned + + // Target image (will hold scaled source) + CVtImage* iTarget; // not owned + + // Selected rotation angle + CVtImageRotator::TRotationAngle iAngle; + }; + +#endif // CVTIMAGEROTATORIMPL_H + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/CVtImageRotatorImplClockwise.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/CVtImageRotatorImplClockwise.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,105 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + + + +#ifndef CVTIMAGEROTATORIMPLCLOCKWISE_H +#define CVTIMAGEROTATORIMPLCLOCKWISE_H + +// INCLUDE FILES + +#include "CVtImageRotatorImpl.h" + +// FORWARD DECLARATIONS + +class CVtImage; + +// CLASS DECLARATIONS + +/** +* Image scaler implementation. +* +* @lib videosource.lib +*/ +class CVtImageRotatorImplClockwise : public CVtImageRotatorImpl + { + public: + /** + * C++ constructor + * @param "aAngle" Selected rotation angle. + */ + CVtImageRotatorImplClockwise( const CVtImageRotator::TRotationAngle& aAngle ); + + /** + * Rotates the image. + * @param "aContinue" When method returns, this parameter will contain + * ETrue if new call is needed (i.e. scaling is not yet finished) or + * EFalse if scaling is complete. + * @return KErrNone or one of the system wide error codes. + */ + TInt Rotate( TBool& aContinue ); + + /** + * Source and target image validation method. + * @param "aSource" Constant reference to source image. + * @param "aTarget" Constant reference to target image. + * @exception If source or target is not valid, this method leaves + * with KErrNotSupported. + */ + void ValidateSourceTargetL( + const CVtImage& aSource, + CVtImage& aTarget ); + + /** + * Method for checking specific rotation angle support. + * @param "aAngle" Rotation type that will be needed. + * @return ETrue if aAngle is one of the supported rotation types + * EFalse otherwise. + */ + TBool SupportsRotationAngle( const CVtImageRotator::TRotationAngle& aAngle ); + + private: + + /** + * The rotation implementation. + */ + void DoRotate(); + + /** + * The rotation implementation for YUV planes. + * @param "aSource" Constant pointer to source plane. + * @param "aTarget" Pointer to target plane. + * @param "aWidth" Width of the plane in pixels. + * @param "aHeight" Height of the plane in pixels. + * @param "aBytesPerRow" Bytes per row in plane. + */ + void RotatePlane( + const TUint8* aSource, + TUint8* aTarget, + TInt aSourceWidth, + TInt aSourceHeight, + TInt aSourceBytesPerRow, + TInt aTargetHeight, + TInt aTargetBytesPerRow ); + }; + +#endif // CVTIMAGEROTATORIMPLCLOCKWISE_H + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/CVtImageRotatorImplMirrorFlip.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/CVtImageRotatorImplMirrorFlip.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,145 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + + + +#ifndef CVTIMAGEROTATORIMPLMIRRORFLIP_H +#define CVTIMAGEROTATORIMPLMIRRORFLIP_H + +// INCLUDE FILES + +#include "CVtImageRotatorImpl.h" + +// FORWARD DECLARATIONS + +class CVtImage; +class CVtImageIYUV; + +// CLASS DECLARATIONS + +/** +* Image scaler implementation. +* +* @lib videosource.lib +*/ +class CVtImageRotatorImplMirrorFlip : public CVtImageRotatorImpl + { + public: + /** + * C++ constructor + * @param "aAngle" Selected rotation angle. + */ + CVtImageRotatorImplMirrorFlip( const CVtImageRotator::TRotationAngle& aAngle ); + + /** + * Rotates the image. + * @param "aContinue" When method returns, this parameter will contain + * ETrue if new call is needed (i.e. scaling is not yet finished) or + * EFalse if scaling is complete. + * @return KErrNone or one of the system wide error codes. + */ + TInt Rotate( TBool& aContinue ); + + /** + * Source and target image validation method. + * @param "aSource" Constant reference to source image. + * @param "aTarget" Constant reference to target image. + * @exception If source or target is not valid, this method leaves + * with KErrNotSupported. + */ + void ValidateSourceTargetL( + const CVtImage& aSource, + CVtImage& aTarget ); + + /** + * Method for checking specific rotation angle support. + * @param "aAngle" Rotation type that will be needed. + * @return ETrue if aAngle is one of the supported rotation types + * EFalse otherwise. + */ + TBool SupportsRotationAngle( const CVtImageRotator::TRotationAngle& aAngle ); + + private: + + /** + * Mirrors image horizontally from iSource to iTarget. + */ + void Mirror(); + + /** + * Mirrors image horizontally from aTarget to aTarget. + */ + void Mirror( CVtImage& aTarget ); + + /** + * Mirrors IYUV image from iSource to iTarget. + */ + void MirrorIYUV + ( + const CVtImageIYUV& aSource, + CVtImageIYUV& aTarget + ); + + /** + * Mirrors one plane of IYUV image from iSource to iTarget. + */ + void MirrorPlane + ( + TUint8* aSource, + TUint8* aTarget, + TInt aWidth, + TInt aHeight, + TInt aBytesPerRow + ); + + /** + * Flips image vertically from iSource to iTarget. + */ + void Flip(); + + /** + * Flips image vertically from aTarget to aTarget. + */ + void Flip( CVtImage& aTarget ); + + /** + * Flips IYUV image vertically from iSource to iTarget. + */ + void FlipIYUV + ( + const CVtImageIYUV& aSource, + CVtImageIYUV& aTarget + ); + + /** + * Flips one plane of IYUV. + */ + void FlipPlane + ( + TUint8* aSource, + TUint8* aTarget, + TInt aHeight, + TInt aBytesPerRow + ); + }; + +#endif // CVTIMAGEROTATORIMPLMIRRORFLIP_H + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/CVtImageScaler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/CVtImageScaler.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,247 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + + + + +#ifndef CVTIMAGESCALER_H +#define CVTIMAGESCALER_H + +// INCLUDE FILES + +#include + +// FORWARD DECLARATIONS + +class CVtImageScalerImpl; +class CVtImage; +class CFbsBitmap; + +// CLASS DECLARATIONS + +/** +* Image scaler observer interface. +* +* @lib videosource.lib +*/ +class MVtImageScalerObserver + { + public: + /** + * Callback method that is called by CVtImageScaler when scaling has + * finished. + * @param "aError" KErrNone if the scaling was done successfully, one + * of the system wide error codes otherwise. + * @return Pointer to newly created instance. + */ + virtual void ScalingFinished( TInt aError ) = 0; + }; + +/** +* Image scaler. +* +* @lib videosource.lib +*/ +class CVtImageScaler : public CActive + { + public: + + /** + * An enumeration within the CVtImageScaler namespace. + * It provides a set of panic codes that may happen during + * scaling process. + */ + enum TPanics + { + /** + * RotateL() is called while previous rotation process + * has not yet been finished. + */ + EBusy = 1 + }; + + /** + * An enumeration within the CVtImageScaler namespace. + * It provides a set of supported scaling quality settings. + */ + enum TQuality + { + /** + * Nearest neigbour algorithm. Fast but poor image quality + * when scale factor exceeds 2x. + */ + ENearest, + + /** + * Weighted average algorithm. Slower than Nearest Neighbour + * but also better image quality when scaling at factor 2x or + * higher. + */ + EWeightedAverage, + + /** + * Bilinear scaling algorithm. Slower than Weighted Average + * but also better image quality. + */ + EBilinear + }; + + public: + + /** + * Creates new instance of CVtImageScaler. + * @param "aObserver" Reference to instance observer. + * @param "aQuality" Scaling quality. If this is omitted, then default + * value of EWeightedAverage is used. + * @param "aPriority" Active object priority. + * @exception In error situation leaves with one of the system wide + * error codes. + * @return Pointer to newly created instance. + */ + IMPORT_C static CVtImageScaler* NewL( + MVtImageScalerObserver& aObserver, + TQuality aQuality = EWeightedAverage, + TPriority aPriority = EPriorityStandard ); + + /** + * C++ destructor. + */ + IMPORT_C ~CVtImageScaler(); + + /** + * Sets scaling quality. + * @param "aQuality" Scaling quality. + * @exception In error situation leaves with one of the system wide + * error codes. + */ + IMPORT_C void SetQualityL( TQuality aQuality ); + + /** + * Scales image to new size. + * @param "aSource" Source image that will be scaled. + * @param "aTarget" Target image that will hold the scaled image. New + * image's dimensions + * will be taken from the size of target image. + * @exception In error situation leaves with one of the system wide + * error codes. + */ + IMPORT_C void ScaleL( const CVtImage& aSource, CVtImage& aTarget ); + + /** + * Scales image to new size. Possible error during initialization is + * returned via MVtImageScalerObserver. + * @param "aSource" Source image that will be scaled. + * @param "aTarget" Target image that will hold the scaled image. New + * image's dimensions will be taken from the size of target image. + */ + IMPORT_C void Scale( const CVtImage& aSource, CVtImage& aTarget ); + + /** + * Scales image to new size. This scale method is synchronous and + * aTarget will contain scaled image of aSource on return. This method + * may leave if aSource and/or aTarget are not suitable for scaling. + * MVtImageScalerObserver::ScalingFinished is not called when this + * method is used. + * @param "aSource" Source image that will be scaled. + * @param "aTarget" Target image that will hold the scaled image. New + * image's dimensions will be taken from the size of target image. + */ + IMPORT_C void ScaleNowL( const CVtImage& aSource, CVtImage& aTarget ); + + private: // internal + + /** + * C++ default constructor. + */ + CVtImageScaler(); + + /** + * C++ constructor. + * @param "aObserver" Reference to observer. + * @param "aPriority" Active object priority. + * @exception In error situation leaves with one of the system wide + * error codes. + */ + CVtImageScaler( MVtImageScalerObserver& aObserver, TPriority aPriority ); + + /** + * Second phase constructor. + * @param "aQuality" Quality of the scaling. + * @exception In error situation leaves with one of the system wide + * error codes. + */ + void ConstructL( TQuality aQuality ); + + /** + * Sets iStatus to KRequestPending and calls CActive::SetActive(). + */ + void Activate(); + + /** + * Signals this instance AO with given error code. + * @param "aError" Signalling error code. + */ + void Signal( TInt aError ); + + private: // from CActive + + /** + * This is defined in CActive. Check CActive for description. + */ + void RunL(); + + /** + * This is defined in CActive. Check CActive for description. + */ + void DoCancel(); + + /** + * Scale method called by the CAsyncCallBack. + */ + static TInt StaticScale( TAny* aPtr ); + + /** + * Scale method called by the StaticScale. + */ + void DoScale(); + + private: + + // Scaling observer + MVtImageScalerObserver& iObserver; + + // Active quality implementation + CVtImageScalerImpl* iScalerImpl; // owned + + // Bitmap that will be used for locking global bitmap heap + CFbsBitmap* iHeapLock; // owned + + // Asynccallback instance + CAsyncCallBack* iAsyncCallBack; // owned + + // This is set to ETrue in DoCancel() method, and when CAsyncCallBack + // gets executed, iCancelled is checked whether scaling should be done + // or not. + TBool iCancelled; + }; + +#endif // CVTIMAGESCALER_H + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/CVtImageScalerImpl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/CVtImageScalerImpl.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,151 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + + + +#ifndef CVTIMAGESCALERIMPL_H +#define CVTIMAGESCALERIMPL_H + +// INCLUDE FILES + +#include +#include + +// FORWARD DECLARATIONS + +class CVtImage; + +// CLASS DECLARATIONS + +/** +* Image scaler implementation. +* +* @lib videosource.lib +*/ +class CVtImageScalerImpl : public CActive + { + protected: + + /** + * Constructor. + */ + CVtImageScalerImpl(); + + public: + + /** + * Destructor. + */ + ~CVtImageScalerImpl(); + + /** + * Sets scaler params. + * @param "aParams" Scaling params, including source and target images. + * @exception In error situation leaves with one of the system wide + * error codes. + */ + void SetSourceTargetL( const CVtImage& aSource, CVtImage& aTarget ); + + /** + * Method to check whether bitmap heap locking is needed or not during + * scaling process. + * @exception In error situation leaves with one of the system wide + * error codes. + * @return ETrue if bitmap heap lock is needed, EFalse otherwise. + */ + TBool NeedHeapLock() const; + + /** + * Pure virtual scaling method. + * @param "aContinue" When method returns, this parameter will contain + * ETrue if new call is needed (i.e. scaling is not yet finished) or + * EFalse if scaling is complete. + * @return KErrNone or one of the system wide error codes. + */ + virtual TInt Scale( TBool& aContinue ) = 0; + + protected: + + /** + * Scales using CBitmapScaler, which is slow but works with any + * Symbian color mode. + * @param aQuality Scaling quality @see CBitmapScaler::TQualityAlgorithm + * @exception In error situation leaves with one of the system wide + * error codes. + */ + void ScaleWithBitmapScalerL( + const CBitmapScaler::TQualityAlgorithm aQuality ); + + private: + + /** + * Pure virtual source and target image validation method. + * @param "aSource" Constant reference to source image. + * @param "aTarget" Constant reference to target image. + * @exception If source or target is not valid, this method leaves + * with KErrNotSupported. + */ + virtual void ValidateSourceTargetL( + const CVtImage& aSource, + CVtImage& aTarget ) = 0; + + /** + * Method for validating image size. + * @param "aSize" Size to be validated. + * @param "aMinSize" Minimum allowed size. If this is not given a default + * size of TSize( 1, 1 ) is used. + * @exception If size is not valid within given parameters, this + * method leaves with KErrNotSupported. + */ + void LeaveIfNotValidSizeL( + const TSize& aSize, + const TSize aMinSize = TSize( 1, 1 ) ); + + private: // from CActive + + /** + * @see CActive::RunL + */ + void RunL(); + + /** + * @see CActive::DoCancel + */ + void DoCancel(); + + protected: + + // Source for scaling + const CVtImage* iSource; // not owned + + // Target image (will hold scaled source) + CVtImage* iTarget; // not owned + + // Bitmap scaler instance + CBitmapScaler* iScaler; + + // Active scheduler waiter object + CActiveSchedulerWait iActiveSchedulerWait; + + }; + +#endif // CVTIMAGESCALERIMPL_H + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/CVtImageScalerImplBilinear.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/CVtImageScalerImplBilinear.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,115 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + + + + +#ifndef CVTIMAGESCALERIMPLBILINEAR_H +#define CVTIMAGESCALERIMPLBILINEAR_H + +// INCLUDE FILES + +#include "CVtImageScalerImpl.h" + +// CLASS DECLARATIONS + +/** +* Bilinear image scaler implementation. +* +* @lib videosource.lib +*/ +class CVtImageScalerImplBilinear : public CVtImageScalerImpl + { + private: // from CVtImageScalerImpl + + /** + * From CVtImageScalerImpl. Check CVtImageScalerImpl for description. + */ + TInt Scale( TBool& aContinue ); + + private: + + /** + * Validate given parameters. + */ + void ValidateSourceTargetL( + const CVtImage& aSource, + CVtImage& aTarget ); + + /** + * Initializes internal variables for scaling. + */ + void Initialize(); + + /** + * Scales images in displaymode EColor4K. + */ + void Scale4K(); + + /** + * Scales images in displaymode EColor64K. + */ + void Scale64K(); + + /** + * Scales images in displaymode EColor16M. + */ + void Scale16M(); + + /** + * Scales images in displaymode EColor16MU. + */ + void Scale16MU(); + + /** + * Scales images in displaymode EColor16MA. + */ + void Scale16MA(); + + /** + * Fast scaling when target is double the source size for + * 4K and 64K display modes. + */ + void Scale2x4K64K( TUint32 aMask ); + + /** + * Fast scaling when target is double the source size for + * 16M display mode. + */ + void Scale2x16M(); + + /** + * Fast scaling when target is double the source size for + * 16MU and 16MA display modes. + */ + void Scale2x16MU16MA(); + + private: + + // Target width ratio to source width + TUint32 iU; + + // Target height ratio to source height + TUint32 iV; + }; + +#endif // CVTIMAGESCALERIMPLBILINEAR_H + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/CVtImageScalerImplNearest.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/CVtImageScalerImplNearest.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,138 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + + + +#ifndef CVTIMAGESCALERIMPLNEAREST_H +#define CVTIMAGESCALERIMPLNEAREST_H + +// INCLUDE FILES + +#include "CVtImageScalerImpl.h" + +// CLASS DECLARATIONS + +/** +* Nearest neigbour image scaling implementation. +* +* @lib videosource.lib +*/ +class CVtImageScalerImplNearest : public CVtImageScalerImpl + { + private: // from CVtImageScalerImpl + + /** + * From CVtImageScalerImpl. Check CVtImageScalerImpl for description. + */ + TInt Scale( TBool& aContinue ); + + private: + + /** + * Validate given parameters. + */ + void ValidateSourceTargetL( + const CVtImage& aSource, + CVtImage& aTarget ); + + /** + * Initializes internal variables for scaling. + */ + void Initialize(); + + /** + * Scales images in displaymode EColor4K. + */ + void Scale4K( + const TUint16* aSrcPtr, + TUint32 aSrcPitch, + TUint16* aTrgPtr, + TUint32 aTrgWidth, + TUint32 aTrgHeight, + TUint32 aDx, + TUint32 aDy ); + + /** + * Scales images in displaymode EColor64K. + */ + void Scale64K( + const TUint16* aSrcPtr, + TUint32 aSrcPitch, + TUint16* aTrgPtr, + TUint32 aTrgWidth, + TUint32 aTrgHeight, + TUint32 aDx, + TUint32 aDy ); + + /** + * Scales images in displaymode EColor16M. + */ + void Scale16M( + const TUint8* aSrcPtr, + TUint32 aSrcPitch, + TUint8* aTrgPtr, + TUint32 aTrgWidth, + TUint32 aTrgHeight, + TUint32 aTrgPitch, + TUint32 aDx, + TUint32 aDy ); + + /** + * Scales images in displaymodes EColor16MU and EColor16MA. + */ + void Scale16MU16MA( + const TUint32* aSrcPtr, + TUint32 aSrcPitch, + TUint32* aTrgPtr, + TUint32 aTrgWidth, + TUint32 aTrgHeight, + TUint32 aDx, + TUint32 aDy ); + + /** + * Fast scaling when target is double the source size for + * 4K and 64K display modes. + */ + void Scale2x4K64K(); + + /** + * Fast scaling when target is double the source size for 16M + * display mode. + */ + void Scale2x16M(); + + /** + * Fast scaling when target is double the source size for 16MU and 16MA + * display modes. + */ + void Scale2x16MU16MA(); + + private: + + // Target width ratio to source width + TUint32 iU; + + // Target height ratio to source height + TUint32 iV; + }; + +#endif // CVTIMAGESCALERIMPLNEAREST_H + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/CVtImageScalerImplWeightedAverage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/CVtImageScalerImplWeightedAverage.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,115 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + + + +#ifndef CVTIMAGESCALERIMPLWEIGHTEDAVERAGE_H +#define CVTIMAGESCALERIMPLWEIGHTEDAVERAGE_H + +// INCLUDE FILES + +#include "CVtImageScalerImpl.h" + +// CLASS DECLARATIONS + +/** +* Weighted average scaler implementation. +* +* @lib videosource.lib +*/ +class CVtImageScalerImplWeightedAverage : public CVtImageScalerImpl + { + private: // from CVtImageScalerImpl + + /** + * From CVtImageScalerImpl. Check CVtImageScalerImpl for description. + */ + TInt Scale( TBool& aContinue ); + + private: // methods + + /** + * Validate given parameters. + */ + void ValidateSourceTargetL( + const CVtImage& aSource, + CVtImage& aTarget ); + + /** + * Initializes internal variables for scaling. + */ + void Initialize(); + + /** + * Scales images in displaymode EColor4K. + */ + void Scale4K(); + + /** + * Scales images in displaymode EColor64K. + */ + void Scale64K(); + + /** + * Scales images in displaymode EColor16M. + */ + void Scale16M(); + + /** + * Scales images in displaymode EColor16MU. + */ + void Scale16MU(); + + /** + * Scales images in displaymode EColor16MA. + */ + void Scale16MA(); + + /** + * Fast scaling when target is double the source size for + * 4K and 64K display modes. + */ + void Scale2x4K64K( TUint32 aMask ); + + /** + * Fast scaling when target is double the source size for + * 16M display mode. + */ + void Scale2x16M(); + + /** + * Fast scaling when target is double the source size for + * 16MU and 16MA display modes. + */ + void Scale2x16MU16MA(); + + private: // data + + // Target width ratio to source width + TUint32 iU; + + // Target height ratio to source height + TUint32 iV; + + }; + +#endif // CVTIMAGESCALERIMPLWEIGHTEDAVERAGE_H + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/CVtImageScalerMacros.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/CVtImageScalerMacros.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,55 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + + + +#ifndef CVTIMAGESCALERMACROS_H +#define CVTIMAGESCALERMACROS_H + +// MACROS + +#define UNPACK_4K_RED( c ) ( 0xf & ( c >> 8 ) ) +#define UNPACK_4K_GREEN( c ) ( 0xf & ( c >> 4 ) ) +#define UNPACK_4K_BLUE( c ) ( 0xf & c ) +#define PACK_4K_BGR( b, g, r ) \ + TUint16( ( b ) | ( ( ( g ) | ( ( r ) << 4 ) ) << 4 ) ) + +#define UNPACK_64K_RED( c ) ( c >> 11 ) +#define UNPACK_64K_GREEN( c ) ( 0x3f & ( c >> 5 ) ) +#define UNPACK_64K_BLUE( c ) ( 0x1f & c ) +#define PACK_64K_BGR( b, g, r ) \ + TUint16( ( b ) | ( ( ( g ) | ( ( r ) << 6 ) ) << 5 ) ) + +#define UNPACK_16MU_RED( c ) ( 0xff & ( c >> 16 ) ) +#define UNPACK_16MU_GREEN( c ) ( 0xff & ( c >> 8 ) ) +#define UNPACK_16MU_BLUE( c ) ( c & 0xff ) +#define PACK_16MU_BGR( b, g, r ) \ + TUint32( ( ( ( ( ( 0xff << 8 ) | ( r ) ) << 8 ) | ( g ) ) << 8 ) | ( b ) ) + +#define UNPACK_16MA_ALPHA( c ) ( 0xff & ( c >> 24 ) ) +#define UNPACK_16MA_RED( c ) ( 0xff & ( c >> 16 ) ) +#define UNPACK_16MA_GREEN( c ) ( 0xff & ( c >> 8 ) ) +#define UNPACK_16MA_BLUE( c ) ( c & 0xff ) +#define PACK_16MA_ABGR( a, b, g, r ) \ + TUint32( ( ( ( ( ( ( a ) << 8 ) | ( r ) ) << 8 ) | ( g ) ) << 8 ) | ( b ) ) + +#endif // CVTIMAGESCALERMACROS_H + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/CVtImageTransformsUids.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/CVtImageTransformsUids.hrh Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,26 @@ +/* +* Copyright (c) 2004 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: Uid definition file for Display Sink subsystem +* +*/ + + + +#ifndef __CVTIMAGETRANSFORMS_HRH__ +#define __CVTIMAGETRANSFORMS_HRH__ + +#define KUidVtImageTransformsLibrary 0x101F8834 +#define KSharedLibraryUidDefine 0x1000008D + +#endif // __CVTIMAGETRANSFORMS_HRH__ \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/DisplaySinkUids.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/DisplaySinkUids.hrh Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,26 @@ +/* +* Copyright (c) 2004 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: Uid definition file for Display Sink subsystem +* +*/ + + + +#ifndef __DISPLAYSINKUIDS_HRH__ +#define __DISPLAYSINKUIDS_HRH__ + +#define KUidDisplaySinkLibrary 0x101F8693 +#define KSharedLibraryUidDefine 0x1000008D + +#endif \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/TDisplaySinkParamsDP.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/TDisplaySinkParamsDP.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,56 @@ +/* +* Copyright (c) 2004 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: DisplaySink subsystem. +* +*/ + + +#ifndef TDISPLAYSINKPARAMSDP_H +#define TDISPLAYSINKPARAMSDP_H + +// INCLUDE FILES + +#include "mdisplaysink.h" +#include + +// CLASS DECLARATION + +/** +* Displaysink initialization parameters for DisplaySink's Display Posting +* implementation. +* +* @lib displaysink.lib +* @since Series 60 3.1 +*/ +NONSHARABLE_CLASS( TDisplaySinkParamsDP ) : public TDisplaySinkParams + { +public: + // Pointer's pointer to first posting buffer that is filled by the + // sink. + CPostingSurface::TPostingBuff** iPostingBuffer1; + + // Pointer's pointer to second posting buffer that is filled by the + // sink. + CPostingSurface::TPostingBuff** iPostingBuffer2; + + // Posting format to be used + CPostingSurface::TPostingFormat iPostingFormat; + + // Frame size in pixels + TSize iFrameSize; + }; + +#endif // TDISPLAYSINKPARAMSDP_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/TDisplaySinkParamsDSA.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/TDisplaySinkParamsDSA.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,63 @@ +/* +* 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: DisplaySink subsystem. +* +*/ + + +#ifndef TDISPLAYSINKPARAMSDSA_H +#define TDISPLAYSINKPARAMSDSA_H + +// INCLUDE FILES + +#include "cvtimagerotator.h" +#include "mdisplaysink.h" + +// CLASS DECLARATION + +/** +* Displaysink initialization parameters for DisplaySink's Direct Screen Access +* implementation. +* +* @lib displaysink.lib +* @since Series 60 3.1 +*/ +NONSHARABLE_CLASS( TDisplaySinkParamsDSA ) : public TDisplaySinkParams + { +public: + + /** + * C++ constructor + */ + TDisplaySinkParamsDSA(); + +public: + // Handle to first bitmap that is filled by the sink. 176x144 bitmap (QCIF) + TInt iBitmap1Handle; + + // Handle to second bitmap that is filled by the sink. 176x144 bitmap (QCIF) + TInt iBitmap2Handle; + + // Angle to which YUV image must be rotated BEFORE it is converted into bitmap. + // If CVtImageRotator::ERotationNone is given, image will be converted as it + // is received. Also make sure that iBitmap1Handle and iBitmap2Handle contains + // correct dimensions AFTER rotation. + CVtImageRotator::TRotationAngle iRotationAngle; + }; + +#include "tdisplaysinkparamsdsa.inl" + +#endif // TDISPLAYSINKPARAMSDSA_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/TDisplaySinkParamsNGA.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/TDisplaySinkParamsNGA.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,59 @@ +/* +* Copyright (c) 2004-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: Displaysink initialization parameters for DisplaySink's NGA implementation. +* +*/ + +#ifndef TDISPLAYSINKPARAMSNGA_H +#define TDISPLAYSINKPARAMSNGA_H + +// INCLUDE FILES + +#include "mdisplaysink.h" +#include +//#include +#include + +// CLASS DECLARATION + +/** +* Displaysink initialization parameters for DisplaySink's NGA +* implementation. +* +* @lib displaysink.lib +* @since Series 60 7.0 +*/ +NONSHARABLE_CLASS( TDisplaySinkParamsNGA ) : public TDisplaySinkParams + { +public: + // Pointer's pointer to first posting buffer that is filled by the + // sink. + TUint8** iSurfaceBuffer1; + //TVideoFrameBuffer** iSurfaceBuffer1; + + // Pointer's pointer to second posting buffer that is filled by the + // sink. + //TVideoFrameBuffer** iSurfaceBuffer2; + TUint8** iSurfaceBuffer2; + + // Posting format to be used + TUidPixelFormat iSurfaceFormat; + + // Frame size in pixels + TSize iFrameSize; + }; + +#endif // TDISPLAYSINKPARAMSNGA_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/VtImageConverterUids.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/VtImageConverterUids.hrh Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,26 @@ +/* +* Copyright (c) 2004 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: Uid definition file for Display Sink subsystem +* +*/ + + + +#ifndef __VTIMAGECONVERTERUIDS_HRH__ +#define __VTIMAGECONVERTERUIDS_HRH__ + +#define KUidVtImageConverterLibrary 0x101F86B5 +#define KSharedLibraryUidDefine 0x1000008D + +#endif // __VTIMAGECONVERTERUIDS_HRH__ \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/cvtimage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/cvtimage.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,175 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + + + +#ifndef CVTIMAGE_H +#define CVTIMAGE_H + +// INCLUDE FILES + +#include +#include + +// CLASS DECLARATIONS + +/** +* Abstract base class for VS images. +* +* @lib videosource.lib +*/ +class CVtImage : public CBase + { + public: + /** + * Enumeration for supported image types. + */ + enum TVtImageType + { + /** + * CFbsBitmap image. + */ + EVtImageBitmap, + + /** + * YUV 420 planar image where all Y samples are found first in memory as an + * array of unsigned char (possibly with a larger stride for memory alignment), + * followed immediately by all Cr (U) samples (with half the stride of the Y + * lines, and half the number of lines), then followed immediately by all Cb + * (V) samples in a similar fashion. + */ + EVtImageIYUV + }; + + /** + * Vt display modes. Used for identifying image's data format. + */ + enum TVtDisplayMode + { + /** + * Unsupported display mode. + */ + EVtColorNone, + + /** + * 4096 colour display mode (12 bpp). + */ + EVtColor4K, + + /** + * 2^16 colour display mode (16 bpp). + */ + EVtColor64K, + + /** + * True colour display mode (24 bpp). + */ + EVtColor16M, + + /** + * True colour display mode (32 bpp). + */ + EVtColor16MU, + + /** + * True colour display mode with alpha (32 bpp). + */ + EVtColor16MA, + + /** + * YUV 420 planar display mode. + */ + EVtColorIYUV + }; + + /** + * Pure virtual function to check whether bitmap heap needs to be locked + * for this image type. + * @return Returns ETrue if bitmap heap lock is required, EFalse + * otherwise. + */ + virtual TBool NeedHeapLock() const = 0; + + /** + * Pure virtual function to get displaymode from image. + * @return Returns image's displaymode. + */ + virtual TVtDisplayMode DisplayMode() const = 0; + + /** + * Pure virtual function to get size of the image in pixels + * @return Returns size of the image in pixels. + */ + virtual TSize Size() const = 0; + + /** + * Pure virtual function to get how many bytes this image has per + * scaline. + * @return Returns number of bytes per scanline. + */ + virtual TInt BytesPerRow() const = 0; + + /** + * Pure virtual function to get pointer to image data. + * @return Returns pointer to image data. + */ + virtual TUint32* DataAddress() const = 0; + + /** + * Pure virtual function to get pointer to image data at defined line. + * If aLine is lower than zero then line zero is returned, also if aLine + * is greater than height of the image minus 1 ( height - 1 ) then line + * number ( height - 1 ) is returned. + * @param "aLine" Number of vertical line for which pointer is wanted. + * @return Returns pointer to the beginning of the requested scanline. + */ + virtual TUint32* LineAddress( TInt aLine ) const = 0; + + /** + * Method for getting image type. + * @return Returns type of the image. + */ + IMPORT_C TVtImageType Type() const; + + public: // static methods + + /** + * Converts given TDisplayMode to corresponding TVtDisplayMode. + * @param "aMode" Display mode as TDisplayMode. + * @return Returns mode as TVtDisplayMode. + */ + static TVtDisplayMode DisplayModeToVtDisplayMode( TDisplayMode aMode ); + + protected: + + /** + * C++ constructor. + */ + CVtImage( TVtImageType aType ); + + private: + + // Type of the image. + TVtImageType iType; + }; + +#endif // CVTIMAGE_H + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/cvtimageconverter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/cvtimageconverter.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,638 @@ +/* +* Copyright (c) 2004 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: Image conversion library for VideoTelephony. +* +*/ + + + + + +#ifndef CVTIMAGECONVERTER_H +#define CVTIMAGECONVERTER_H + +// INCLUDE FILES + +#include +#include + +// CLASS FORWARDS + +class CFbsBitmap; +class CVTYUVFbsBitmapConverter; +class CVSFbsBitmapIYUVConverter; + +// DATA TYPES + +typedef TRgb ( *TVSColorReadFunc ) ( TAny*& ); + +// CLASS DECLARATIONS + +/** +* Base class for all YUV to CFbsBitmap converters. +* +* @lib VTImageConverter.lib +*/ +class CVTYUVFbsBitmapConverter : public CBase + { + public: // Constructors and destructor + + /** + * C++ destructor. + */ + IMPORT_C ~CVTYUVFbsBitmapConverter(); + + public: // New functions + + /** + * Starts image conversion from YUV to CFbsBitmap. + * @exception Can leave with one of the system wide error codes. + */ + IMPORT_C virtual void ProcessL(); + + /** + * Sets size of the source YUV image in pixels. This must be implemented + * in derived classes. + * @param "aSize" Size of source YUV image in pixels. + * @exception Can leave with one of the system wide error codes. + */ + virtual void SetSourceSizeL( const TSize& aSize ) = 0; + + /** + * Sets source YUV image data. This method must be implemented in derived + * classes. + * @param "aSourceData" 8-bit descriptor containing the YUV data. As + * data is referenced and not copied, given reference must be still + * valid when ProcessL() is called. + * @exception Can leave with one of the system wide error codes. + */ + virtual void SetSourceL( const TDesC8& aSourceData ) = 0; + + /** + * Sets size of the source YUV image in pixels and image data. + * This method must be implemented in derived classes. + * @param "aSize" Size of source YUV image in pixels. + * @param "aSourceData" 8-bit descriptor containing the YUV data. + * As data is referenced and not copied, given reference must be still + * valid when ProcessL() is called. + * @exception Can leave with one of the system wide error codes. + */ + virtual void SetSourceL( + const TSize& aSize, + const TDesC8& aSourceData ) = 0; + + /** + * Sets destination bitmap into which conversion will be made. + * @param "aDestinationBitmap" Reference to destination bitmap. + * @exception Can leave with one of the system wide error codes. + */ + IMPORT_C virtual void SetDestinationL( + const CFbsBitmap& aDestinationBitmap ); + + /** + * Sets destination bitmap into which conversion will be made. + * Bitmap is given as handle to existing bitmap. + * @param "aHandle" Handle to existing bitmap. + * @exception Can leave with one of the system wide error codes. + */ + IMPORT_C virtual void SetDestinationL( TInt aHandle ); + + public: // Functions from base classes + + protected: // New functions + + /** + * Updates iY, iU and iV member variables. Must be implemented in + * derived classes. + * @param "aSourceData" 8-bit descriptor to source YUV data. + */ + virtual void SetYUVPtrs( const TDesC8& aSourceData ) = 0; + + /** + * Second phase constructor. + * @param "aBitmapHandle" Handle to destination bitmap. + * @exception Can leave with one of the system wide error codes. + */ + virtual void ConstructL( TInt aBitmapHandle ); + + /** + * Second phase constructor that will be called when destination is + * changed. + * @param "aBitmapHandle" Handle to destination bitmap. + * @exception Can leave with one of the system wide error codes. + */ + virtual void ReConstructL( TInt aBitmapHandle ); + + /** + * Updates internal variables. + * @exception Can leave with one of the system wide error codes. + */ + virtual void SizeUpdateL(); + + /** + * C++ constructor. + * @param "aSourceSize" Source size in pixels. + */ + CVTYUVFbsBitmapConverter( const TSize& aSourceSize ); + + /** + * Returns source size in pixels. + * @return Source size in pixels, as constant reference. + */ + inline const TSize& SourceSize() const; + + /** + * Returns source size in pixels. + * @return Source size in pixels, as reference. + */ + inline TSize& SourceSize(); + + /** + * Returns destination size in pixels. + * @return Destination size in pixels, as constant reference. + */ + inline const TSize& DestinationSize() const; + + /** + * Returns destination size in pixels. + * @return Destination size in pixels, as reference. + */ + inline TSize& DestinationSize(); + + /** + * Main process loop for Color4K mode. This must be implemented in + * derived classes. + * @param "aWriteFunction" Pointer to function that writes one pixel to + * destination. + */ + virtual void DoProcess4K() = 0; + + /** + * Main process loop for Color64K mode. This must be implemented in + * derived classes. + * @param "aWriteFunction" Pointer to function that writes one pixel + * to destination. + */ + virtual void DoProcess64K() = 0; + + /** + * Main process loop for Color16M mode. This must be implemented in + * derived classes. + * @param "aWriteFunction" Pointer to function that writes one pixel + * to destination. + */ + virtual void DoProcess16M() = 0; + + /** + * Main process loop for Color16MU mode. This must be implemented in + * derived classes. + * @param "aWriteFunction" Pointer to function that writes one pixel + * to destination. + */ + virtual void DoProcess16MU16MA() = 0; + + protected: // Functions from base classes + + private: // New functions + + /** + * C++ default constructor. + */ + CVTYUVFbsBitmapConverter(); + + private: // Functions from base classes + + public: // Data + + protected: // Data + + // Table of coefficients for EColor4K + static const TUint8 COFF_TBL_4K[ 80 ]; + + // Table of coefficients for EColor64K + static const TUint8 COFF_TBL_64K[ 220 ]; + + // Table of coefficients for EColor16M + static const TUint8 COFF_TBL_16M[ 528 ]; + + // Source size in pixels. + TSize iSourceSize; + + // Target size in pixels. + TSize iDestinationSize; + + // Pointer to destination bitmap. + CFbsBitmap* iDestination; // owned, duplicate + + // Pointer descriptor that points to Y data of the YUV image. + const TUint8* iY; + + // Pointer descriptor that points to Cr (U) data of the YUV image. + const TUint8* iU; + + // Pointer descriptor that points to Cb (V) data of the YUV image. + const TUint8* iV; + + // Horizontal skip real value. After every pixel this valus is added + // to X index in conversion loop. + TReal32 iVSkipReal; + + // Vertical skip real value. After every pixel this valus is added + // to Y index in conversion loop. + TReal32 iHSkipReal; + + private: // Data + }; + +/** +* Base class for YUV 4:2:0 planar image to CFbsBitmap converters. +* +* @lib VTImageConverter.lib +*/ +class CVTYUVPlanarFbsBitmapConverter : public CVTYUVFbsBitmapConverter + { + public: // New functions + + public: // Functions from base classes + + /** + * Sets size of the source YUV image in pixels. + * @param "aSize" Size of source YUV image in pixels. + * @exception Can leave with one of the system wide error codes. + */ + IMPORT_C void SetSourceSizeL( const TSize& aSize ); + + /** + * Sets source YUV image data. + * @param "aSourceData" 8-bit descriptor containing the YUV data. As + * data is referenced and + * not copied, given reference must be still valid when ProcessL() is + * called. + * @exception Can leave with one of the system wide error codes. + */ + IMPORT_C void SetSourceL( const TDesC8& aSourceData ); + + /** + * Sets size of the source YUV image in pixels and image data. This + * method must be + * implemented in derived classes. + * @param "aSize" Size of source YUV image in pixels. + * @param "aSourceData" 8-bit descriptor containing the YUV data. As + * data is referenced and + * not copied, given reference must be still valid when ProcessL() is + * called. + * @exception Can leave with one of the system wide error codes. + */ + IMPORT_C void SetSourceL( + const TSize& aSize, + const TDesC8& aSourceData ); + + protected: // Constructors and destructor + + /** + * C++ constructor. + * @param "aSourceSize" Source size in pixels. + */ + CVTYUVPlanarFbsBitmapConverter( const TSize& aSourceSize ); + + protected: // New functions + + protected: // Functions from base classes + + /** + * Main process loop for Color4K mode. + * @param "aWriteFunction" Pointer to function that writes one pixel + * to destination. + */ + void DoProcess4K(); + + /** + * Main process loop for Color4K mode when scaling is not required. + * @param "aWriteFunction" Pointer to function that writes one pixel + * to destination. + */ + void DoProcess4KNoScale(); + + /** + * Main process loop for Color64K mode. + * @param "aWriteFunction" Pointer to function that writes one pixel + * to destination. + */ + void DoProcess64K(); + + /** + * Main process loop for Color64K mode when scaling is not required. + * @param "aWriteFunction" Pointer to function that writes one pixel + * to destination. + */ + void DoProcess64KNoScale(); + + /** + * Main process loop for Color16M mode. + * @param "aWriteFunction" Pointer to function that writes one pixel + * to destination. + */ + void DoProcess16M(); + + /** + * Main process loop for Color16M mode when scaling is not required. + * @param "aWriteFunction" Pointer to function that writes one pixel + * to destination. + */ + void DoProcess16MNoScale(); + + /** + * Main process loop for Color16MU and Color16MA modes. + * @param "aWriteFunction" Pointer to function that writes one pixel + * to destination. + */ + void DoProcess16MU16MA(); + + /** + * Main process loop for Color16MU and Color16MA modes when scaling is + * not required. + * @param "aWriteFunction" Pointer to function that writes one pixel + * to destination. + */ + void DoProcess16MU16MANoScale(); + + private: // New functions + + /** + * C++ default constructor. + */ + CVTYUVPlanarFbsBitmapConverter(); + + private: // Functions from base classes + }; + +/** +* FourCC IYUV image to CFbsBitmap converter (see IYUV description below). +* +* All Y samples are found first in memory as an array of unsigned char +* (possibly with a larger stride for memory alignment), followed immediately +* by all Cr (U) samples (with half the stride of the Y lines, and half the +* number of lines), then followed immediately by all Cb (V) samples in a +* similar fashion. +* +* @lib VTImageConverter.lib +*/ +class CVTIYUVFbsBitmapConverter : public CVTYUVPlanarFbsBitmapConverter + { + public: // Constructors and destructor + + /** + * Static factory function to create instance of this class. + * @param "aSourceSize" Size of source image in pixels. + * @param "aDestination" Reference to destination bitmap. + * @exception Can leave with one of the system wide error codes. + * @return Pointer to newly created instance. + */ + IMPORT_C static CVTIYUVFbsBitmapConverter* NewL( + const TSize& aSourceSize, + const CFbsBitmap& aDestination ); + + /** + * Static factory function to create instance of this class. + * @param "aSourceSize" Size of source image in pixels. + * @param "aBitmapHandle" Handle to destination bitmap. + * @exception Can leave with one of the system wide error codes. + * @return Pointer to newly created instance. + */ + IMPORT_C static CVTIYUVFbsBitmapConverter* NewL( + const TSize& aSourceSize, + TInt aBitmapHandle ); + + public: // New functions + + public: // Functions from base classes + + protected: // New functions + + protected: // Functions from base classes + + private: // New functions + + private: // Functions from base classes + + /** + * Updates iY, iU and iV member variables. + * @param "aSourceData" 8-bit descriptor to source YUV data. + */ + void SetYUVPtrs( const TDesC8& aSourceData ); + + private: // Constructors and destructor + + /** + * C++ destructor. + * @param "aSourceSize" Source size in pixels. + */ + CVTIYUVFbsBitmapConverter( const TSize& aSourceSize ); + + /** + * C++ default constructor. + */ + CVTIYUVFbsBitmapConverter(); + }; + +/** +* FourCC YV12 image to CFbsBitmap converter (see YV12 description below). +* +* All Y samples are found first in memory as an array of unsigned char +* (possibly with a larger stride for memory alignment), followed immediately +* by all Cb (V) samples (with half the stride of the Y lines, and half the +* number of lines), then followed immediately by all Cr (U) samples in a +* similar fashion. +* +* @lib VTImageConverter.lib +*/ +class CVTYV12FbsBitmapConverter : public CVTYUVPlanarFbsBitmapConverter + { + public: // Constructors and destructor + /** + * Static factory function to create instance of this class. + * @param "aSourceSize" Size of source image in pixels. + * @param "aDestination" Reference to destination bitmap. + * @exception Can leave with one of the system wide error codes. + * @return Pointer to newly created instance. + */ + IMPORT_C static CVTYV12FbsBitmapConverter* NewL( + const TSize& aSourceSize, + const CFbsBitmap& aDestination ); + + /** + * Static factory function to create instance of this class. + * @param "aSourceSize" Size of source image in pixels. + * @param "aBitmapHandle" Handle to destination bitmap. + * @exception Can leave with one of the system wide error codes. + * @return Pointer to newly created instance. + */ + IMPORT_C static CVTYV12FbsBitmapConverter* NewL( + const TSize& aSourceSize, + TInt aBitmapHandle ); + + public: // New functions + + public: // Functions from base classes + + protected: // New functions + + protected: // Functions from base classes + + private: // New functions + + private: // Functions from base classes + + /** + * Updates iY, iU and iV member variables. + * @param "aSourceData" 8-bit descriptor to source YUV data. + */ + void SetYUVPtrs( const TDesC8& aSourceData ); + + private: // Constructors and destructor + + /** + * C++ destructor. + * @param "aSourceSize" Source size in pixels. + */ + CVTYV12FbsBitmapConverter( const TSize& aSourceSize ); + + /** + * C++ default constructor. + */ + CVTYV12FbsBitmapConverter(); + }; + +/** +* CFbsBitmap to FourCC IYUV image converter (see IYUV description below). +* +* All Y samples are found first in memory as an array of unsigned char +* (possibly with a larger stride for memory alignment), followed immediately +* by all Cr (U) samples (with half the stride of the Y lines, and half the +* number of lines), then followed immediately by all Cb (V) samples in a +* similar fashion. +* +* @lib VTImageConverter.lib +*/ +class CVSFbsBitmapIYUVConverter : public CBase + { + public: // Constructors and destructor + + /** + * Static factory function to create instance of this class. + * @param "aBitmap" Reference to source bitmap. + * @exception Can leave with one of the system wide error codes. + * @return Pointer to newly created instance. + */ + IMPORT_C static CVSFbsBitmapIYUVConverter* NewL( + const CFbsBitmap& aBitmap ); + + /** + * C++ destructor. + */ + IMPORT_C ~CVSFbsBitmapIYUVConverter(); + + public: // New functions + + /** + * Sets new source bitmap. + * @param "aBitmap" Reference to new source bitmap. + */ + IMPORT_C void SetSourceL( const CFbsBitmap& aBitmap ); + + /** + * Starts image conversion from CFbsBitmap to YUV. + * @exception Can leave with one of the system wide error codes. + */ + IMPORT_C void ProcessL(); + + /** + * After successfull ProcessL() call converted YUV image data can be + * fetched using this method. + * @return 8-bit pointer descriptor (constant) to YUV image data. + */ + IMPORT_C TPtrC8 YUVData() const; + + public: // Functions from base classes + + protected: // New functions + + protected: // Functions from base classes + + private: // Constructors and destructor + + /** + * C++ default constructor. + */ + CVSFbsBitmapIYUVConverter(); + + /** + * Second phase constructor. + * @param "aBitmap" Reference to source bitmap. + * @exception Can leave with one of the system wide error codes. + */ + void ConstructL( const CFbsBitmap& aBitmap ); + + private: // New functions + + /** + * Second phase constructor that is called when source is changed. + * @param "aBitmap" Reference to source bitmap. + * @exception Can leave with one of the system wide error codes. + */ + void ReConstructL( const CFbsBitmap& aBitmap ); + + /** + * Main process loop. + * @param "aReadFunction" Pointer to function that reads one pixel from + * source. + */ + void DoProcess( TVSColorReadFunc aReadFunction ); + + private: // Functions from base classes + + public: // Data + + protected: // Data + + private: // Data + + // Destination size in pixels. + TSize iSize; + + // Pointer to source bitmap. + CFbsBitmap* iSource; // owned, duplicate + + // Heap descriptor that contains converted YUV data. + HBufC8* iYUVData; // owned + + // Pointer descriptor that points to Y data of the YUV image. + TPtrC8 iY; + + // Pointer descriptor that points to Cr (U) data of the YUV image. + TPtrC8 iU; + + // Pointer descriptor that points to Cb (V) data of the YUV image. + TPtrC8 iV; + }; + +// INLINE METHODS +#include "cvtimageconverter.inl" + + +#endif // CVTIMAGECONVERTER_H + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/cvtimageconverter.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/cvtimageconverter.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,67 @@ +/* +* Copyright (c) 2004 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: Image conversion library for VideoTelephony. +* +*/ + + + + +#ifndef CVTIMAGECONVERTER_INL +#define CVTIMAGECONVERTER_INL + +// ----------------------------------------------------------------------------- +// CVTYUVFbsBitmapConverter::SourceSize() const +// Returns source size in pixels. +// ----------------------------------------------------------------------------- +// +inline const TSize& CVTYUVFbsBitmapConverter::SourceSize() const + { + return iSourceSize; + } + +// ----------------------------------------------------------------------------- +// CVTYUVFbsBitmapConverter::SourceSize() +// Returns source size in pixels. +// ----------------------------------------------------------------------------- +// +inline TSize& CVTYUVFbsBitmapConverter::SourceSize() + { + return iSourceSize; + } + +// ----------------------------------------------------------------------------- +// CVTYUVFbsBitmapConverter::DestinationSize() const +// Returns destination size in pixels. +// ----------------------------------------------------------------------------- +// +inline const TSize& CVTYUVFbsBitmapConverter::DestinationSize() const + { + return iDestinationSize; + } + +// ----------------------------------------------------------------------------- +// CVTYUVFbsBitmapConverter::DestinationSize() +// Returns destination size in pixels. +// ----------------------------------------------------------------------------- +// +inline TSize& CVTYUVFbsBitmapConverter::DestinationSize() + { + return iDestinationSize; + } + +#endif CVTIMAGECONVERTER_INL + +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/cvtimagerotator.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/cvtimagerotator.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,245 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + + + + +#ifndef CVTIMAGEROTATOR_H +#define CVTIMAGEROTATOR_H + +// INCLUDE FILES + +#include + +// FORWARD DECLARATIONS + +class CVtImage; +class CFbsBitmap; +class CVtImageRotatorImpl; + +// CLASS DECLARATIONS + +/** +* Image rotator observer interface. +* +* @lib videosource.lib +*/ +class MVtImageRotatorObserver + { + public: + /** + * Callback method that is called by CVtImageRotator when rotation + * process has been finished. + * @param "aError" KErrNone if the rotation was done successfully, one + * of the system wide error codes otherwise. + * @return Pointer to newly created instance. + */ + virtual void RotationFinished( TInt aError ) = 0; + }; + +/** +* Image rotator. +* +* @lib videosource.lib +*/ +class CVtImageRotator : public CActive + { + public: + /** + * An enumeration within the CVtImageRotator namespace. + * It provides a set of panic codes that may happen during + * rotation process. + */ + enum TPanics + { + /** + * RotateL() is called while previous rotation process + * has not yet been finished. + */ + EBusy = 1 + }; + + /** + * An enumeration within the CVtImageRotator namespace. + * It provides a set of supported rotation and mirror angles. + */ + enum TRotationAngle + { + /** + * Uninitialized place holder. Giving this rotation angle + * to RotateL() will make RotateL() leave with error code + * KErrNotSupported. + */ + ERotationNone = -1, + + /** + * Rotates image 90 degrees in a clockwise direction. + */ + E90DegreesClockwise, + + /** + * Rotates image 180 degrees in a clockwise direction. + * (flip & mirror) + */ + E180DegreesClockwise, + + /** + * Rotates image 270 degrees in a clockwise direction. + */ + E270DegreesClockwise, + + /** + * Mirrors the bitmap around the horizontal axis. + */ + EMirrorHorizontalAxis, + + /** + * Flips the image around the vertical axis. + */ + EFlipVerticalAxis, + }; + + public: + + /** + * Creates new instance of CVtImageRotator. + * @param "aObserver" Reference to instance observer. + * @param "aPriority" Active object priority. + * @exception In error situation leaves with one of the system wide + * error codes. + * @return Pointer to newly created instance. + */ + IMPORT_C static CVtImageRotator* NewL( + MVtImageRotatorObserver& aObserver, + TPriority aPriority = EPriorityLow ); + + /** + * C++ destructor. + */ + IMPORT_C ~CVtImageRotator(); + + /** + * Rotates image to given angle. + * @param "aSource" Source image that will be rotated. + * @param "aTarget" Target image that will hold the rotated image. + * @param "aAngle" Rotation angle. + * @exception In error situation leaves with one of the system wide + * error codes. + */ + IMPORT_C void RotateL( const CVtImage& aSource, CVtImage& aTarget, + const TRotationAngle& aAngle ); + + /** + * Rotates image to given angle. Possible error during initialization is + * returned via MVtImageRotatorObserver. + * @param "aSource" Source image that will be rotated. + * @param "aTarget" Target image that will hold the rotated image. + * @param "aAngle" Rotation angle. + */ + IMPORT_C void Rotate( const CVtImage& aSource, CVtImage& aTarget, + const TRotationAngle& aAngle ); + + private: // internal + + /** + * C++ default constructor. + */ + CVtImageRotator(); + + /** + * C++ constructor. + * @param "aObserver" Reference to observer. + * @param "aPriority" Active object priority. + * @exception In error situation leaves with one of the system wide + * error codes. + */ + CVtImageRotator( MVtImageRotatorObserver& aObserver, TPriority aPriority ); + + /** + * Second phase constructor. + * @exception In error situation leaves with one of the system wide + * error codes. + */ + void ConstructL(); + + /** + * Creates new instance of rotator implementation if needed. + * @param "aAngle" Used rotation angle. + * @exception In error situation leaves with one of the system wide + * error codes. + */ + void CreateRotatorL( const TRotationAngle& aAngle ); + + /** + * Sets iStatus to KRequestPending and calls CActive::SetActive(). + */ + void Activate(); + + /** + * Signals this instance AO with given error code. + * @param "aError" Signalling error code. + */ + void Signal( TInt aError ); + + private: // from CActive + + /** + * This is defined in CActive. Check CActive for description. + */ + void RunL(); + + /** + * This is defined in CActive. Check CActive for description. + */ + void DoCancel(); + + /** + * Rotate method called by the CAsyncCallBack. + */ + static TInt StaticRotate( TAny* aPtr ); + + /** + * Rotate method called by the StaticScale. + */ + void DoRotate(); + + private: + + // Scaling observer + MVtImageRotatorObserver& iObserver; + + // Bitmap that will be used for locking global bitmap heap + CFbsBitmap* iHeapLock; // owned + + // Rotator implementation + CVtImageRotatorImpl* iRotatorImpl; // owned + + // Asynccallback instance + CAsyncCallBack* iAsyncCallBack; // owned + + // This is set to ETrue in DoCancel() method, and when CAsyncCallBack + // gets executed, iCancelled is checked whether scaling should be done + // or not. + TBool iCancelled; + }; + +#endif // CVTIMAGEROTATOR_H + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/mdisplaysink.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/mdisplaysink.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,199 @@ +/* +* Copyright (c) 2004 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: DisplaySink subsystem. +* +*/ + + +#ifndef MDISPLAYSINK_H +#define MDISPLAYSINK_H + +// INCLUDE FILES + +#include + +// FORWARD DECLARATIONS + +class MVTVideoSink; + +/** +* MDisplaySinkObserver +* +* Sink observer API. Currently only frame size changes are reported using +* this IF. +* +* @lib DisplaySink.lib +*/ +class MDisplaySinkObserver + { +public: + /** + * When incoming video frame size changes, this callback will be called. + * @param "aFrom" Current frame size. + * @param "aTo" New frame size. + * @return KErrNone if successful, one of the system wide error codes + * @exception May leave with one of the system wide error codes. + * otherwise. + */ + virtual void VideoFrameSizeChangedL( + const TSize& aFrom, + const TSize& aTo ) = 0; + }; + +/** +* Input parameters for Display Sink +* +* @lib DisplaySink.lib +*/ +class TDisplaySinkParams + { +public: + + /** + * Enumeration for limiting frame rate. + */ + enum TFrameRateLimit + { + /** Don't limit frame rate (default) */ + EFrameRateLimitNone = 0, + /** Limit frame rate to 1.0 frames per second */ + EFrameRateLimit1_0 = 1000, + /** Limit frame rate to 2.5 frames per second */ + EFrameRateLimit2_5 = 400, + /** Limit frame rate to 5.0 frames per second */ + EFrameRateLimit5_0 = 200, + /** Limit frame rate to 7.5 frames per second */ + EFrameRateLimit7_5 = 133, + /** Limit frame rate to 10.0 frames per second */ + EFrameRateLimit10_0 = 100, + /** Limit frame rate to 12.5 frames per second */ + EFrameRateLimit12_5 = 80, + /** Limit frame rate to 15.0 frames per second */ + EFrameRateLimit15_0 = 67, + }; + + /** + * Flags for selecting correct type sink. + */ + enum TFlags + { + /** Create instance of DSA version of sink */ + EDisplaySinkDSA = ( 1 << 0 ), + /** Create instance of DP version of sink */ + EDisplaySinkDP = ( 1 << 1 ), + /** Create instance of NGA version of sink */ + EDisplaySinkNGA = ( 1 << 2 ) + }; + +public: // Data + + /** + * C++ constructor for initializing some of the variables. + */ + IMPORT_C TDisplaySinkParams(); + + // Thread id that gets notified by sink + TThreadId iThreadId; + + // Pointer to iStatus member of the Active Object to notify after video + // frame is converted + TRequestStatus* iRequestStatusPtr; + + // Pointer to Display Sink observer interface + MDisplaySinkObserver* iObserver; + + // Frame rate limitation + TFrameRateLimit iFrameRateLimit; + + // Sink flags + TUint32 iFlags; + }; + +/** +* MDisplaySink +* +* @lib DisplaySink.lib +*/ +class MDisplaySink + { +public: // data + + // Enumeration for the bitmaps. + enum TBitmapNo + { + EFirstBitmap = 0, + ESecondBitmap + }; + +public: // new methods + + /** + * Deletes instance and frees all memory. + */ + virtual void Destroy() = 0; + + /** + * Mark the bitmap available for use. + * @param "aBitmapNo" One of the enumerated TBitmapNo values. + */ + virtual void SetBitmapAvailable( TBitmapNo aBitmapNo ) = 0; + + /** + * Cancels sink so that it does not convert bitmaps even it receives data. + */ + virtual void Release() = 0; + + /** + * Updates display sink parameters, e.g. when display mode changes. + * @param "aParams" Structure that contains new bitmap handles. + * @param "aUpdated" Reference to boolean variable that will be set to + * ETrue when display sink parameter update has been completed. + * @exception May leave with one of the system wide error codes (e.g. in + * out of memory situaton). + */ + virtual void UpdateSinkParamsL( const TDisplaySinkParams& aParams, + TBool& aUpdated ) = 0; + + /** + * Pauses sending of remote video to VT engine. + */ + virtual void Pause() = 0; + + /** + * Resumes sending of remote video to VT engine. + */ + virtual void Resume() = 0; + + /** + * Operator returns this instance . + */ + virtual operator MVTVideoSink&() = 0; + + /** + * This method is called by the VT engine when engine has finished handling + * of previous frame and is ready to handle a new one. + */ + virtual void NextFrame() = 0; + + }; + +/** +* Creates instance of displaysink. +*/ +IMPORT_C MDisplaySink* CreateSinkL( TDisplaySinkParams& aParams, + const TDesC8& aInitData ); + +#endif // MDISPLAYSINK_H + +// End of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/tdisplaysinkparamsdsa.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/tdisplaysinkparamsdsa.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,32 @@ +/* +* 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: DisplaySink subsystem. +* +*/ + + +#ifndef TDISPLAYSINKPARAMSDSA_INL +#define TDISPLAYSINKPARAMSDSA_INL + +// ====================== TDisplaySinkParamsDSA ========================== + +inline TDisplaySinkParamsDSA::TDisplaySinkParamsDSA() : TDisplaySinkParams() + { + Mem::FillZ( this, sizeof( TDisplaySinkParamsDSA ) ); + iRotationAngle = CVtImageRotator::ERotationNone; + } + +#endif TDISPLAYSINKPARAMSDSA_INL + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/inc/vtyuvconverter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/inc/vtyuvconverter.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,79 @@ +/* +* Copyright (c) 2005-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: YUV format transcoder. +* +*/ + + +#ifndef TVTYUVCONVERTER_H +#define TVTYUVCONVERTER_H + +#include + +/** + * Yuv format transcoder. + * + * Implements conversion between different YUV formats. + * + * @lib VTImageConverter.lib + * @since S60 v3.1 + */ +NONSHARABLE_CLASS( VtYuvConverter ) + { +public: + + /** + * Converts from 4:2:0 planar source image to 4:2:2 interleaved image. + * + * @since S60 v3.1 + * @param aSource Constant descriptor containing source image data. + * @param aSize Size of the image in pixels. + * @param aTarget Modifiable descriptor for target image data. + * @param aStide Number of bytes per scanline in target buffer. + * @return KErrNone if conversion was successful, KErrUnderflow if result + * does not fit in target buffer or KErrArgument if source buffer's size + * does not match with the given source size in pixels. + */ + static TInt ConvertFrom420PlanarTo422Interleaved( + const TDesC8& aSource, + const TSize& aSize, + TDes8& aTarget, + TInt aStride ); + +private: + + /** + * Constructor. + */ + VtYuvConverter(); + + /** + * Copy constructor. + */ + VtYuvConverter( const VtYuvConverter& ); + + /** + * Returns image size in bytes for 420 planar image that has given pixel + * size. + */ + static TInt ByteSize420Planar( const TSize& aSizeInPixels ); + + /** + * Returns image size in bytes for 422 interleaved image that has given + * pixel size. + */ + static TInt ByteSize422Interleaved( const TSize& aSizeInPixels ); + }; + +#endif // TVTYUVCONVERTER_H diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/rom/DisplaySink.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/rom/DisplaySink.iby Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2004-2007 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: +* IBY file for DisplaySink +* +* +*/ + + +#ifndef __DISPLAYSINK_IBY__ +#define __DISPLAYSINK_IBY__ + +#ifdef __CS_VIDEO_TELEPHONY + +file=ABI_DIR\BUILD_DIR\VTImageConverter.dll SHARED_LIB_DIR\VTImageConverter.dll +file=ABI_DIR\BUILD_DIR\DisplaySink.dll SHARED_LIB_DIR\DisplaySink.dll +file=ABI_DIR\BUILD_DIR\VtImageTransforms.dll SHARED_LIB_DIR\VtImageTransforms.dll +data=ZSYSTEM\install\displaysink_stub.sis system\install\displaysink_stub.sis + +#endif + +#endif //__DISPLAYSINK_IBY__ diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/src/CDisplaySink.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/src/CDisplaySink.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,1029 @@ +/* +* 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: Display Sink subsystem. +* +*/ + + +// INCLUDE FILES + +#include "CDisplaySink.h" +#include "CDisplaySinkDP.h" +#include "CDisplaySinkDSA.h" +#include "CDisplaySinkNGA.h" +#include +#include + +// CONSTANTS + +// MACROS + +#ifdef _DEBUG + #include + #define PRINT RDebug::Print + #define _IFDBG(a) a +#else + #define PRINT + #define _IFDBG(a) +#endif + +// ============================ MEMBER FUNCTIONS =============================== + +// ============================= CVtFrameQueue ================================= + +// ----------------------------------------------------------------------------- +// CVtFrameQueue::CVtFrameQueue +// ----------------------------------------------------------------------------- +// +CVtFrameQueue::CVtFrameQueue() : CActive( EPriorityNormal ) + { + _IFDBG(PRINT( _L( "CVtFrameQueue::CVtFrameQueue<" ) )); + _IFDBG(PRINT( _L( "CVtFrameQueue::CVtFrameQueue>" ) )); + } + +// ----------------------------------------------------------------------------- +// CVtFrameQueue::ThreadLogon +// ----------------------------------------------------------------------------- +// +TInt CVtFrameQueue::ThreadLogon() + { + _IFDBG(PRINT( _L( "CVtFrameQueue::ThreadLogon<" ) )); + if ( !IsAdded() ) + { + CActiveScheduler::Add( this ); + } + TInt result( iThread.Open( RThread().Id() ) ); + _IFDBG(PRINT( _L( "CVtFrameQueue::ThreadLogon %d >" ), result )); + return result; + } + +// ----------------------------------------------------------------------------- +// CVtFrameQueue::SinkStoppedL +// ----------------------------------------------------------------------------- +// +void CVtFrameQueue::SinkStoppedL() + { + _IFDBG(PRINT( _L( "CVtFrameQueue::SinkStoppedL<" ) )); + DoReleaseBufferL( iBuffer ); + DoReleaseBufferL( iReleaseBuffer ); + _IFDBG(PRINT( _L( "CVtFrameQueue::SinkStoppedL>" ) )); + } + +// ----------------------------------------------------------------------------- +// CVtFrameQueue::ThreadLogoff +// ----------------------------------------------------------------------------- +// +void CVtFrameQueue::ThreadLogoff() + { + _IFDBG(PRINT( _L( "CVtFrameQueue::ThreadLogoff<" ) )); + if ( IsAdded() ) + { + Deque(); + } + _IFDBG(PRINT( _L( "CVtFrameQueue::ThreadLogoff>" ) )); + } + +// ----------------------------------------------------------------------------- +// CVtFrameQueue::Store +// ----------------------------------------------------------------------------- +// +void CVtFrameQueue::Store( MVTVideoSource& aSupplier, + CMMFDataBuffer* aBuffer, + TSize aFrameSize, + TPtr8& aPtr ) + { + _IFDBG(PRINT( _L( "CVtFrameQueue::Store<" ) )); + iSupplier = &aSupplier; + iBuffer = aBuffer; + iFrameSize = aFrameSize; + iPtr = &aPtr; + _IFDBG(PRINT( _L( "CVtFrameQueue::Store>" ) )); + } + +// ----------------------------------------------------------------------------- +// CVtFrameQueue::IsStored +// ----------------------------------------------------------------------------- +// +TBool CVtFrameQueue::IsStored() const + { + _IFDBG(PRINT( _L( "CVtFrameQueue::IsStored<" ) )); + _IFDBG(PRINT( _L( "CVtFrameQueue::IsStored %d>" ), + ( iBuffer != NULL ) )); + return ( iBuffer != NULL ); + } + +// ----------------------------------------------------------------------------- +// CVtFrameQueue::Buffer +// ----------------------------------------------------------------------------- +// +TVtMMFDataBuffer CVtFrameQueue::Buffer() + { + _IFDBG(PRINT( _L( "CVtFrameQueue::Buffer<" ) )); + _IFDBG(PRINT( _L( "CVtFrameQueue::Buffer %d>" ), + reinterpret_cast< TUint >( iBuffer ) )); + return TVtMMFDataBuffer(iBuffer, iFrameSize, *iPtr); + } + +// ----------------------------------------------------------------------------- +// CVtFrameQueue::Release +// ----------------------------------------------------------------------------- +// +void CVtFrameQueue::Release() + { + _IFDBG(PRINT( _L( "CVtFrameQueue::Release<" ) )); + if ( !IsActive() && IsStored() ) + { + iReleaseBuffer = iBuffer; + iBuffer = NULL; + iStatus = KRequestPending; + TRequestStatus* pStatus = &iStatus; + SetActive(); + iThread.RequestComplete( pStatus, KErrNone ); + _IFDBG(PRINT( _L( "CVtFrameQueue::Release -done-" ) )); + } + _IFDBG(PRINT( _L( "CVtFrameQueue::Release>" ) )); + } + +// ----------------------------------------------------------------------------- +// CVtFrameQueue::RunL +// ----------------------------------------------------------------------------- +// +void CVtFrameQueue::RunL() + { + _IFDBG(PRINT( _L( "CVtFrameQueue::RunL<" ) )); + DoReleaseBufferL( iReleaseBuffer ); + _IFDBG(PRINT( _L( "CVtFrameQueue::RunL>" ) )); + } + +// ----------------------------------------------------------------------------- +// CVtFrameQueue::DoReleaseBufferL +// ----------------------------------------------------------------------------- +// +void CVtFrameQueue::DoReleaseBufferL( CMMFDataBuffer*& aBuffer ) + { + _IFDBG(PRINT( _L( "CVtFrameQueue::DoReleaseBufferL<" ) )); + if ( aBuffer && iSupplier ) + { + iSupplier->BufferEmptiedL( aBuffer ); + aBuffer = NULL; + } + _IFDBG(PRINT( _L( "CVtFrameQueue::DoReleaseBufferL>" ) )); + } + +// ----------------------------------------------------------------------------- +// CVtFrameQueue::DoCancel +// ----------------------------------------------------------------------------- +// +void CVtFrameQueue::DoCancel() + { + // nothing to do + } + +// ============================ CVtCallback ================================= + +// ----------------------------------------------------------------------------- +// CVtCallback::CVtCallback( MDisplaySinkObserver& aObserver ) +// ----------------------------------------------------------------------------- +// +CVtCallback::CVtCallback( MDisplaySinkObserver& aObserver ) +: CActive( EPriorityStandard ), iObserver( &aObserver ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CVtCallback::CVtCallback()<"), RThread().Id().operator TUint())); + CActiveScheduler::Add( this ); + iOwnThreadId = RThread().Id(); + _IFDBG(PRINT(_L("VideoSource[%d]: CVtCallback::CVtCallback()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVtCallback::~CVtCallback() +// ----------------------------------------------------------------------------- +// +CVtCallback::~CVtCallback() + { + Cancel(); + } + +// ----------------------------------------------------------------------------- +// CVtCallback::VideoFrameSizeChangedL( const TSize& aFrom, const TSize& aTo ) +// ----------------------------------------------------------------------------- +// +void CVtCallback::VideoFrameSizeChangedL( const TSize& aFrom, const TSize& aTo ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CVtCallback::VideoFrameSizeChangedL()<"), RThread().Id().operator TUint())); + iCallBackType = EVideoFrameSizeChanged; + iFrom = aFrom; + iTo = aTo; + IssueCallbackL(); + _IFDBG(PRINT(_L("VideoSource[%d]: CVtCallback::VideoFrameSizeChangedL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVtCallback::Result() const +// ----------------------------------------------------------------------------- +// +TInt CVtCallback::Result() const + { + _IFDBG(PRINT(_L("VideoSource[%d]: CVtCallback::Result()<"), RThread().Id().operator TUint())); + _IFDBG(PRINT(_L("VideoSource[%d]: CVtCallback::Result()>"), RThread().Id().operator TUint())); + return iResult; + } + +// ----------------------------------------------------------------------------- +// CVtCallback::Completed() const +// ----------------------------------------------------------------------------- +// +TBool CVtCallback::Completed() const + { + _IFDBG(PRINT(_L("VideoSource[%d]: CVtCallback::Completed()<"), RThread().Id().operator TUint())); + _IFDBG(PRINT(_L("VideoSource[%d]: CVtCallback::Completed()>"), RThread().Id().operator TUint())); + return iCompleted; + } + +// ----------------------------------------------------------------------------- +// CVtCallback::IssueCallbackL() +// ----------------------------------------------------------------------------- +// +void CVtCallback::IssueCallbackL() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CVtCallback::IssueCallbackL()<"), RThread().Id().operator TUint())); + iCompleted = EFalse; + TRequestStatus* pStatus = &iStatus; + RThread thread; + if( thread.Id() == iOwnThreadId ) + { + SetActive(); + User::RequestComplete( pStatus, KErrNone ); + } + else + { + User::LeaveIfError( thread.Open( iOwnThreadId ) ); + SetActive(); + *pStatus = KRequestPending; + thread.RequestComplete( pStatus, KErrNone ); + thread.Close(); + } + _IFDBG(PRINT(_L("VideoSource[%d]: CVtCallback::IssueCallbackL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVtCallback::RunL() +// ----------------------------------------------------------------------------- +// +void CVtCallback::RunL() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CVtCallback::RunL()<"), RThread().Id().operator TUint())); + + iResult = KErrNone; + + switch( iCallBackType ) + { + case EVideoFrameSizeChanged: + iObserver->VideoFrameSizeChangedL( iFrom, iTo ); + break; + + default: + User::Leave( KErrArgument ); + } + + iCompleted = ETrue; + + _IFDBG(PRINT(_L("VideoSource[%d]: CVtCallback::RunL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVtCallback::DoCancel() +// ----------------------------------------------------------------------------- +// +void CVtCallback::DoCancel() + { + // do nothing! + } + +// ----------------------------------------------------------------------------- +// CVtCallback::RunError( TInt aError ) +// ----------------------------------------------------------------------------- +// +TInt CVtCallback::RunError( TInt aError ) + { + iCompleted = ETrue; + iResult = aError; + return KErrNone; + } + +// ========================== TDisplaySinkParams =============================== + +// ----------------------------------------------------------------------------- +// TDisplaySinkParams::TDisplaySinkParams +// ----------------------------------------------------------------------------- +// +EXPORT_C TDisplaySinkParams::TDisplaySinkParams() : + iFrameRateLimit( EFrameRateLimitNone ) + { + } + + +// ============================ CDisplaySink =================================== + +// ----------------------------------------------------------------------------- +// CDisplaySink::~CDisplaySink +// ----------------------------------------------------------------------------- +// +CDisplaySink::~CDisplaySink() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::~CDisplaySink()<"), RThread().Id().operator TUint())); + delete iVideoFrameQueue; + iBitmapCS.Close(); + delete iVTSignaller; + iVTMimeTypes.Reset(); + iVTMimeTypes.Close(); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::~CDisplaySink()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::ConstructL +// ----------------------------------------------------------------------------- +// +void CDisplaySink::ConstructL( TDisplaySinkParams& aParams, + const TDesC8& aInitData ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::ConstructL()<"), RThread().Id().operator TUint())); + iDSFlags = aParams.iFlags; + iYuv420PlanarDesc.Delete( 0, iYuv420PlanarDesc.Length() ); + iYuv420PlanarDesc.Append( KVtVideoMIMETypeYUV420 ); + User::LeaveIfError( iVTMimeTypes.Append( &iYuv420PlanarDesc ) ); + iVideoFrameQueue = new ( ELeave ) CVtFrameQueue(); + iVTSignaller = new ( ELeave ) CVtCallback( *aParams.iObserver ); + BitmapEntry( EFirstBitmap ).iIsFree = EFalse; + BitmapEntry( ESecondBitmap ).iIsFree = EFalse; + iThreadId = aParams.iThreadId; + iRequestStatusPtr = aParams.iRequestStatusPtr; + iFrameSize = QCIF; + SetFrameRateLimit( aParams.iFrameRateLimit ); + User::LeaveIfError( iBitmapCS.CreateLocal() ); + BaseConstructL( aParams, aInitData ); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::ConstructL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::Destroy +// ----------------------------------------------------------------------------- +// +void CDisplaySink::Destroy() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::Destroy()<"), RThread().Id().operator TUint())); + delete this; + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::Destroy()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::SetBitmapAvailable( TBitmapNo aBitmapNo ) +// ----------------------------------------------------------------------------- +// +void CDisplaySink::SetBitmapAvailable( TBitmapNo aBitmapNo ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SetBitmapAvailable()<"), RThread().Id().operator TUint())); + iBitmapCS.Wait(); + BitmapEntry( aBitmapNo ).iIsFree = ETrue; + BaseSetBitmapAvailable( aBitmapNo ); + iBitmapCS.Signal(); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SetBitmapAvailable()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::Release +// ----------------------------------------------------------------------------- +// +void CDisplaySink::Release() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::Release()<"), RThread().Id().operator TUint())); + iBitmapCS.Wait(); + if( !iReleased ) + { + iReleased = ETrue; + if( iRequestStatusPtr != NULL && + (*iRequestStatusPtr) == KRequestPending ) + { + RThread thread; + TInt err = thread.Open( iThreadId ); + if( err == KErrNone ) + { + *iRequestStatusPtr = KRequestPending; + TRequestStatus* statusP = iRequestStatusPtr; + thread.RequestComplete( statusP, KErrCancel ); + thread.Close(); + } + } + } + iVideoFrameQueue->Release(); + iBitmapCS.Signal(); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::Release()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::UpdateSinkParamsL( const TDisplaySinkParams& aParams, +// TBool& aUpdated ) +// ----------------------------------------------------------------------------- +// +void CDisplaySink::UpdateSinkParamsL( + const TDisplaySinkParams& aParams, TBool& aUpdated ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::UpdateSinkParamsL()<"), RThread().Id().operator TUint())); + // This modification was requested by the VT engine team + iReleased = EFalse; + // This modification was requested by the VT engine team + iBitmapCS.Wait(); + BaseUpdateSinkParamsL( aParams ); + aUpdated = EFalse; + iParamsUpdated = &aUpdated; + iDSFlags = aParams.iFlags; + BitmapEntry( EFirstBitmap ).iIsFree = EFalse; + BitmapEntry( ESecondBitmap ).iIsFree = EFalse; + iVideoFrameQueue->Release(); + iBitmapCS.Signal(); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::UpdateSinkParamsL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::Pause() +// ----------------------------------------------------------------------------- +// +void CDisplaySink::Pause() + { + iBitmapCS.Wait(); + iPaused = ETrue; + iVideoFrameQueue->Release(); + iBitmapCS.Signal(); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::Resume() +// ----------------------------------------------------------------------------- +// +void CDisplaySink::Resume() + { + iBitmapCS.Wait(); + iPaused = EFalse; + iBitmapCS.Signal(); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::operator MVTVideoSink&() +// ----------------------------------------------------------------------------- +// +CDisplaySink::operator MVTVideoSink&() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::operator MVTVideoSink&()<"), RThread().Id().operator TUint())); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::operator MVTVideoSink&()>"), RThread().Id().operator TUint())); + return *this; + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::NextFrame +// ----------------------------------------------------------------------------- +// +void CDisplaySink::NextFrame() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::NextFrame()<"), RThread().Id().operator TUint())); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::NextFrame()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::GetMultimediaTypesL() const +// ----------------------------------------------------------------------------- +// +const RArray& CDisplaySink::GetMultimediaTypesL() const + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::GetMultimediaTypeL()<"), RThread().Id().operator TUint())); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::GetMultimediaTypeL()>"), RThread().Id().operator TUint())); + return iVTMimeTypes; + } + + + +// ----------------------------------------------------------------------------- +// CDisplaySink::SetFormatL +// ----------------------------------------------------------------------------- +// +void CDisplaySink::SetFormatL( const TDesC8& aFormat ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SetFormatL()<"), RThread().Id().operator TUint())); + if ( aFormat != KVtVideoMIMETypeYUV420 ) + { + User::Leave( KErrNotSupported ); + } + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SetFormatL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::SetVideoFrameSizeL +// ----------------------------------------------------------------------------- +// +void CDisplaySink::SetVideoFrameSizeL( const TSize& aSize ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SetVideoFrameSizeL()<"), RThread().Id().operator TUint())); + if ( iInitFlags & ESinkThreadLogonCalled ) + { + SinkThreadLogonL(); + } + if ( iInitFlags & EFbsSessionConnected ) + { + TSize size( aSize ); + BaseSetVideoFrameSizeL( aSize ); + iFrameSize = aSize; + } + else + { + User::Leave( KErrNotReady ); + } + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SetVideoFrameSizeL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::GetVideoFrameSizeL +// ----------------------------------------------------------------------------- +// +void CDisplaySink::GetVideoFrameSizeL( TSize& aSize ) const + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::GetVideoFrameSizeL()<"), RThread().Id().operator TUint())); + aSize = iFrameSize; + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::GetVideoFrameSizeL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::EmptyBufferL +// ----------------------------------------------------------------------------- +// +void CDisplaySink::EmptyBufferL( + TVtMMFDataBuffer aDataBuffer, + MVTVideoSource* aSupplier, + TMediaId /*aMediaId*/ ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::EmptyBufferL()<"), RThread().Id().operator TUint())); + if ( aDataBuffer.GetMMFBuffer() == NULL || aSupplier == NULL ) + { + User::Leave( KErrArgument ); + } + if ( iReleased ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::EmptyBufferL(): sink released, just return buffer"), RThread().Id().operator TUint())); + aSupplier->BufferEmptiedL( aDataBuffer.GetMMFBuffer() ); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::EmptyBufferL()>"), RThread().Id().operator TUint())); + return; + } + else if ( iInitFlags & ESinkThreadLogonCalled ) + { + TRAPD( result, SinkThreadLogonL() ); + if ( result != KErrNone ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::EmptyBufferL(): SinkThreadLogonL failed %d"), RThread().Id().operator TUint(), result)); + aSupplier->BufferEmptiedL( aDataBuffer.GetMMFBuffer() ); + User::Leave( result ); + } + } + if ( aDataBuffer.GetMMFBuffer()->Type() != KVTUidYUVFrameBuffer ) + { + User::Leave( KErrArgument ); + } + if ( iState != EPlaying ) + { + User::Leave( KErrNotReady ); + } + iBitmapCS.Wait(); + + CleanupSignalPushL( iBitmapCS ); + iBuffer = aDataBuffer.GetMMFBuffer(); + iSupplier = aSupplier; + if ( IsOkToSendFrame() ) + { + // Waiting for frame size update? + if ( iWaitingForUpdate ) + { + // Update completed? + if ( iVTSignaller->Completed() ) + { + // YES: If it failed then Leave + if ( iVTSignaller->Result() != KErrNone ) + { + iSupplier->BufferEmptiedL( iBuffer ); + User::Leave( iVTSignaller->Result() ); + } + } + else + { + // NO: Report buffer emptied and return + iSupplier->BufferEmptiedL( iBuffer ); + CleanupStack::PopAndDestroy(); // iBitmapCS.Signal(); + return; + } + } + + // Is param update pending? + if ( iParamsUpdated ) + { + // YES: set new params + BaseDoUpdateParamsL(); + *iParamsUpdated = ETrue; + iParamsUpdated = 0; + iWaitingForUpdate = EFalse; + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::EmptyBufferL(): params update finished"), RThread().Id().operator TUint())); + } + + // Update YUV data descriptor size based on resolution info. + TSize size( aDataBuffer.GetFrameSize() ); + TInt length( ( size.iWidth * size.iHeight * 12 ) / 8 ); + aDataBuffer.Data().Set( const_cast( aDataBuffer.Data().Ptr() ), length, length ); + // Expected frame size same as received size? + if ( !BaseSizesMatch( size ) ) + { + if ( !iWaitingForUpdate ) + { + iVTSignaller->VideoFrameSizeChangedL( iExpectedFrameSize, + aDataBuffer.GetFrameSize() ); + BaseVideoFrameSizeChangedL( aDataBuffer.GetFrameSize() ); + iWaitingForUpdate = ETrue; + } + CleanupStack::PopAndDestroy(); // iBitmapCS.Signal(); + iSupplier->BufferEmptiedL( iBuffer ); + return; + } + // All validation done, now it is ok to do implementation specific + // empty buffer. + BaseEmptyBufferL( aDataBuffer ); + +// debugging +// debugging +// debugging + + //iFC.PrintStatus(); + +// debugging +// debugging +// debugging + + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::EmptyBufferL()>"), RThread().Id().operator TUint())); + // No CleanupStack::PopAndDestroy() here, because cleanup is done in + // BaseEmptyBufferL(). Reason behind this decission is that certain + // things have to be handled either before or after cleanup and thus + // single cleanup here is not enough. + return; + } + else + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::EmptyBufferL(): dropping frame %d < %d"), RThread().Id().operator TUint(), iMilliSecondsSinceLastFrame, iFrameRateInterval )); + iSupplier->BufferEmptiedL( iBuffer ); + } + CleanupStack::PopAndDestroy(); // iBitmapCS.Signal() + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::EmptyBufferL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::BufferFilledL +// ----------------------------------------------------------------------------- +// +void CDisplaySink::BufferFilledL( CMMFBuffer* /*aBuffer*/ ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::BufferFilledL()<"), RThread().Id().operator TUint())); + User::Leave( KErrNotSupported ); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::BufferFilledL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::CanCreateSinkBuffer +// ----------------------------------------------------------------------------- +// +TBool CDisplaySink::CanCreateSinkBuffer() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::CanCreateSinkBuffer()<"), RThread().Id().operator TUint())); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::CanCreateSinkBuffer()>"), RThread().Id().operator TUint())); + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::CreateSinkBufferL +// ----------------------------------------------------------------------------- +// +CMMFBuffer* CDisplaySink::CreateSinkBufferL( + TMediaId /*aMediaId*/, + TBool& /*aReference*/ ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::CreateSinkBufferL()<"), RThread().Id().operator TUint())); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::CreateSinkBufferL()>"), RThread().Id().operator TUint())); + return NULL; + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::SinkThreadLogon +// ----------------------------------------------------------------------------- +// +TInt CDisplaySink::SinkThreadLogon( MAsyncEventHandler& /*aEventHandler*/ ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SinkThreadLogon()<"), RThread().Id().operator TUint())); + iInitFlags |= ESinkThreadLogonCalled; + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SinkThreadLogon()>"), RThread().Id().operator TUint())); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::SinkThreadLogonL +// ----------------------------------------------------------------------------- +// +void CDisplaySink::SinkThreadLogonL() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SinkThreadLogonL()<"), RThread().Id().operator TUint())); + TInt result( FbsStartup() ); + if ( result == KErrNone ) + { + CleanupStack::PushL( TCleanupItem( &SinkThreadLogonCleanup, this ) ); + FbsConnectL(); + ThreadOpenL(); + User::LeaveIfError( iVideoFrameQueue->ThreadLogon() ); + BaseSinkThreadLogonL(); + iInitFlags &= ~ESinkThreadLogonCalled; + CleanupStack::Pop(); // TCleanupItem( &SinkThreadLogonCleanup, this ) + } + User::LeaveIfError( result ); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SinkThreadLogonL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::SinkThreadLogoff +// ----------------------------------------------------------------------------- +// +void CDisplaySink::SinkThreadLogoff() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SinkThreadLogoff()<"), RThread().Id().operator TUint())); + BaseSinkThreadLogoff(); + iVideoFrameQueue->ThreadLogoff(); + ThreadClose(); + FbsDisconnect(); + iInitFlags = 0; + iExpectedFrameSize = TSize(); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SinkThreadLogoff()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::SinkPrimeL +// ----------------------------------------------------------------------------- +// +TInt CDisplaySink::SinkPrimeL() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SinkPrimeL()<"), RThread().Id().operator TUint())); + if ( iState != EStopped ) + { + return KErrNone; + } + iState = EPrimed; + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SinkPrimeL()>"), RThread().Id().operator TUint())); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::SinkPlayL +// ----------------------------------------------------------------------------- +// +TInt CDisplaySink::SinkPlayL() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SinkPlayL()<"), RThread().Id().operator TUint())); + if ( iState != EPrimed ) + { + User::Leave( KErrNotReady ); + } + ResetFrameRateLimitter(); + iState = EPlaying; + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SinkPlayL()>"), RThread().Id().operator TUint())); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::SinkPauseL +// ----------------------------------------------------------------------------- +// +TInt CDisplaySink::SinkPauseL() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SinkPauseL()<"), RThread().Id().operator TUint())); + if ( iState != EPlaying ) + { + return KErrNone; + } + iState = EPrimed; + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SinkPauseL()>"), RThread().Id().operator TUint())); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::SinkStopL +// ----------------------------------------------------------------------------- +// +TInt CDisplaySink::SinkStopL() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SinkStopL()<"), RThread().Id().operator TUint())); + if ( iState == EStopped ) + { + return KErrNone; + } + iBitmapCS.Wait(); + iVideoFrameQueue->SinkStoppedL(); + iBitmapCS.Signal(); + iState = EStopped; + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SinkStopL()>"), RThread().Id().operator TUint())); + return KErrNone; + } + + +// ----------------------------------------------------------------------------- +// CDisplaySink::CDisplaySink +// ----------------------------------------------------------------------------- +// +CDisplaySink::CDisplaySink() : MVTVideoSink( KNullUid ), + iSinkFourCC( 0 ), iState( EStopped ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::Ctor()<"), RThread().Id().operator TUint())); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::Ctor()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::SetFrameRateLimit( +// TDisplaySinkParams::TFrameRateLimit aFrameRateLimit ) +// ----------------------------------------------------------------------------- +// +void CDisplaySink::SetFrameRateLimit( + TDisplaySinkParams::TFrameRateLimit aFrameRateLimit ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SetFrameRateLimit()<"), RThread().Id().operator TUint())); + iFrameRateInterval = TInt( aFrameRateLimit ); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SetFrameRateLimit()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::ResetFrameRateLimitter() +// ----------------------------------------------------------------------------- +// +void CDisplaySink::ResetFrameRateLimitter() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::ResetFrameRateLimitter()<"), RThread().Id().operator TUint())); + iMilliSecondsSinceLastFrame = 0; + iLastFrameTime = Time::NullTTime(); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::ResetFrameRateLimitter()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::BufferFilledL +// ----------------------------------------------------------------------------- +// +TBool CDisplaySink::IsOkToSendFrame() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::IsOkToSendFrame()<"), RThread().Id().operator TUint())); + TBool isOkToSendFrame( EFalse ); + if( iPaused ) + { + // nothing to do here because okToSendFrame defaults to EFalse + } + else if( iFrameRateInterval == TDisplaySinkParams::EFrameRateLimitNone ) + { + // If no limitation is set -> send frame + isOkToSendFrame = ETrue; + } + else if( iLastFrameTime == Time::NullTTime() ) + { + // EmptyBufferL() is being called the first time after SinkPlayL() -> + // send frame + iLastFrameTime.HomeTime(); + isOkToSendFrame = ETrue; + } + else + { + // Check if enough time has passed since previous frame sent + TTime now; + now.HomeTime(); + TTimeIntervalMicroSeconds interval( + now.MicroSecondsFrom( iLastFrameTime ) ); + iMilliSecondsSinceLastFrame += I64INT( interval.Int64() ) / 1000; + iLastFrameTime = now; + if( iMilliSecondsSinceLastFrame >= iFrameRateInterval ) + { + // Enough time passed -> send frame + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::IsOkToSendFrame(): sending frame %d >= %d"), RThread().Id().operator TUint(), iMilliSecondsSinceLastFrame, iFrameRateInterval )); + isOkToSendFrame = ETrue; + while( iMilliSecondsSinceLastFrame >= iFrameRateInterval ) + { + iMilliSecondsSinceLastFrame -= iFrameRateInterval; + } + } + } + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::IsOkToSendFrame() %d>"), RThread().Id().operator TUint(), isOkToSendFrame)); + return isOkToSendFrame; + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::FbsConnectL +// ----------------------------------------------------------------------------- +// +void CDisplaySink::FbsConnectL() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::FbsConnectL()<"), RThread().Id().operator TUint())); + if ( !( iInitFlags & EFbsSessionConnected ) ) + { + User::LeaveIfError( RFbsSession::Connect() ); + iInitFlags |= EFbsSessionConnected; + } + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::FbsConnectL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::ThreadOpenL +// ----------------------------------------------------------------------------- +// +void CDisplaySink::ThreadOpenL() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::ThreadOpenL()<"), RThread().Id().operator TUint())); + if ( !( iInitFlags & EThreadOpened ) ) + { + User::LeaveIfError( iThread.Open( iThreadId ) ); + iInitFlags |= EThreadOpened; + } + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::ThreadOpenL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::FbsDisconnect +// ----------------------------------------------------------------------------- +// +void CDisplaySink::FbsDisconnect() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::FbsDisconnect()<"), RThread().Id().operator TUint())); + if ( iInitFlags & EFbsSessionConnected ) + { + RFbsSession::Disconnect(); + iInitFlags &= ~EFbsSessionConnected; + } + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::FbsDisconnect()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::ThreadClose +// ----------------------------------------------------------------------------- +// +void CDisplaySink::ThreadClose() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::ThreadClose()<"), RThread().Id().operator TUint())); + if ( iInitFlags & EThreadOpened ) + { + iThread.Close(); + iInitFlags &= ~EThreadOpened; + } + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::ThreadClose()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySink::SinkThreadLogonCleanup +// ----------------------------------------------------------------------------- +// +void CDisplaySink::SinkThreadLogonCleanup( TAny* aPtr ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SinkThreadLogonCleanup()<"), RThread().Id().operator TUint())); + CDisplaySink* self = reinterpret_cast< CDisplaySink* >( aPtr ); + self->iVideoFrameQueue->ThreadLogoff(); + self->ThreadClose(); + self->FbsDisconnect(); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySink::SinkThreadLogonCleanup()>"), RThread().Id().operator TUint())); + } + +// ================= OTHER EXPORTED FUNCTIONS ============== + +// ----------------------------------------------------------------------------- +// CreateSinkL +// ----------------------------------------------------------------------------- +// +EXPORT_C MDisplaySink* CreateSinkL( TDisplaySinkParams& aParams, + const TDesC8& aInitData ) + { + MDisplaySink* sink = NULL; + if (aParams.iFlags & TDisplaySinkParams::EDisplaySinkNGA) + { + sink = CDisplaySinkNGA::NewL( aParams, aInitData ); + } + else if ( FeatureManager::FeatureSupported( KFeatureIdDisplayPost ) && + ( aParams.iFlags & TDisplaySinkParams::EDisplaySinkDP ) ) + { + sink = CDisplaySinkDP::NewL( aParams, aInitData ); + } + else + { + sink = CDisplaySinkDSA::NewL( aParams, aInitData ); + } + return sink; + } + +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/src/CDisplaySinkDP.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/src/CDisplaySinkDP.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,309 @@ +/* +* Copyright (c) 2004 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: Display Sink subsystem for Display Posting. +* +*/ + + +// INCLUDE FILES + +#include "CDisplaySinkDP.h" +#include "vtyuvconverter.h" + +// MACROS + +#ifdef _DEBUG + #include + #define PRINT RDebug::Print + #define _IFDBG(a) a +#else + #define PRINT + #define _IFDBG(a) +#endif + +// ----------------------------------------------------------------------------- +// CDisplaySinkDP::NewL +// ----------------------------------------------------------------------------- +// +CDisplaySinkDP* CDisplaySinkDP::NewL( TDisplaySinkParams& aParams, + const TDesC8& aInitData ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::NewL()<"), RThread().Id().operator TUint())); + CDisplaySinkDP* self = new ( ELeave ) CDisplaySinkDP(); + CleanupStack::PushL( self ); + self->ConstructL( aParams, aInitData ); + CleanupStack::Pop(); // self + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::NewL()>"), RThread().Id().operator TUint())); + return self; + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDP::CDisplaySinkDP +// ----------------------------------------------------------------------------- +// +CDisplaySinkDP::CDisplaySinkDP() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::Ctor<"), RThread().Id().operator TUint())); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::Ctor>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDP::~CDisplaySinkDP +// ----------------------------------------------------------------------------- +// +CDisplaySinkDP::~CDisplaySinkDP() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::~<"), RThread().Id().operator TUint())); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::~>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDP::BaseConstructL +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDP::BaseConstructL( TDisplaySinkParams& aParams, + const TDesC8& ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseConstructL()<"), RThread().Id().operator TUint())); + iNewParams = static_cast< const TDisplaySinkParamsDP& >( aParams ); + if ( !iNewParams.iPostingBuffer1 || !iNewParams.iPostingBuffer2 ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseConstructL() posting buffer is NULL!"))); + User::Leave( KErrArgument ); + } + iBitmapTable[EFirstBitmap].iBuffer = iNewParams.iPostingBuffer1; + iBitmapTable[ESecondBitmap].iBuffer = iNewParams.iPostingBuffer2; + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseConstructL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDP::BaseConvert +// ----------------------------------------------------------------------------- +// +TBool CDisplaySinkDP::BaseConvert( const TVtMMFDataBuffer& aBuffer ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseConvert()<"), RThread().Id().operator TUint())); + + TBool consumed( ETrue ); + TBitmapNo bitmapNo( iBitmapTable[ EFirstBitmap ].iIsFree ? EFirstBitmap : ESecondBitmap ); + if ( iBitmapTable[ bitmapNo ].iIsFree && + !iReleased && + ( *iRequestStatusPtr == KRequestPending ) ) + { + CPostingSurface::TPostingBuff* postingBuffer = + *iBitmapTable[ bitmapNo ].iBuffer; + + TInt bufferLength( + postingBuffer->GetSize().iHeight * postingBuffer->GetStride() ); + + TPtr8 ptrBuffer( + static_cast< TUint8* >( postingBuffer->GetBuffer() ), + bufferLength, + bufferLength + ); + + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseConvert(): buffer %d: $%x %d bytes"), RThread().Id().operator TUint(), bitmapNo, postingBuffer->GetBuffer(), bufferLength)); + + // Determine wether to convert or copy (420 will be just copied) + if ( iNewParams.iPostingFormat == + CPostingSurface::EYuv422LeBt601Range0 ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseConvert(): converting to 422"), RThread().Id().operator TUint())); + VtYuvConverter::ConvertFrom420PlanarTo422Interleaved( + aBuffer.Data(), + aBuffer.GetFrameSize(), + ptrBuffer, + postingBuffer->GetStride() ); + } + else + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseConvert(): copying as 420"), RThread().Id().operator TUint())); + ptrBuffer = aBuffer.Data(); + } + + iBitmapTable[ bitmapNo ].iIsFree = EFalse; + TRequestStatus* statusP = iRequestStatusPtr; + iThread.RequestComplete( statusP, bitmapNo ); + } + else + { + consumed = EFalse; + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseConvert(): could not find free buffer"), RThread().Id().operator TUint())); + } + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseConvert()>"), RThread().Id().operator TUint())); + return consumed; + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDP::BaseSinkThreadLogonL +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDP::BaseSinkThreadLogonL() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseSinkThreadLogonL()<"), RThread().Id().operator TUint())); + UpdateExpectedFrameSizeL(); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseSinkThreadLogonL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDP::BaseSinkThreadLogoff +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDP::BaseSinkThreadLogoff() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseSinkThreadLogoff()<"), RThread().Id().operator TUint())); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseSinkThreadLogoff()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDP::BaseUpdateSinkParamsL +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDP::BaseUpdateSinkParamsL( const TDisplaySinkParams& aParams ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseUpdateSinkParamsL()<"), RThread().Id().operator TUint())); + iNewParams = static_cast< const TDisplaySinkParamsDP& >( aParams ); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseUpdateSinkParamsL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDP::BaseDoUpdateParamsL +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDP::BaseDoUpdateParamsL() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseDoUpdateParamsL()<"), RThread().Id().operator TUint())); + iBitmapTable[ EFirstBitmap ].iBuffer = iNewParams.iPostingBuffer1; + iBitmapTable[ ESecondBitmap ].iBuffer = iNewParams.iPostingBuffer2; + UpdateExpectedFrameSizeL(); + if( iNewParams.iFrameRateLimit != iFrameRateInterval ) + { + SetFrameRateLimit( iNewParams.iFrameRateLimit ); + ResetFrameRateLimitter(); + } + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseDoUpdateParamsL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDP::BaseSetVideoFrameSizeL +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDP::BaseSetVideoFrameSizeL( const TSize& ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseSetVideoFrameSizeL()<"), RThread().Id().operator TUint())); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseSetVideoFrameSizeL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDP::BaseSizesMatch +// ----------------------------------------------------------------------------- +// +TBool CDisplaySinkDP::BaseSizesMatch( const TSize& aSize ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseSizesMatch()<"), RThread().Id().operator TUint())); + TBool sizesMatch( iExpectedFrameSize == aSize ); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseSizesMatch() %d>"), RThread().Id().operator TUint(), sizesMatch)); + return sizesMatch; + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDP::BitmapEntry +// ----------------------------------------------------------------------------- +// +CDisplaySink::TBitmapEntry& CDisplaySinkDP::BitmapEntry( TInt aIndex ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BitmapEntry(%d)<"), RThread().Id().operator TUint(), aIndex)); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BitmapEntry()>"), RThread().Id().operator TUint())); + return iBitmapTable[ aIndex ]; + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDP::BaseEmptyBufferL +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDP::BaseEmptyBufferL( TVtMMFDataBuffer& aVTMMFBuffer ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseEmptyBufferL()<"), RThread().Id().operator TUint())); + if ( BaseConvert( aVTMMFBuffer ) ) + { + CleanupStack::PopAndDestroy(); // iBitmapCS.Signal(); + iSupplier->BufferEmptiedL( iBuffer ); + } + else + { + if ( iVideoFrameQueue->IsStored() || !IsOkToSendFrame() ) + { + CleanupStack::PopAndDestroy(); // iBitmapCS.Signal(); + iSupplier->BufferEmptiedL( iBuffer ); + } + else + { + iVideoFrameQueue->Store( *iSupplier, static_cast(aVTMMFBuffer.GetMMFBuffer()), aVTMMFBuffer.GetFrameSize(), aVTMMFBuffer.Data() ); + CleanupStack::PopAndDestroy(); // iBitmapCS.Signal(); + } + } + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseEmptyBufferL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDP::BaseSetBitmapAvailable( TBitmapNo aBitmapNo ) +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDP::BaseSetBitmapAvailable( TBitmapNo ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseSetBitmapAvailable()<"), RThread().Id().operator TUint())); + NextFrame(); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseSetBitmapAvailable()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDP::BaseVideoFrameSizeChangedL( const TSize& ) +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDP::BaseVideoFrameSizeChangedL( const TSize& ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseVideoFrameSizeChangedL()<"), RThread().Id().operator TUint())); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseVideoFrameSizeChangedL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDP::NextFrame +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDP::NextFrame() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::NextFrame()<"), RThread().Id().operator TUint())); + if ( iVideoFrameQueue->IsStored() ) + { + if ( IsOkToSendFrame() ) + { + BaseConvert( iVideoFrameQueue->Buffer() ); + } + iVideoFrameQueue->Release(); + } + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::NextFrame()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDP::UpdateExpectedFrameSizeL() +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDP::UpdateExpectedFrameSizeL() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::UpdateExpectedFrameSizeL()<"), RThread().Id().operator TUint())); + iExpectedFrameSize = iNewParams.iFrameSize; + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::UpdateExpectedFrameSizeL()>"), RThread().Id().operator TUint())); + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/src/CDisplaySinkDSA.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/src/CDisplaySinkDSA.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,464 @@ +/* +* 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: Display Sink subsystem for Direct Screen Access. +* +*/ + + +// INCLUDES + +#include +#include +#include "CDisplaySinkDSA.h" +#include "TDisplaySinkParamsDSA.h" + +// MACROS + +#ifdef _DEBUG + #include + #define PRINT RDebug::Print + #define _IFDBG(a) a +#else + #define PRINT + #define _IFDBG(a) +#endif + +// ======================== CDisplaySinkDSA ============================== + +// ----------------------------------------------------------------------------- +// CDisplaySinkDSA::NewL +// ----------------------------------------------------------------------------- +// +CDisplaySinkDSA* CDisplaySinkDSA::NewL( TDisplaySinkParams& aParams, + const TDesC8& aInitData ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::NewL()<"), RThread().Id().operator TUint())); + CDisplaySinkDSA* self = new ( ELeave ) CDisplaySinkDSA(); + CleanupStack::PushL( self ); + self->ConstructL( aParams, aInitData ); + CleanupStack::Pop(); // self + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::NewL()>"), RThread().Id().operator TUint())); + return self; + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDSA::CDisplaySinkDSA +// ----------------------------------------------------------------------------- +// +CDisplaySinkDSA::CDisplaySinkDSA() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::Ctor<"), RThread().Id().operator TUint())); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::Ctor>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDSA::~CDisplaySinkDSA +// ----------------------------------------------------------------------------- +// +CDisplaySinkDSA::~CDisplaySinkDSA() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::~<"), RThread().Id().operator TUint())); + delete iRotator; + delete iYUVBitmapConverterVT; + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::~>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDSA::BaseConstructL +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDSA::BaseConstructL( TDisplaySinkParams& aParams, + const TDesC8& ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseConstructL()<"), RThread().Id().operator TUint())); + iNewParams = static_cast< TDisplaySinkParamsDSA& > ( aParams ); + if ( !iNewParams.iBitmap1Handle || !iNewParams.iBitmap2Handle ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseConstructL() bitmap handle NULL!") )); + User::Leave( KErrArgument ); + } + iBitmapTable[EFirstBitmap].iHandle = iNewParams.iBitmap1Handle; + iBitmapTable[ESecondBitmap].iHandle = iNewParams.iBitmap2Handle; + iRotator = CVtImageRotator::NewL( *this ); + iRotationAngle = iNewParams.iRotationAngle; + iYUVBitmapConverterVT = CVTIYUVFbsBitmapConverter::NewL( + QCIF, iBitmapTable[EFirstBitmap].iHandle ); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseConstructL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDSA::BaseConvert +// ----------------------------------------------------------------------------- +// +TBool CDisplaySinkDSA::BaseConvert( const TVtMMFDataBuffer& aBuffer ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseConvert()<"), RThread().Id().operator TUint())); + TBool converted( EFalse ); + TRAPD( err, ConvertL( aBuffer.Data(), converted ) ); + if ( err != KErrNone ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseConvert() err=%d"), RThread().Id().operator TUint(), err)); + converted = EFalse; + } + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseConvert() %d>"), RThread().Id().operator TUint(), converted)); + return converted; + } +// ----------------------------------------------------------------------------- +// CDisplaySinkDSA::BaseSinkThreadLogonL +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDSA::BaseSinkThreadLogonL() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseSinkThreadLogonL()<"), RThread().Id().operator TUint())); + CVTYUVFbsBitmapConverter* converter1 = + CVTIYUVFbsBitmapConverter::NewL( + QCIF, + iBitmapTable[EFirstBitmap].iHandle ); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseSinkThreadLogonL() 1"), RThread().Id().operator TUint())); + CleanupStack::PushL( converter1 ); + CVTYUVFbsBitmapConverter* converter2 = + CVTIYUVFbsBitmapConverter::NewL( + QCIF, + iBitmapTable[ESecondBitmap].iHandle ); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseSinkThreadLogonL() 2"), RThread().Id().operator TUint())); + CleanupStack::PushL( converter2 ); + CleanupStack::Pop( 2 ); // converter1, converter2 + iYUVBitmapConverter1 = converter1; + iYUVBitmapConverter2 = converter2; + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseSinkThreadLogonL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDSA::BaseSinkThreadLogoff +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDSA::BaseSinkThreadLogoff() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseSinkThreadLogoff()<"), RThread().Id().operator TUint())); + delete iYUVBitmapConverter1; + delete iYUVBitmapConverter2; + delete iSourceImg; iSourceImg = 0; + delete iTargetImg; iTargetImg = 0; + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseSinkThreadLogoff()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDSA::BaseUpdateSinkParamsL +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDSA::BaseUpdateSinkParamsL( const TDisplaySinkParams& aParams ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseUpdateSinkParamsL()<"), RThread().Id().operator TUint())); + iNewParams = static_cast< const TDisplaySinkParamsDSA& >( aParams ); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseUpdateSinkParamsL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDSA::BaseDoUpdateParamsL +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDSA::BaseDoUpdateParamsL() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseDoUpdateParamsL()<"), RThread().Id().operator TUint())); + iRotationAngle = iNewParams.iRotationAngle; + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseDoUpdateParamsL() handle1=%d"), RThread().Id().operator TUint(), iNewParams.iBitmap1Handle)); + iBitmapTable[ EFirstBitmap ].iHandle = iNewParams.iBitmap1Handle; + iBitmapTable[ EFirstBitmap ].iIsFree = ETrue; + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseDoUpdateParamsL() handle2=%d"), RThread().Id().operator TUint(), iNewParams.iBitmap2Handle)); + iBitmapTable[ ESecondBitmap ].iHandle = iNewParams.iBitmap2Handle; + iBitmapTable[ ESecondBitmap ].iIsFree = EFalse; + UpdateExpectedFrameSizeL(); + iYUVBitmapConverter1->SetSourceSizeL( iExpectedFrameSize ); + iYUVBitmapConverter1->SetDestinationL( iNewParams.iBitmap1Handle ); + iYUVBitmapConverter2->SetSourceSizeL( iExpectedFrameSize ); + iYUVBitmapConverter2->SetDestinationL( iNewParams.iBitmap2Handle ); + if( iNewParams.iFrameRateLimit != iFrameRateInterval ) + { + SetFrameRateLimit( iNewParams.iFrameRateLimit ); + ResetFrameRateLimitter(); + } + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseDoUpdateParamsL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDSA::BaseSetVideoFrameSizeL +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDSA::BaseSetVideoFrameSizeL( const TSize& aSize ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseSetVideoFrameSizeL()<"), RThread().Id().operator TUint())); + TSize size( aSize ); + if( ( iRotationAngle == CVtImageRotator::E90DegreesClockwise ) || + ( iRotationAngle == CVtImageRotator::E270DegreesClockwise ) ) + { + size = TSize( aSize.iHeight, aSize.iWidth ); + } + iYUVBitmapConverter1->SetSourceSizeL( size ); + iYUVBitmapConverter2->SetSourceSizeL( size ); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseSetVideoFrameSizeL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDSA::BaseSizesMatch +// ----------------------------------------------------------------------------- +// +TBool CDisplaySinkDSA::BaseSizesMatch( const TSize& aSize ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseSizesMatch()<"), RThread().Id().operator TUint())); + TBool sizesMatch( iExpectedFrameSize == aSize ); + TBool rotateChangesDimension( + ( iRotationAngle == CVtImageRotator::E90DegreesClockwise ) || + ( iRotationAngle == CVtImageRotator::E270DegreesClockwise ) ); + if( rotateChangesDimension ) + { + sizesMatch = + ( iExpectedFrameSize.iWidth == aSize.iHeight ) && + ( iExpectedFrameSize.iHeight == aSize.iWidth ); + } + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseSizesMatch() %d>"), RThread().Id().operator TUint(), sizesMatch)); + return sizesMatch; + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDSA::BitmapEntry +// ----------------------------------------------------------------------------- +// +CDisplaySink::TBitmapEntry& CDisplaySinkDSA::BitmapEntry( TInt aIndex ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BitmapEntry(%d)<"), RThread().Id().operator TUint(), aIndex)); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BitmapEntry()>"), RThread().Id().operator TUint())); + return iBitmapTable[ aIndex ]; + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDSA::BaseEmptyBufferL +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDSA::BaseEmptyBufferL( TVtMMFDataBuffer& aVTMMFBuffer ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseEmptyBufferL()<"), RThread().Id().operator TUint())); + if( iRotationAngle != CVtImageRotator::ERotationNone ) + { + TSize size( aVTMMFBuffer.GetFrameSize() ); + TInt length( ( size.iWidth * size.iHeight * 12 ) / 8 ); + // Modifiable pointer descriptor needed, we don't want a copy of image! + TPtr8 ptrData( const_cast< TUint8* >( + aVTMMFBuffer.Data().Ptr() ), length, length ); + + if( iSourceImg == 0 ) + { + // If source image is not created -> create it + iSourceImg = CVtImageIYUV::NewL( size, ptrData ); + } + else + { + // otherwise just update the data + if( iSourceImg->Size() == size ) + { + iSourceImg->SetImageL( ptrData ); + } + else + { + delete iSourceImg; iSourceImg = 0; + iSourceImg = CVtImageIYUV::NewL( size, ptrData ); + } + } + iRotator->RotateL( *iSourceImg, *iTargetImg, iRotationAngle ); + CleanupStack::PopAndDestroy(); // iBitmapCS.Signal(); + } + else + { + if ( BaseConvert( aVTMMFBuffer ) ) + { + CleanupStack::PopAndDestroy(); // iBitmapCS.Signal(); + iSupplier->BufferEmptiedL( iBuffer ); + } + else + { + if ( iVideoFrameQueue->IsStored() || !IsOkToSendFrame() ) + { + CleanupStack::PopAndDestroy(); // iBitmapCS.Signal(); + iSupplier->BufferEmptiedL( iBuffer ); + } + else + { + iVideoFrameQueue->Store( *iSupplier, static_cast(aVTMMFBuffer.GetMMFBuffer()), aVTMMFBuffer.GetFrameSize(), aVTMMFBuffer.Data()); + CleanupStack::PopAndDestroy(); + } + } + } + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseEmptyBufferL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDSA::BaseSetBitmapAvailable( TBitmapNo aBitmapNo ) +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDSA::BaseSetBitmapAvailable( TBitmapNo aBitmapNo ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseSetBitmapAvailable()<"), RThread().Id().operator TUint())); + if ( iVideoFrameQueue->IsStored() ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseSetBitmapAvailable() buffer pending"), RThread().Id().operator TUint())); + if ( !iReleased && ( *iRequestStatusPtr == KRequestPending ) && IsOkToSendFrame() ) + { + TRAPD( result, { + iYUVBitmapConverterVT->SetDestinationL( + iBitmapTable[ aBitmapNo ].iHandle ); + iYUVBitmapConverterVT->SetSourceL( + iVideoFrameQueue->Buffer().Data() ); + iYUVBitmapConverterVT->ProcessL(); + } ); + if ( result == KErrNone ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseSetBitmapAvailable() conversion succeeded!"), RThread().Id().operator TUint())); + iBitmapTable[ aBitmapNo ].iIsFree = EFalse; + TRequestStatus* statusP = iRequestStatusPtr; + iThread.RequestComplete( statusP, aBitmapNo ); + } + else + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseSetBitmapAvailable() conversion failed!"), RThread().Id().operator TUint())); + // Drop frame + } + } + else + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseSetBitmapAvailable() dropping frame"), RThread().Id().operator TUint())); + // Drop frame + } + iVideoFrameQueue->Release(); + } + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseSetBitmapAvailable()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDSA::BaseVideoFrameSizeChangedL( const TSize& aNewSize ) +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDSA::BaseVideoFrameSizeChangedL( const TSize& aNewSize ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseVideoFrameSizeChangedL()<"), RThread().Id().operator TUint())); + iYUVBitmapConverterVT->SetSourceSizeL( aNewSize ); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::BaseVideoFrameSizeChangedL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDSA::UpdateExpectedFrameSizeL() +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDSA::UpdateExpectedFrameSizeL() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::UpdateExpectedFrameSizeL()<"), RThread().Id().operator TUint())); + CFbsBitmap* bm = new ( ELeave ) CFbsBitmap(); + CleanupStack::PushL( bm ); + User::LeaveIfError( bm->Duplicate( iBitmapTable[ EFirstBitmap ].iHandle ) ); + iExpectedFrameSize = bm->SizeInPixels(); + User::LeaveIfError( bm->Duplicate( iBitmapTable[ ESecondBitmap ].iHandle ) ); + if( iExpectedFrameSize != bm->SizeInPixels() ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::UpdateExpectedFrameSizeL(): EFirstBitmap size is different from ESecondBitmap size -> Leave()"), RThread().Id().operator TUint())); + User::Leave( KErrNotSupported ); + } + CleanupStack::PopAndDestroy(); // bm + delete iTargetImg; iTargetImg = 0; + iTargetImg = CVtImageIYUV::NewL( iExpectedFrameSize ); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::UpdateExpectedFrameSizeL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDSA::RotationFinished( TInt aError ) +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDSA::RotationFinished( TInt aError ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::RotationFinished()<"), RThread().Id().operator TUint())); + // Rotation finished .. do something + if( aError == KErrNone ) + { + iBitmapCS.Wait(); + TBool converted( EFalse ); + TRAP( aError, ConvertL( iTargetImg->Image(), converted ) ); + iBitmapCS.Signal(); + TRAPD( aError2, iSupplier->BufferEmptiedL( iBuffer ) ); + if( ( aError != KErrNone ) || ( aError2 != KErrNone ) ) + { + *iRequestStatusPtr = KRequestPending; + TRequestStatus* statusP = iRequestStatusPtr; + iThread.RequestComplete( statusP, aError ); + } + } + else + { + *iRequestStatusPtr = KRequestPending; + TRequestStatus* statusP = iRequestStatusPtr; + iThread.RequestComplete( statusP, aError ); + } + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::RotationFinished()>"), RThread().Id().operator TUint())); + } + + +// ----------------------------------------------------------------------------- +// CDisplaySinkDSA::ConvertL +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDSA::ConvertL( const TPtrC8& aBuffer, TBool& aConverted ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::ConvertL()<"), RThread().Id().operator TUint())); + TBitmapNo bitmapNo( iBitmapTable[ EFirstBitmap ].iIsFree ? EFirstBitmap : ESecondBitmap ); + if ( iBitmapTable[ bitmapNo ].iIsFree && + !iReleased && + ( *iRequestStatusPtr == KRequestPending ) ) + { + DoConvertL( aBuffer, bitmapNo ); + aConverted = ETrue; + iBitmapTable[ bitmapNo ].iIsFree = EFalse; + TRequestStatus* statusP = iRequestStatusPtr; + iThread.RequestComplete( statusP, bitmapNo ); + } + else + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::ConvertL(): could not find free bitmap"), RThread().Id().operator TUint())); + aConverted = EFalse; + } + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::ConvertL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDSA::DoConvert +// ----------------------------------------------------------------------------- +// +void CDisplaySinkDSA::DoConvertL( const TPtrC8& aBuffer, TBitmapNo aBitmapNo ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::DoConvertL()<"), RThread().Id().operator TUint())); + CVTYUVFbsBitmapConverter* c = 0; + switch( aBitmapNo ) + { + case EFirstBitmap: + c = iYUVBitmapConverter1; + break; + + case ESecondBitmap: + c = iYUVBitmapConverter2; + break; + + default: + User::Leave( KErrArgument ); + }; + c->SetSourceL( aBuffer ); + c->ProcessL(); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDSA::DoConvertL()>"), RThread().Id().operator TUint())); + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/src/CDisplaySinkNGA.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/src/CDisplaySinkNGA.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,818 @@ +/* +* Copyright (c) 2004-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: Class for CDisplaySinkNGA. +* +*/ + +// INCLUDE FILES + +#include "CDisplaySinkNGA.h" + +// MACROS + +#ifdef _DEBUG + #include + #define PRINT RDebug::Print + #define _IFDBG(a) a +#else + #define PRINT + #define _IFDBG(a) +#endif + + static const TUint8 NGA_COFF_TBL_64K[ 220 ]= + { + 0xe9,0x66,0x01,0x00, // KRedCrFactor + 0x1a,0x58,0x00,0x00, // KGreenCbFactor + 0xd2,0xb6,0x00,0x00, // KGreenCrFactor + 0xa2,0xc5,0x01,0x00, // KBlueCbFactor + + 0x00,0x00,0x00,0x00, // 5-bit + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x01,0x02,0x03, + 0x04,0x05,0x06,0x07, + 0x08,0x09,0x0a,0x0b, + 0x0c,0x0d,0x0e,0x0f, + 0x10,0x11,0x12,0x13, + 0x14,0x15,0x16,0x17, + 0x18,0x19,0x1a,0x1b, + 0x1c,0x1d,0x1e,0x1f, + 0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f,0x1f,0x1f, + + 0x00,0x00,0x00,0x00, // 6-bit + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x01,0x02,0x03, + 0x04,0x05,0x06,0x07, + 0x08,0x09,0x0a,0x0b, + 0x0c,0x0d,0x0e,0x0f, + 0x10,0x11,0x12,0x13, + 0x14,0x15,0x16,0x17, + 0x18,0x19,0x1a,0x1b, + 0x1c,0x1d,0x1e,0x1f, + 0x20,0x21,0x22,0x23, + 0x24,0x25,0x26,0x27, + 0x28,0x29,0x2a,0x2b, + 0x2c,0x2d,0x2e,0x2f, + 0x30,0x31,0x32,0x33, + 0x34,0x35,0x36,0x37, + 0x38,0x39,0x3a,0x3b, + 0x3c,0x3d,0x3e,0x3f, + 0x3f,0x3f,0x3f,0x3f, + 0x3f,0x3f,0x3f,0x3f, + 0x3f,0x3f,0x3f,0x3f, + 0x3f,0x3f,0x3f,0x3f, + 0x3f,0x3f,0x3f,0x3f, + 0x3f,0x3f,0x3f,0x3f, + 0x3f,0x3f,0x3f,0x3f, + 0x3f,0x3f,0x3f,0x3f, + 0x3f,0x3f,0x3f,0x3f, + 0x3f,0x3f,0x3f,0x3f, + 0x3f,0x3f,0x3f,0x3f + }; + + + const TUint8 NGA_COFF_TBL_16M[ 528 ] = + { + 0xe9,0x66,0x01,0x00, // KRedCrFactor + 0x1a,0x58,0x00,0x00, // KGreenCbFactor + 0xd2,0xb6,0x00,0x00, // KGreenCrFactor + 0xa2,0xc5,0x01,0x00, // KBlueCbFactor + + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + + 0x00,0x01,0x02,0x03, // 8-bit + 0x04,0x05,0x06,0x07, + 0x08,0x09,0x0a,0x0b, + 0x0c,0x0d,0x0e,0x0f, + + 0x10,0x11,0x12,0x13, + 0x14,0x15,0x16,0x17, + 0x18,0x19,0x1a,0x1b, + 0x1c,0x1d,0x1e,0x1f, + + 0x20,0x21,0x22,0x23, + 0x24,0x25,0x26,0x27, + 0x28,0x29,0x2a,0x2b, + 0x2c,0x2d,0x2e,0x2f, + + 0x30,0x31,0x32,0x33, + 0x34,0x35,0x36,0x37, + 0x38,0x39,0x3a,0x3b, + 0x3c,0x3d,0x3e,0x3f, + + 0x40,0x41,0x42,0x43, + 0x44,0x45,0x46,0x47, + 0x48,0x49,0x4a,0x4b, + 0x4c,0x4d,0x4e,0x4f, + + 0x50,0x51,0x52,0x53, + 0x54,0x55,0x56,0x57, + 0x58,0x59,0x5a,0x5b, + 0x5c,0x5d,0x5e,0x5f, + + 0x60,0x61,0x62,0x63, + 0x64,0x65,0x66,0x67, + 0x68,0x69,0x6a,0x6b, + 0x6c,0x6d,0x6e,0x6f, + + 0x70,0x71,0x72,0x73, + 0x74,0x75,0x76,0x77, + 0x78,0x79,0x7a,0x7b, + 0x7c,0x7d,0x7e,0x7f, + + 0x80,0x81,0x82,0x83, + 0x84,0x85,0x86,0x87, + 0x88,0x89,0x8a,0x8b, + 0x8c,0x8d,0x8e,0x8f, + + 0x90,0x91,0x92,0x93, + 0x94,0x95,0x96,0x97, + 0x98,0x99,0x9a,0x9b, + 0x9c,0x9d,0x9e,0x9f, + + 0xa0,0xa1,0xa2,0xa3, + 0xa4,0xa5,0xa6,0xa7, + 0xa8,0xa9,0xaa,0xab, + 0xac,0xad,0xae,0xaf, + + 0xb0,0xb1,0xb2,0xb3, + 0xb4,0xb5,0xb6,0xb7, + 0xb8,0xb9,0xba,0xbb, + 0xbc,0xbd,0xbe,0xbf, + + 0xc0,0xc1,0xc2,0xc3, + 0xc4,0xc5,0xc6,0xc7, + 0xc8,0xc9,0xca,0xcb, + 0xcc,0xcd,0xce,0xcf, + + 0xd0,0xd1,0xd2,0xd3, + 0xd4,0xd5,0xd6,0xd7, + 0xd8,0xd9,0xda,0xdb, + 0xdc,0xdd,0xde,0xdf, + + 0xe0,0xe1,0xe2,0xe3, + 0xe4,0xe5,0xe6,0xe7, + 0xe8,0xe9,0xea,0xeb, + 0xec,0xed,0xee,0xef, + + 0xf0,0xf1,0xf2,0xf3, + 0xf4,0xf5,0xf6,0xf7, + 0xf8,0xf9,0xfa,0xfb, + 0xfc,0xfd,0xfe,0xff, + + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff + }; + + + void ConvertFrom420PlanarToRGB_565( + const TDesC8& aSource, + const TSize& aSize, + TDes8& aTarget, + TInt aStride ) + { + TInt height( aSize.iHeight >> 1 ); + TInt width( aSize.iWidth ); + + TInt ySize = aSize.iWidth * aSize.iHeight; + TInt ySizeDiv4 = ( ySize >> 2 ); + + const TUint32* y1 = reinterpret_cast< const TUint32* >( aSource.Mid( 0, ySize ).Ptr() ); + const TUint32* u = reinterpret_cast< const TUint32* >( aSource.Mid( ySize, ySizeDiv4 ).Ptr() ); + const TUint32* v = reinterpret_cast< const TUint32* >( aSource.Mid( ySize + ySizeDiv4, ySizeDiv4 ).Ptr() ); + + TUint32 uintsPerDestRow = aStride >> 2; + + const TUint32* TargetPtr = reinterpret_cast< const TUint32* >( aTarget.Ptr() ); + + TUint32* d1 = const_cast< TUint32* >( TargetPtr ); + + TUint32 ywidth = width >> 2; + + width >>= 3; + + TInt32 cb; + TInt32 cr; + TInt32 greenCbCr; + TInt32 yy; + TInt32 red; + TInt32 green; + TInt32 blue; + TUint32 r1; + const TUint8* clip = NGA_COFF_TBL_64K + 40; + + for( TInt y = 0; y < height; y++ ) + { + for( TInt x = 0; x < width; x++ ) + { + TUint32 u1 = *u++; + TUint32 v1 = *v++; + + for( TInt c2 = 0; c2 < 2; c2++ ) + { + TUint32 yy2 = y1[ ywidth ]; + TUint32 yy1 = *y1++; + + for( TInt c = 0; c < 2; c++ ) + { + cb = TInt32( u1 & 0xff ) - 128; + u1 >>= 8; + cr = TInt32( v1 & 0xff ) - 128; + v1 >>= 8; + + greenCbCr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 32 ) + + cb * *reinterpret_cast< const TInt32* >( clip - 36 ) + ) >> 16; + cr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 40 ) + ) >> 16; + cb = + ( + cb * *reinterpret_cast< const TInt32* >( clip - 28 ) + ) >> 16; + + // lower left + yy = ( yy2 & 0xff ); + yy2 >>= 8; + + red = yy + cr; + green = yy - greenCbCr; + blue = yy + cb; + + red = clip[ red >> 4 ]; + green = clip[ green >> 4 ]; + blue = clip[ blue >> 4 ]; + + // RGB_444 + r1 = green | ( red << 4 ); + r1 = blue | ( r1 << 4 ); + + // lower right + yy = ( yy2 & 0xff ); + yy2 >>= 8; + + red = yy + cr; + green = yy - greenCbCr; + blue = yy + cb; + + red = clip[ red >> 4 ]; + green = clip[ green >> 4 ]; + blue = clip[ blue >> 4 ]; + + // RGB_444 + r1 |= ( ( green | ( red << 4 ) ) << 4 | blue ) << 16; + + d1[ uintsPerDestRow ] = r1; + + // upper left + yy = ( yy1 & 0xff ); + yy1 >>= 8; + + red = yy + cr; + green = yy - greenCbCr; + blue = yy + cb; + + red = clip[ red >> 4 ]; + green = clip[ green >> 4 ]; + blue = clip[ blue >> 4 ]; + + // RGB_444 + r1 = green | ( red << 4 ); + r1 = blue | ( r1 << 4 ); + + // upper right + yy = ( yy1 & 0xff ); + yy1 >>= 8; + + red = yy + cr; + green = yy - greenCbCr; + blue = yy + cb; + + red = clip[ red >> 4 ]; + green = clip[ green >> 4 ]; + blue = clip[ blue >> 4 ]; + + // RGB_444 + r1 |= ( ( green | ( red << 4 ) ) << 4 | blue ) << 16; + + *d1++ = r1; + } + } + } + + y1 += ( width << 1 ); + d1 += uintsPerDestRow; + } + } + + + void ConvertFrom420PlanarToXRGB_8888( + const TDesC8& aSource, + const TSize& aSize, + TDes8& aTarget, + TInt aStride ) + { + + TInt height( aSize.iHeight >> 1 ); + TInt width( aSize.iWidth ); + + TInt ySize = aSize.iWidth * aSize.iHeight; + TInt ySizeDiv4 = ( ySize >> 2 ); + + const TUint32* y1 = reinterpret_cast< const TUint32* >( aSource.Mid( 0, ySize ).Ptr() ); + const TUint32* u = reinterpret_cast< const TUint32* >( aSource.Mid( ySize, ySizeDiv4 ).Ptr() ); + const TUint32* v = reinterpret_cast< const TUint32* >( aSource.Mid( ySize + ySizeDiv4, ySizeDiv4 ).Ptr() ); + + TUint32 uintsPerDestRow = aStride >> 2; + + const TUint32* TargetPtr = reinterpret_cast< const TUint32* >( aTarget.Ptr() ); + + TUint32* d1 = const_cast< TUint32* >( TargetPtr ); + + + TUint32 ywidth = width >> 2; + + width >>= 3; + + TInt32 cb; + TInt32 cr; + TInt32 greenCbCr; + TInt32 yy; + TUint32 p; + const TUint8* clip = NGA_COFF_TBL_16M + 144; + + for( TInt y = 0; y < height; y++ ) + { + for( TInt x = 0; x < width; x++ ) + { + TUint32 u1 = *u++; + TUint32 v1 = *v++; + + for( TInt c2 = 0; c2 < 2; c2++ ) + { + TUint32 yy2 = y1[ ywidth ]; + TUint32 yy1 = *y1++; + + for( TInt c = 0; c < 2; c++ ) + { + cb = TInt32( u1 & 0xff ) - 128; + u1 >>= 8; + cr = TInt32( v1 & 0xff ) - 128; + v1 >>= 8; + + greenCbCr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 136 ) + + cb * *reinterpret_cast< const TInt32* >( clip - 140 ) + ) >> 16; + cr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 144 ) + ) >> 16; + cb = + ( + cb * *reinterpret_cast< const TInt32* >( clip - 132 ) + ) >> 16; + + // lower left + yy = ( yy2 & 0xff ); + yy2 >>= 8; + + // 0xffBBGG + p = 0xff0000 | + ( clip[ yy + cr ] << 8 ) | clip[ yy - greenCbCr ]; + // 0xffBBGGRR + d1[ uintsPerDestRow ] = clip[ yy + cb ] | ( p << 8 ); + + // lower right + yy = ( yy2 & 0xff ); + yy2 >>= 8; + + // 0xffBBGG + p = 0xff0000 | + ( clip[ yy + cr ] << 8 ) | clip[ yy - greenCbCr ]; + // 0xffBBGGRR + d1[ uintsPerDestRow + 1 ] = clip[ yy + cb ] | ( p << 8 ); + + // upper left + yy = ( yy1 & 0xff ); + yy1 >>= 8; + + // 0xffBBGG + p = 0xff0000 | + ( clip[ yy + cr ] << 8 ) | clip[ yy - greenCbCr ]; + // 0xffBBGGRR + *d1++ = clip[ yy + cb ] | ( p << 8 ); + + // upper right + yy = ( yy1 & 0xff ); + yy1 >>= 8; + + // 0xffBBGG + p = 0xff0000 | + ( clip[ yy + cr ] << 8 ) | clip[ yy - greenCbCr ]; + // 0xffBBGGRR + *d1++ = clip[ yy + cb ] | ( p << 8 ); + } + } + } + + y1 += ( width << 1 ); + d1 += uintsPerDestRow; + } + + } + + +// ----------------------------------------------------------------------------- +// CDisplaySinkNGA::NewL +// ----------------------------------------------------------------------------- +// +CDisplaySinkNGA* CDisplaySinkNGA::NewL( TDisplaySinkParams& aParams, + const TDesC8& aInitData ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::NewL()<"), RThread().Id().operator TUint())); + CDisplaySinkNGA* self = new ( ELeave ) CDisplaySinkNGA(); + CleanupStack::PushL( self ); + self->ConstructL( aParams, aInitData ); + CleanupStack::Pop(); // self + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::NewL()>"), RThread().Id().operator TUint())); + return self; + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkNGA::CDisplaySinkNGA +// ----------------------------------------------------------------------------- +// +CDisplaySinkNGA::CDisplaySinkNGA() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::Ctor<"), RThread().Id().operator TUint())); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::Ctor>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkNGA::~CDisplaySinkNGA +// ----------------------------------------------------------------------------- +// +CDisplaySinkNGA::~CDisplaySinkNGA() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::~<"), RThread().Id().operator TUint())); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::~>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkNGA::BaseConstructL +// ----------------------------------------------------------------------------- +// +void CDisplaySinkNGA::BaseConstructL( TDisplaySinkParams& aParams, + const TDesC8& ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseConstructL()<"), RThread().Id().operator TUint())); + iNewParams = static_cast< const TDisplaySinkParamsNGA& >( aParams ); + if ( !iNewParams.iSurfaceBuffer1 || !iNewParams.iSurfaceBuffer2 ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseConstructL() surface buffer is NULL!"))); + User::Leave( KErrArgument ); + } + iBitmapTable[EFirstBitmap].iBuffer = iNewParams.iSurfaceBuffer1; + iBitmapTable[ESecondBitmap].iBuffer = iNewParams.iSurfaceBuffer2; + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseConstructL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkNGA::BaseConvert +// ----------------------------------------------------------------------------- +// +TBool CDisplaySinkNGA::BaseConvert( const TVtMMFDataBuffer& aBuffer ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseConvert()<"), RThread().Id().operator TUint())); + + TBool consumed( ETrue ); + TBitmapNo bitmapNo( iBitmapTable[ EFirstBitmap ].iIsFree ? EFirstBitmap : ESecondBitmap ); + if ( iBitmapTable[ bitmapNo ].iIsFree && + !iReleased && + ( *iRequestStatusPtr == KRequestPending ) ) + { +#if 1 + TInt bufferLength( + //iNewParams.iFrameSize.iHeight * ( iNewParams.iFrameSize.iWidth * 2 ) ); + iNewParams.iFrameSize.iHeight * ( iNewParams.iFrameSize.iWidth * 3/2 ) ); +#else + TInt bufferLength( + iNewParams.iFrameSize.iHeight * ( iNewParams.iFrameSize.iWidth * 4 ) ); +#endif + + TPtr8 ptrBuffer( + *iBitmapTable[ bitmapNo ].iBuffer, + bufferLength, + bufferLength + ); + + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseConvert(): buffer %d: $%x %d bytes"), RThread().Id().operator TUint(), bitmapNo, *iBitmapTable[ bitmapNo ].iBuffer, bufferLength)); + + // Determine wether to convert or copy (420 will be just copied) + //if ( iNewParams.iSurfaceFormat == EUidPixelFormatRGB_565 ) + if ( iNewParams.iSurfaceFormat == EUidPixelFormatXRGB_8888 ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseConvert(): converting to RGB565"), RThread().Id().operator TUint())); + + /* + ConvertFrom420PlanarToRGB_565( + aBuffer.Data(), + aBuffer.GetFrameSize(), + ptrBuffer, + iNewParams.iFrameSize.iWidth * 2 ); + */ + + ConvertFrom420PlanarToXRGB_8888( + aBuffer.Data(), + aBuffer.GetFrameSize(), + ptrBuffer, + iNewParams.iFrameSize.iWidth * 4 ); + + } + else + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseConvert(): copying as 420"), RThread().Id().operator TUint())); + ptrBuffer = aBuffer.Data(); + } + + iBitmapTable[ bitmapNo ].iIsFree = EFalse; + TRequestStatus* statusP = iRequestStatusPtr; + iThread.RequestComplete( statusP, bitmapNo ); + } + else + { + consumed = EFalse; + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseConvert(): could not find free buffer"), RThread().Id().operator TUint())); + } + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseConvert()>"), RThread().Id().operator TUint())); + return consumed; + + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkNGA::BaseSinkThreadLogonL +// ----------------------------------------------------------------------------- +// +void CDisplaySinkNGA::BaseSinkThreadLogonL() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseSinkThreadLogonL()<"), RThread().Id().operator TUint())); + UpdateExpectedFrameSizeL(); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseSinkThreadLogonL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkNGA::BaseSinkThreadLogoff +// ----------------------------------------------------------------------------- +// +void CDisplaySinkNGA::BaseSinkThreadLogoff() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseSinkThreadLogoff()<"), RThread().Id().operator TUint())); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseSinkThreadLogoff()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkNGA::BaseUpdateSinkParamsL +// ----------------------------------------------------------------------------- +// +void CDisplaySinkNGA::BaseUpdateSinkParamsL( const TDisplaySinkParams& aParams ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseUpdateSinkParamsL()<"), RThread().Id().operator TUint())); + iNewParams = static_cast< const TDisplaySinkParamsNGA& >( aParams ); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseUpdateSinkParamsL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkNGA::BaseDoUpdateParamsL +// ----------------------------------------------------------------------------- +// +void CDisplaySinkNGA::BaseDoUpdateParamsL() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseDoUpdateParamsL()<"), RThread().Id().operator TUint())); + iBitmapTable[ EFirstBitmap ].iBuffer = iNewParams.iSurfaceBuffer1; + iBitmapTable[ ESecondBitmap ].iBuffer = iNewParams.iSurfaceBuffer2; + UpdateExpectedFrameSizeL(); + if( iNewParams.iFrameRateLimit != iFrameRateInterval ) + { + SetFrameRateLimit( iNewParams.iFrameRateLimit ); + ResetFrameRateLimitter(); + } + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseDoUpdateParamsL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkNGA::BaseSetVideoFrameSizeL +// ----------------------------------------------------------------------------- +// +void CDisplaySinkNGA::BaseSetVideoFrameSizeL( const TSize& ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseSetVideoFrameSizeL()<"), RThread().Id().operator TUint())); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseSetVideoFrameSizeL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkNGA::BaseSizesMatch +// ----------------------------------------------------------------------------- +// +TBool CDisplaySinkNGA::BaseSizesMatch( const TSize& aSize) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseSizesMatch()<"), RThread().Id().operator TUint())); + TBool sizesMatch( iExpectedFrameSize == aSize ); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseSizesMatch()>"), RThread().Id().operator TUint())); + return sizesMatch; + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkNGA::BitmapEntry +// ----------------------------------------------------------------------------- +// +CDisplaySink::TBitmapEntry& CDisplaySinkNGA::BitmapEntry( TInt aIndex ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BitmapEntry(%d)<"), RThread().Id().operator TUint(), aIndex)); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BitmapEntry()>"), RThread().Id().operator TUint())); + return iBitmapTable[ aIndex ]; + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkNGA::BaseEmptyBufferL +// ----------------------------------------------------------------------------- +// +void CDisplaySinkNGA::BaseEmptyBufferL( TVtMMFDataBuffer& aVTMMFBuffer ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseEmptyBufferL()<"), RThread().Id().operator TUint())); + if ( BaseConvert( aVTMMFBuffer ) ) + { + CleanupStack::PopAndDestroy(); // iBitmapCS.Signal(); + iSupplier->BufferEmptiedL( iBuffer ); + } + else + { + if ( iVideoFrameQueue->IsStored() || !IsOkToSendFrame() ) + { + CleanupStack::PopAndDestroy(); // iBitmapCS.Signal(); + iSupplier->BufferEmptiedL( iBuffer ); + } + else + { + iVideoFrameQueue->Store( *iSupplier, static_cast(aVTMMFBuffer.GetMMFBuffer()), aVTMMFBuffer.GetFrameSize(), aVTMMFBuffer.Data()); + CleanupStack::PopAndDestroy(); // iBitmapCS.Signal(); + } + } + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseEmptyBufferL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkNGA::BaseSetBitmapAvailable( TBitmapNo aBitmapNo ) +// ----------------------------------------------------------------------------- +// +void CDisplaySinkNGA::BaseSetBitmapAvailable( TBitmapNo ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseSetBitmapAvailable()<"), RThread().Id().operator TUint())); + if ( iVideoFrameQueue->IsStored() ) + { + if ( IsOkToSendFrame() ) + { + BaseConvert( iVideoFrameQueue->Buffer() ); + } + iVideoFrameQueue->Release(); + } + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseSetBitmapAvailable()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkNGA::BaseVideoFrameSizeChangedL( const TSize& ) +// ----------------------------------------------------------------------------- +// +void CDisplaySinkNGA::BaseVideoFrameSizeChangedL( const TSize& ) + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseVideoFrameSizeChangedL()<"), RThread().Id().operator TUint())); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseVideoFrameSizeChangedL()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkNGA::NextFrame +// ----------------------------------------------------------------------------- +// +void CDisplaySinkNGA::NextFrame() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::NextFrame()<"), RThread().Id().operator TUint())); + iBitmapCS.Wait(); + if ( iVideoFrameQueue->IsStored() ) + { + if ( IsOkToSendFrame() ) + { + BaseConvert( iVideoFrameQueue->Buffer() ); + } + iVideoFrameQueue->Release(); + } + iBitmapCS.Signal(); + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::NextFrame()>"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkDP::UpdateExpectedFrameSizeL() +// ----------------------------------------------------------------------------- +// +void CDisplaySinkNGA::UpdateExpectedFrameSizeL() + { + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::UpdateExpectedFrameSizeL()<"), RThread().Id().operator TUint())); + iExpectedFrameSize = iNewParams.iFrameSize; + _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::UpdateExpectedFrameSizeL()>"), RThread().Id().operator TUint())); + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/src/CVtImage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/src/CVtImage.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,85 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + +// INCLUDE FILES + +#include "cvtimage.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtImage::Type() const +// ----------------------------------------------------------------------------- +// +EXPORT_C CVtImage::TVtImageType CVtImage::Type() const + { + return iType; + } + +// ----------------------------------------------------------------------------- +// CVtImage::DisplayModeToVtDisplayMode( TDisplayMode aMode ) +// ----------------------------------------------------------------------------- +// +CVtImage::TVtDisplayMode CVtImage::DisplayModeToVtDisplayMode( + TDisplayMode aMode ) + { + TVtDisplayMode mode; + + switch( aMode ) + { + case EColor4K: + mode = EVtColor4K; + break; + + case EColor64K: + mode = EVtColor64K; + break; + + case EColor16M: + mode = EVtColor16M; + break; + + case EColor16MU: + mode = EVtColor16MU; + break; + + case EColor16MA: + case EColor16MAP: + mode = EVtColor16MA; + break; + + default: + mode = EVtColorNone; + break; + } + + return mode; + } + +// ----------------------------------------------------------------------------- +// CVtImage::CVtImage( TVtImageType aType ) +// ----------------------------------------------------------------------------- +// +CVtImage::CVtImage( TVtImageType aType ) +: iType( aType ) + { + } + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/src/CVtImageBitmap.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/src/CVtImageBitmap.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,181 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + +// INCLUDE FILES + +#include +#include + +#include "CVtImageBitmap.h" + +// MACROS + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtImageBitmap::NewL( TInt aBitmapHandle ) +// ----------------------------------------------------------------------------- +EXPORT_C CVtImageBitmap* CVtImageBitmap::NewL( TInt aBitmapHandle ) + { + CVtImageBitmap* self = new ( ELeave ) CVtImageBitmap(); + CleanupStack::PushL( self ); + self->ConstructL( aBitmapHandle ); + CleanupStack::Pop(); // self + return self; + } + +// ----------------------------------------------------------------------------- +// CVtImageBitmap::NewL( const TSize& aSize, TDisplayMode aDisplayMode ) +// ----------------------------------------------------------------------------- +EXPORT_C CVtImageBitmap* CVtImageBitmap::NewL( + const TSize& aSize, + TDisplayMode aDisplayMode ) + { + CVtImageBitmap* self = new ( ELeave ) CVtImageBitmap(); + CleanupStack::PushL( self ); + self->ConstructL( aSize, aDisplayMode ); + CleanupStack::Pop(); // self + return self; + } + +// ----------------------------------------------------------------------------- +// CVtImageBitmap::~CVtImageBitmap() +// ----------------------------------------------------------------------------- +EXPORT_C CVtImageBitmap::~CVtImageBitmap() + { + delete iBitmap; + } + +// ----------------------------------------------------------------------------- +// CVtImageBitmap::ResizeL( const TSize& aSize ) +// ----------------------------------------------------------------------------- +EXPORT_C void CVtImageBitmap::ResizeL( const TSize& aSize ) + { + User::LeaveIfError( iBitmap->Resize( aSize ) ); + } + +// ----------------------------------------------------------------------------- +// CVtImageBitmap::SetBitmapL( TInt aBitmapHandle ) +// ----------------------------------------------------------------------------- +EXPORT_C void CVtImageBitmap::SetBitmapL( TInt aBitmapHandle ) + { + delete iBitmap; + iBitmap = 0; + ConstructL( aBitmapHandle ); + } + +// ----------------------------------------------------------------------------- +// CVtImageBitmap::Bitmap() const +// ----------------------------------------------------------------------------- +EXPORT_C CFbsBitmap& CVtImageBitmap::Bitmap() const + { + return *iBitmap; + } + +// ----------------------------------------------------------------------------- +// CVtImageBitmap::NeedHeapLock() const +// ----------------------------------------------------------------------------- +TBool CVtImageBitmap::NeedHeapLock() const + { + return iBitmap->IsLargeBitmap(); + } + +// ----------------------------------------------------------------------------- +// CVtImageBitmap::DisplayMode() const +// ----------------------------------------------------------------------------- +CVtImage::TVtDisplayMode CVtImageBitmap::DisplayMode() const + { + return CVtImage::DisplayModeToVtDisplayMode( iBitmap->DisplayMode() ); + } + +// ----------------------------------------------------------------------------- +// CVtImageBitmap::Size() const +// ----------------------------------------------------------------------------- +TSize CVtImageBitmap::Size() const + { + return iBitmap->SizeInPixels(); + } + +// ----------------------------------------------------------------------------- +// CVtImageBitmap::BytesPerRow() const +// ----------------------------------------------------------------------------- +TInt CVtImageBitmap::BytesPerRow() const + { + return iBitmap->ScanLineLength( Size().iWidth, iBitmap->DisplayMode() ); + } + +// ----------------------------------------------------------------------------- +// CVtImageBitmap::DataAddress() const +// ----------------------------------------------------------------------------- +TUint32* CVtImageBitmap::DataAddress() const + { + return iBitmap->DataAddress(); + } + +// ----------------------------------------------------------------------------- +// CVtImageBitmap::LineAddress( TInt aLine ) const +// ----------------------------------------------------------------------------- +TUint32* CVtImageBitmap::LineAddress( TInt aLine ) const + { + if( aLine < 0 ) + { + aLine = 0; + } + else if( aLine > Size().iHeight - 1 ) + { + aLine = Size().iHeight - 1; + } + return reinterpret_cast< TUint32* >( + reinterpret_cast< TUint8* >( DataAddress() ) + BytesPerRow() * aLine ); + } + +// ----------------------------------------------------------------------------- +// CVtImageBitmap::CVtImageBitmap() +// ----------------------------------------------------------------------------- +CVtImageBitmap::CVtImageBitmap() +: CVtImage( CVtImage::EVtImageBitmap ) + { + } + +// ----------------------------------------------------------------------------- +// CVtImageBitmap::ConstructL( const TSize& aSize, TDisplayMode aDisplayMode ) +// ----------------------------------------------------------------------------- +void CVtImageBitmap::ConstructL( const TSize& aSize, TDisplayMode aDisplayMode ) + { + iBitmap = new ( ELeave ) CFbsBitmap(); + User::LeaveIfError( iBitmap->Create( aSize, aDisplayMode ) ); + } + +// ----------------------------------------------------------------------------- +// CVtImageBitmap::ConstructL( TInt aBitmapHandle ) +// ----------------------------------------------------------------------------- +void CVtImageBitmap::ConstructL( TInt aBitmapHandle ) + { + iBitmap = new ( ELeave ) CFbsBitmap(); + User::LeaveIfError( iBitmap->Duplicate( aBitmapHandle ) ); + } + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/src/CVtImageConverter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/src/CVtImageConverter.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,1894 @@ +/* +* Copyright (c) 2004 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: YUV to bitmap and bitmap to YUV conversion routines for VT +* +*/ + + +// INCLUDE FILES + +#include +#include +#include "cvtimageconverter.h" + +// LOCAL CONSTANTS AND MACROS + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// Calculates average for two integer values +#define AVG( a, b ) ( ( a + b ) >> 1 ) + +// MODULE DATA STRUCTURES + +/** +* Holds data for one YUV pixel +* +* @lib VTImageConverter.lib +*/ +struct TVSYCrCb + { + public: + // Y data + TInt iY; + + // Cb (U) data + TInt iCb; + + // Cr (V) data + TInt iCr; + }; + +// LOCAL FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS + +// ============================= LOCAL FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// RGBtoYCbCr( TVSYCrCb* aYuv, const TRgb& aColor ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TUint8 RGBtoYCbCr( TVSYCrCb* aYuv, const TRgb& aColor ) + { + const TInt YRedFactor = 19595; // 0.299 << 16 + const TInt YGreenFactor = 38470; // 0.587 << 16 + const TInt YBlueFactor = 7471; // 0.114 << 16 + const TInt CbRedFactor = 11056; // 0.1687 << 16 + const TInt CbGreenFactor = 21712; // 0.3313 << 16 + const TInt CrGreenFactor = 27440; // 0.4187 << 16 + const TInt CrBlueFactor = 5328; // 0.0813 << 16 + + TInt red = aColor.Red(); + TInt green = aColor.Green(); + TInt blue = aColor.Blue(); + + aYuv->iY = ( YRedFactor * red ) + + ( YGreenFactor * green ) + + ( YBlueFactor * blue ); + aYuv->iCb = - ( CbRedFactor * red ) - + ( CbGreenFactor * green ) + + ( blue << 15 ); + aYuv->iCr = ( red << 15 ) - + ( CrGreenFactor * green ) - + ( CrBlueFactor * blue ); + + aYuv->iY >>= 16; + aYuv->iCb >>= 16; + aYuv->iCr >>= 16; + + aYuv->iCb += 128; + aYuv->iCr += 128; + + return static_cast< TUint8 >( aYuv->iY ); + } + +// ----------------------------------------------------------------------------- +// VSReadColor4K( TAny*& aSource ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TRgb VSReadColor4K( TAny*& aSource ) + { + TUint16* s = static_cast< TUint16* >( aSource ); + TRgb rgb( TRgb::Color4K( *s++ ) ); + aSource = s; + return rgb; + } + +// ----------------------------------------------------------------------------- +// VSReadColor64K( TAny*& aSource ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TRgb VSReadColor64K( TAny*& aSource ) + { + TUint16* s = static_cast< TUint16* >( aSource ); + TRgb rgb( TRgb::Color64K( *s++ ) ); + aSource = s; + return rgb; + } + +// ----------------------------------------------------------------------------- +// VSReadColor16M( TAny*& aSource ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TRgb VSReadColor16M( TAny*& aSource ) + { + TUint8* s = static_cast< TUint8* >( aSource ); + TRgb rgb( s[ 2 ], s[ 1 ], s[ 0 ] ); + aSource = s + 3; + return rgb; + } + +// ----------------------------------------------------------------------------- +// VSReadColor16MU( TAny*& aSource ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TRgb VSReadColor16MU( TAny*& aSource ) + { + TUint32* s = static_cast< TUint32* >( aSource ); + TRgb rgb( TRgb::Color16MU( *s++ ) ); + aSource = s; + return rgb; + } + +// ----------------------------------------------------------------------------- +// VSReadColor16MA( TAny*& aSource ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TRgb VSReadColor16MA( TAny*& aSource ) + { + TUint32* s = static_cast< TUint32* >( aSource ); + TRgb rgb( TRgb::Color16MA( *s++ ) ); + aSource = s; + return rgb; + } + +// ----------------------------------------------------------------------------- +// VSReadColor16MAP( TAny*& aSource ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TRgb VSReadColor16MAP( TAny*& aSource ) + { + TUint32* s = static_cast< TUint32* >( aSource ); + TRgb rgb( TRgb::Color16MAP( *s++ ) ); + aSource = s; + return rgb; + } + +// ============================ MEMBER FUNCTIONS =============================== + +/** +* +*/ +const TUint8 CVTYUVFbsBitmapConverter::COFF_TBL_4K[ 80 ]= + { + 0xe9,0x66,0x01,0x00, // KRedCrFactor + 0x1a,0x58,0x00,0x00, // KGreenCbFactor + 0xd2,0xb6,0x00,0x00, // KGreenCrFactor + 0xa2,0xc5,0x01,0x00, // KBlueCbFactor + + 0x00,0x00,0x00,0x00, // 4-bit + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, // 5 + 0x00,0x00,0x00,0x00, + 0x00,0x01,0x02,0x03, + 0x04,0x05,0x06,0x07, + 0x08,0x09,0x0a,0x0b, + 0x0c,0x0d,0x0e,0x0f, // 10 + 0x0f,0x0f,0x0f,0x0f, + 0x0f,0x0f,0x0f,0x0f, + 0x0f,0x0f,0x0f,0x0f, + 0x0f,0x0f,0x0f,0x0f, + 0x0f,0x0f,0x0f,0x0f, // 15 + 0x0f,0x0f,0x0f,0x0f + }; + +/** +* +*/ +const TUint8 CVTYUVFbsBitmapConverter::COFF_TBL_64K[ 220 ]= + { + 0xe9,0x66,0x01,0x00, // KRedCrFactor + 0x1a,0x58,0x00,0x00, // KGreenCbFactor + 0xd2,0xb6,0x00,0x00, // KGreenCrFactor + 0xa2,0xc5,0x01,0x00, // KBlueCbFactor + + 0x00,0x00,0x00,0x00, // 5-bit + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x01,0x02,0x03, + 0x04,0x05,0x06,0x07, + 0x08,0x09,0x0a,0x0b, + 0x0c,0x0d,0x0e,0x0f, + 0x10,0x11,0x12,0x13, + 0x14,0x15,0x16,0x17, + 0x18,0x19,0x1a,0x1b, + 0x1c,0x1d,0x1e,0x1f, + 0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f,0x1f,0x1f, + + 0x00,0x00,0x00,0x00, // 6-bit + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x01,0x02,0x03, + 0x04,0x05,0x06,0x07, + 0x08,0x09,0x0a,0x0b, + 0x0c,0x0d,0x0e,0x0f, + 0x10,0x11,0x12,0x13, + 0x14,0x15,0x16,0x17, + 0x18,0x19,0x1a,0x1b, + 0x1c,0x1d,0x1e,0x1f, + 0x20,0x21,0x22,0x23, + 0x24,0x25,0x26,0x27, + 0x28,0x29,0x2a,0x2b, + 0x2c,0x2d,0x2e,0x2f, + 0x30,0x31,0x32,0x33, + 0x34,0x35,0x36,0x37, + 0x38,0x39,0x3a,0x3b, + 0x3c,0x3d,0x3e,0x3f, + 0x3f,0x3f,0x3f,0x3f, + 0x3f,0x3f,0x3f,0x3f, + 0x3f,0x3f,0x3f,0x3f, + 0x3f,0x3f,0x3f,0x3f, + 0x3f,0x3f,0x3f,0x3f, + 0x3f,0x3f,0x3f,0x3f, + 0x3f,0x3f,0x3f,0x3f, + 0x3f,0x3f,0x3f,0x3f, + 0x3f,0x3f,0x3f,0x3f, + 0x3f,0x3f,0x3f,0x3f, + 0x3f,0x3f,0x3f,0x3f + }; + +/** +* +*/ +const TUint8 CVTYUVFbsBitmapConverter::COFF_TBL_16M[ 528 ] = + { + 0xe9,0x66,0x01,0x00, // KRedCrFactor + 0x1a,0x58,0x00,0x00, // KGreenCbFactor + 0xd2,0xb6,0x00,0x00, // KGreenCrFactor + 0xa2,0xc5,0x01,0x00, // KBlueCbFactor + + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + + 0x00,0x01,0x02,0x03, // 8-bit + 0x04,0x05,0x06,0x07, + 0x08,0x09,0x0a,0x0b, + 0x0c,0x0d,0x0e,0x0f, + + 0x10,0x11,0x12,0x13, + 0x14,0x15,0x16,0x17, + 0x18,0x19,0x1a,0x1b, + 0x1c,0x1d,0x1e,0x1f, + + 0x20,0x21,0x22,0x23, + 0x24,0x25,0x26,0x27, + 0x28,0x29,0x2a,0x2b, + 0x2c,0x2d,0x2e,0x2f, + + 0x30,0x31,0x32,0x33, + 0x34,0x35,0x36,0x37, + 0x38,0x39,0x3a,0x3b, + 0x3c,0x3d,0x3e,0x3f, + + 0x40,0x41,0x42,0x43, + 0x44,0x45,0x46,0x47, + 0x48,0x49,0x4a,0x4b, + 0x4c,0x4d,0x4e,0x4f, + + 0x50,0x51,0x52,0x53, + 0x54,0x55,0x56,0x57, + 0x58,0x59,0x5a,0x5b, + 0x5c,0x5d,0x5e,0x5f, + + 0x60,0x61,0x62,0x63, + 0x64,0x65,0x66,0x67, + 0x68,0x69,0x6a,0x6b, + 0x6c,0x6d,0x6e,0x6f, + + 0x70,0x71,0x72,0x73, + 0x74,0x75,0x76,0x77, + 0x78,0x79,0x7a,0x7b, + 0x7c,0x7d,0x7e,0x7f, + + 0x80,0x81,0x82,0x83, + 0x84,0x85,0x86,0x87, + 0x88,0x89,0x8a,0x8b, + 0x8c,0x8d,0x8e,0x8f, + + 0x90,0x91,0x92,0x93, + 0x94,0x95,0x96,0x97, + 0x98,0x99,0x9a,0x9b, + 0x9c,0x9d,0x9e,0x9f, + + 0xa0,0xa1,0xa2,0xa3, + 0xa4,0xa5,0xa6,0xa7, + 0xa8,0xa9,0xaa,0xab, + 0xac,0xad,0xae,0xaf, + + 0xb0,0xb1,0xb2,0xb3, + 0xb4,0xb5,0xb6,0xb7, + 0xb8,0xb9,0xba,0xbb, + 0xbc,0xbd,0xbe,0xbf, + + 0xc0,0xc1,0xc2,0xc3, + 0xc4,0xc5,0xc6,0xc7, + 0xc8,0xc9,0xca,0xcb, + 0xcc,0xcd,0xce,0xcf, + + 0xd0,0xd1,0xd2,0xd3, + 0xd4,0xd5,0xd6,0xd7, + 0xd8,0xd9,0xda,0xdb, + 0xdc,0xdd,0xde,0xdf, + + 0xe0,0xe1,0xe2,0xe3, + 0xe4,0xe5,0xe6,0xe7, + 0xe8,0xe9,0xea,0xeb, + 0xec,0xed,0xee,0xef, + + 0xf0,0xf1,0xf2,0xf3, + 0xf4,0xf5,0xf6,0xf7, + 0xf8,0xf9,0xfa,0xfb, + 0xfc,0xfd,0xfe,0xff, + + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff + }; + +// ============================ CVTYUVFbsBitmapConverter ======================= + +// ----------------------------------------------------------------------------- +// CVTYUVFbsBitmapConverter::CVTYUVFbsBitmapConverter( +// const TSize& aSourceSize ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CVTYUVFbsBitmapConverter::CVTYUVFbsBitmapConverter( const TSize& aSourceSize ) +: iSourceSize( aSourceSize ) + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVFbsBitmapConverter::CVTYUVFbsBitmapConverter() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVFbsBitmapConverter::CVTYUVFbsBitmapConverter() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVTYUVFbsBitmapConverter::~CVTYUVFbsBitmapConverter() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CVTYUVFbsBitmapConverter::~CVTYUVFbsBitmapConverter() + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVFbsBitmapConverter::~CVTYUVFbsBitmapConverter() >>"), RThread().Id().operator TUint())); + delete iDestination; + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVFbsBitmapConverter::~CVTYUVFbsBitmapConverter() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVTYUVFbsBitmapConverter::ProcessL() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CVTYUVFbsBitmapConverter::ProcessL() + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVFbsBitmapConverter::ProcessL() >>"), RThread().Id().operator TUint())); + switch( iDestination->DisplayMode() ) + { + case EColor4K: + DoProcess4K(); + break; + + case EColor64K: + DoProcess64K(); + break; + + case EColor16M: + DoProcess16M(); + break; + + case EColor16MU: + case EColor16MA: // 16MU and 16MA are handled equally + DoProcess16MU16MA(); + break; + + default: + User::Leave( KErrNotSupported ); + break; + }; + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVFbsBitmapConverter::ProcessL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVTYUVFbsBitmapConverter::SetDestinationL( +// const CFbsBitmap& aDestinationBitmap ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CVTYUVFbsBitmapConverter::SetDestinationL( + const CFbsBitmap& aDestinationBitmap ) + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVFbsBitmapConverter::SetDestinationL() >>"), RThread().Id().operator TUint())); + SetDestinationL( aDestinationBitmap.Handle() ); + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVFbsBitmapConverter::SetDestinationL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVTYUVFbsBitmapConverter::SetDestinationL( TInt aHandle ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CVTYUVFbsBitmapConverter::SetDestinationL( TInt aHandle ) + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVFbsBitmapConverter::SetDestinationL() >>"), RThread().Id().operator TUint())); + ReConstructL( aHandle ); + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVFbsBitmapConverter::SetDestinationL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVTYUVFbsBitmapConverter::ConstructL( TInt aBitmapHandle ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVTYUVFbsBitmapConverter::ConstructL( TInt aBitmapHandle ) + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVFbsBitmapConverter::ConstructL() >>"), RThread().Id().operator TUint())); + iDestination = new (ELeave) CFbsBitmap(); + ReConstructL( aBitmapHandle ); + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVFbsBitmapConverter::ConstructL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVTYUVFbsBitmapConverter::ReConstructL( TInt aBitmapHandle ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVTYUVFbsBitmapConverter::ReConstructL( TInt aBitmapHandle ) + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVFbsBitmapConverter::ReConstructL() >>"), RThread().Id().operator TUint())); + User::LeaveIfError( iDestination->Duplicate( aBitmapHandle ) ); + // make sure that destination bitmap's displaymode is supported + if( ( iDestination->DisplayMode() != EColor4K ) && + ( iDestination->DisplayMode() != EColor64K ) && + ( iDestination->DisplayMode() != EColor16M ) && + ( iDestination->DisplayMode() != EColor16MU ) && + ( iDestination->DisplayMode() != EColor16MA ) + ) + { + User::Leave( KErrNotSupported ); + } + iDestinationSize = iDestination->SizeInPixels(); + SizeUpdateL(); + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVFbsBitmapConverter::ReConstructL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVTYUVFbsBitmapConverter::SizeUpdateL() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVTYUVFbsBitmapConverter::SizeUpdateL() + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVFbsBitmapConverter::SizeUpdate() >>"), RThread().Id().operator TUint())); + if( ( SourceSize().iWidth < 2 ) || ( DestinationSize().iWidth < 2 ) ) + { + User::Leave( KErrNotSupported ); // !!!! + } + + iVSkipReal = TReal32( SourceSize().iHeight ) / + TReal32( DestinationSize().iHeight ); + iHSkipReal = TReal32( SourceSize().iWidth ) / + TReal32( DestinationSize().iWidth ); + + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVFbsBitmapConverter::SizeUpdate() <<"), RThread().Id().operator TUint())); + } + +// ============================ CVTYUVPlanarFbsBitmapConverter =============================== + +// ----------------------------------------------------------------------------- +// CVTYUVPlanarFbsBitmapConverter::SetSourceSizeL( const TSize& aSize ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CVTYUVPlanarFbsBitmapConverter::SetSourceSizeL( + const TSize& aSize ) + { + iSourceSize = aSize; + SizeUpdateL(); + } + +// ----------------------------------------------------------------------------- +// CVTYUVPlanarFbsBitmapConverter::SetSourceL( +// const TSize& aSize, const TDesC8& aSourceData ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CVTYUVPlanarFbsBitmapConverter::SetSourceL( + const TSize& aSize, + const TDesC8& aSourceData ) + { + iSourceSize = aSize; + SetSourceL( aSourceData ); + SizeUpdateL(); + } + +// ----------------------------------------------------------------------------- +// CVTYUVPlanarFbsBitmapConverter::CVTYUVPlanarFbsBitmapConverter( +// const TSize& aSourceSize ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CVTYUVPlanarFbsBitmapConverter::CVTYUVPlanarFbsBitmapConverter( + const TSize& aSourceSize ) +: CVTYUVFbsBitmapConverter( aSourceSize ) + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::CVTYUVPlanarFbsBitmapConverter() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::CVTYUVPlanarFbsBitmapConverter() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVTYUVPlanarFbsBitmapConverter::DoProcess4K() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVTYUVPlanarFbsBitmapConverter::DoProcess4K() + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess4K() >>"), RThread().Id().operator TUint())); + + // Vertical scaling needed? + if( ( iVSkipReal == 1 ) && ( iHSkipReal == 1 ) ) + { + // NO: Use really fast conversion + DoProcess4KNoScale(); + } + else + { + + // YES: Use slower conversion method + const TUint8* y = iY; + const TUint8* u = iU; + const TUint8* v = iV; + const TUint8* clip = COFF_TBL_4K + 40; + + TInt height = DestinationSize().iHeight; + TInt width = DestinationSize().iWidth; + + iDestination->LockHeap(); + TUint32* d = iDestination->DataAddress(); + + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess4K(): [%d, %d] for >>"), RThread().Id().operator TUint(), width, height )); + + for( TInt h = 0; h < height; h++ ) + { + TInt sourceY = TInt( TReal32( h ) * iVSkipReal ); + TInt hTimesW = sourceY * SourceSize().iWidth; + TInt uvIdx = ( sourceY >> 1 ) * ( SourceSize().iWidth >> 1 ); + for( TInt w = 0; w < width; w++ ) + { + TInt sourceX = TInt( TReal32( w ) * iHSkipReal ); + TInt uvIdxW( uvIdx + ( sourceX >> 1 ) ); + + TInt ay = y[ hTimesW + sourceX ]; + TInt cb = u[ uvIdxW ] - 128; + TInt cr = v[ uvIdxW ] - 128; + + TInt greenCbCr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 32 ) + + cb * *reinterpret_cast< const TInt32* >( clip - 36 ) + ) >> 16; + cr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 40 ) + ) >> 16; + cb = + ( + cb * *reinterpret_cast< const TInt32* >( clip - 28 ) + ) >> 16; + + TInt red = ay + cr; + TInt green = ay - greenCbCr; + TInt blue = ay + cb; + + red = clip[ red >> 4 ]; + green = clip[ green >> 4 ]; + blue = clip[ blue >> 4 ]; + + // RGB_444 + TUint32 s = green | ( red << 4 ); + s = blue | ( s << 4 ); + + w++; + sourceX = TInt( TReal32( w ) * iHSkipReal ); + uvIdxW = uvIdx + ( sourceX >> 1 ); + + ay = y[ hTimesW + sourceX ]; + cb = u[ uvIdxW ] - 128; + cr = v[ uvIdxW ] - 128; + + greenCbCr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 32 ) + + cb * *reinterpret_cast< const TInt32* >( clip - 36 ) + ) >> 16; + cr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 40 ) + ) >> 16; + cb = + ( + cb * *reinterpret_cast< const TInt32* >( clip - 28 ) + ) >> 16; + + red = ay + cr; + green = ay - greenCbCr; + blue = ay + cb; + + red = clip[ red >> 4 ]; + green = clip[ green >> 4 ]; + blue = clip[ blue >> 4 ]; + + // RGB_444 + s |= ( ( green | ( red << 4 ) ) << 4 | blue ) << 16; + + *d++ = s; + } + } + + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess4K(): for <<"), RThread().Id().operator TUint())); + + iDestination->UnlockHeap(); + } + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess4K() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVTYUVPlanarFbsBitmapConverter::DoProcess4KNoScale() +// When vertical and horizontal scaling is not required we can do two vertical +// lines in parallel in that case we need to calculate Cr and Cb values only +// once for four pixels. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVTYUVPlanarFbsBitmapConverter::DoProcess4KNoScale() + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess4KNoScale() >>"), RThread().Id().operator TUint())); + + TInt height( SourceSize().iHeight >> 1 ); + TInt width( SourceSize().iWidth ); + + const TUint32* y1 = reinterpret_cast< const TUint32* >( iY ); + const TUint32* u = reinterpret_cast< const TUint32* >( iU ); + const TUint32* v = reinterpret_cast< const TUint32* >( iV ); + + iDestination->LockHeap(); + + TUint32 uintsPerDestRow = CFbsBitmap::ScanLineLength + ( DestinationSize().iWidth, EColor4K ) >> 2; + + TUint32* d1 = iDestination->DataAddress(); + + TUint32 ywidth = width >> 2; + + width >>= 3; + + TInt32 cb; + TInt32 cr; + TInt32 greenCbCr; + TInt32 yy; + TInt32 red; + TInt32 green; + TInt32 blue; + TUint32 r1; + const TUint8* clip = COFF_TBL_4K + 40; + + for( TInt y = 0; y < height; y++ ) + { + for( TInt x = 0; x < width; x++ ) + { + TUint32 u1 = *u++; + TUint32 v1 = *v++; + + for( TInt c2 = 0; c2 < 2; c2++ ) + { + TUint32 yy2 = y1[ ywidth ]; + TUint32 yy1 = *y1++; + + for( TInt c = 0; c < 2; c++ ) + { + cb = TInt32( u1 & 0xff ) - 128; + u1 >>= 8; + cr = TInt32( v1 & 0xff ) - 128; + v1 >>= 8; + + greenCbCr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 32 ) + + cb * *reinterpret_cast< const TInt32* >( clip - 36 ) + ) >> 16; + cr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 40 ) + ) >> 16; + cb = + ( + cb * *reinterpret_cast< const TInt32* >( clip - 28 ) + ) >> 16; + + // lower left + yy = ( yy2 & 0xff ); + yy2 >>= 8; + + red = yy + cr; + green = yy - greenCbCr; + blue = yy + cb; + + red = clip[ red >> 4 ]; + green = clip[ green >> 4 ]; + blue = clip[ blue >> 4 ]; + + // RGB_444 + r1 = green | ( red << 4 ); + r1 = blue | ( r1 << 4 ); + + // lower right + yy = ( yy2 & 0xff ); + yy2 >>= 8; + + red = yy + cr; + green = yy - greenCbCr; + blue = yy + cb; + + red = clip[ red >> 4 ]; + green = clip[ green >> 4 ]; + blue = clip[ blue >> 4 ]; + + // RGB_444 + r1 |= ( ( green | ( red << 4 ) ) << 4 | blue ) << 16; + + d1[ uintsPerDestRow ] = r1; + + // upper left + yy = ( yy1 & 0xff ); + yy1 >>= 8; + + red = yy + cr; + green = yy - greenCbCr; + blue = yy + cb; + + red = clip[ red >> 4 ]; + green = clip[ green >> 4 ]; + blue = clip[ blue >> 4 ]; + + // RGB_444 + r1 = green | ( red << 4 ); + r1 = blue | ( r1 << 4 ); + + // upper right + yy = ( yy1 & 0xff ); + yy1 >>= 8; + + red = yy + cr; + green = yy - greenCbCr; + blue = yy + cb; + + red = clip[ red >> 4 ]; + green = clip[ green >> 4 ]; + blue = clip[ blue >> 4 ]; + + // RGB_444 + r1 |= ( ( green | ( red << 4 ) ) << 4 | blue ) << 16; + + *d1++ = r1; + } + } + } + + y1 += ( width << 1 ); + d1 += uintsPerDestRow; + } + + iDestination->UnlockHeap(); + + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess4KNoScale() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVTYUVPlanarFbsBitmapConverter::DoProcess64K() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVTYUVPlanarFbsBitmapConverter::DoProcess64K() + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess64K() >>"), RThread().Id().operator TUint())); + + // Vertical scaling needed? + if( ( iVSkipReal == 1 ) && ( iHSkipReal == 1 ) ) // !!! + { + // NO: Use really fast conversion + DoProcess64KNoScale(); + return; + } + else + { + // YES: Use slower conversion method + const TUint8* y = iY; + const TUint8* u = iU; + const TUint8* v = iV; + const TUint8* clip = COFF_TBL_64K + 40; + + TInt height = DestinationSize().iHeight; + TInt width = DestinationSize().iWidth; + + iDestination->LockHeap(); + TUint32* d = iDestination->DataAddress(); + + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess64K(): [%d, %d] for >>"), RThread().Id().operator TUint(), width, height )); + + for( TInt h = 0; h < height; h++ ) + { + TInt sourceY = TInt( TReal32( h ) * iVSkipReal ); + TInt hTimesW = sourceY * SourceSize().iWidth; + TInt uvIdx = ( sourceY >> 1 ) * ( SourceSize().iWidth >> 1 ); + for( TInt w = 0; w < width; w++ ) + { + TInt sourceX = TInt( TReal32( w ) * iHSkipReal ); + + TInt uvIdxW( uvIdx + ( sourceX >> 1 ) ); + + TInt ay = y[ hTimesW + sourceX ]; + TInt cb = u[ uvIdxW ] - 128; + TInt cr = v[ uvIdxW ] - 128; + + TInt greenCbCr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 32 ) + + cb * *reinterpret_cast< const TInt32* >( clip - 36 ) - + 0x1200000 + ) >> 16; + cr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 40 ) + ) >> 16; + cb = + ( + cb * *reinterpret_cast< const TInt32* >( clip - 28 ) + ) >> 16; + + TInt red = ay + cr; + TInt green = ay - greenCbCr; + TInt blue = ay + cb; + + red = clip[ red >> 3 ]; + green = clip[ green >> 2 ]; + blue = clip[ blue >> 3 ]; + + // RGB_565 + TUint32 s = green | ( red << 6 ); + s = blue | ( s << 5 ); + + w++; + sourceX = TInt( TReal32( w ) * iHSkipReal ); + + uvIdxW = uvIdx + ( sourceX >> 1 ); + + ay = y[ hTimesW + sourceX ]; + cb = u[ uvIdxW ] - 128; + cr = v[ uvIdxW ] - 128; + + greenCbCr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 32 ) + + cb * *reinterpret_cast< const TInt32* >( clip - 36 ) - + 0x1200000 + ) >> 16; + cr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 40 ) + ) >> 16; + cb = + ( + cb * *reinterpret_cast< const TInt32* >( clip - 28 ) + ) >> 16; + + red = ay + cr; + green = ay - greenCbCr; + blue = ay + cb; + + red = clip[ red >> 3 ]; + green = clip[ green >> 2 ]; + blue = clip[ blue >> 3 ]; + + s |= ( ( green | ( red << 6 ) ) << 5 | blue ) << 16; + + *d++ = s; + } + } + + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess64K(): for <<"), RThread().Id().operator TUint())); + + iDestination->UnlockHeap(); + } + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess64K() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVTYUVPlanarFbsBitmapConverter::DoProcess64KNoScale() +// Source YUV image must be even divisible by 8. +// ----------------------------------------------------------------------------- +// +void CVTYUVPlanarFbsBitmapConverter::DoProcess64KNoScale() + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess64KNoScale() >>"), RThread().Id().operator TUint())); + + TInt height( SourceSize().iHeight >> 1 ); + TInt width( SourceSize().iWidth ); + + const TUint32* y1 = reinterpret_cast< const TUint32* >( iY ); + const TUint32* u = reinterpret_cast< const TUint32* >( iU ); + const TUint32* v = reinterpret_cast< const TUint32* >( iV ); + + iDestination->LockHeap(); + + TUint32 uintsPerDestRow = CFbsBitmap::ScanLineLength + ( DestinationSize().iWidth, EColor64K ) >> 2; + + TUint32* d1 = iDestination->DataAddress(); + + TUint32 ywidth = width >> 2; + + width >>= 3; + + TInt32 cb; + TInt32 cr; + TInt32 greenCbCr; + TInt32 yy; + TInt32 red; + TInt32 green; + TInt32 blue; + TUint32 r1; + const TUint8* clip = COFF_TBL_64K + 40; + + for( TInt y = 0; y < height; y++ ) + { + for( TInt x = 0; x < width; x++ ) + { + TUint32 u1 = *u++; + TUint32 v1 = *v++; + + for( TInt c2 = 0; c2 < 2; c2++ ) + { + TUint32 yy2 = y1[ ywidth ]; + TUint32 yy1 = *y1++; + + for( TInt c = 0; c < 2; c++ ) + { + cb = TInt32( u1 & 0xff ) - 128; + u1 >>= 8; + cr = TInt32( v1 & 0xff ) - 128; + v1 >>= 8; + + greenCbCr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 32 ) + + cb * *reinterpret_cast< const TInt32* >( clip - 36 ) - + 0x1200000 + ) >> 16; + cr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 40 ) + ) >> 16; + cb = + ( + cb * *reinterpret_cast< const TInt32* >( clip - 28 ) + ) >> 16; + + // lower left + yy = ( yy2 & 0xff ); + yy2 >>= 8; + + red = yy + cr; + green = yy - greenCbCr; + blue = yy + cb; + + red = clip[ red >> 3 ]; + green = clip[ green >> 2 ]; + blue = clip[ blue >> 3 ]; + + // RGB_565 + r1 = green | ( red << 6 ); + r1 = blue | ( r1 << 5 ); + + // lower right + yy = ( yy2 & 0xff ); + yy2 >>= 8; + + red = yy + cr; + green = yy - greenCbCr; + blue = yy + cb; + + // clear lowest 3 bits + red = clip[ red >> 3 ]; + green = clip[ green >> 2 ]; + blue = clip[ blue >> 3 ]; + + // RGB_565 + r1 |= ( ( green | ( red << 6 ) ) << 5 | blue ) << 16; + + d1[ uintsPerDestRow ] = r1; + + // upper left + yy = ( yy1 & 0xff ); + yy1 >>= 8; + + red = yy + cr; + green = yy - greenCbCr; + blue = yy + cb; + + red = clip[ red >> 3 ]; + green = clip[ green >> 2 ]; + blue = clip[ blue >> 3 ]; + + // RGB_565 + r1 = green | ( red << 6 ); + r1 = blue | ( r1 << 5 ); + + // upper right + yy = ( yy1 & 0xff ); + yy1 >>= 8; + + red = yy + cr; + green = yy - greenCbCr; + blue = yy + cb; + + red = clip[ red >> 3 ]; + green = clip[ green >> 2 ]; + blue = clip[ blue >> 3 ]; + + // RGB_565 + r1 |= ( ( green | ( red << 6 ) ) << 5 | blue ) << 16; + + *d1++ = r1; + } + } + } + + y1 += ( width << 1 ); + d1 += uintsPerDestRow; + } + + iDestination->UnlockHeap(); + + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess64KNoScale() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVTYUVPlanarFbsBitmapConverter::DoProcess16M() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVTYUVPlanarFbsBitmapConverter::DoProcess16M() + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess16M() >>"), RThread().Id().operator TUint())); + + // Vertical scaling needed? + if( ( iVSkipReal == 1 ) && ( iHSkipReal == 1 ) ) + { + // NO: Use really fast conversion + DoProcess16MNoScale(); + } + else + { + // YES: Use slower conversion method + + // YES: Use slower conversion method + const TUint8* y = iY; + const TUint8* u = iU; + const TUint8* v = iV; + const TUint8* clip = COFF_TBL_16M + 144; + + TInt height = DestinationSize().iHeight; + TInt width = DestinationSize().iWidth; + + iDestination->LockHeap(); + + TUint8* d = reinterpret_cast( iDestination->DataAddress() ); + TUint32 dPitch = iDestination->ScanLineLength( width, iDestination->DisplayMode() ); + + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess16M(): [%d, %d] for >>"), RThread().Id().operator TUint(), width, height )); + + for( TInt h = 0; h < height; h++ ) + { + TInt sourceY = TInt( TReal32( h ) * iVSkipReal ); + TInt hTimesW = sourceY * SourceSize().iWidth; + TInt uvIdx = ( sourceY >> 1 ) * ( SourceSize().iWidth >> 1 ); + TUint8* dTemp = d; + for( TInt w = 0; w < width; w++ ) + { + TInt sourceX = TInt( TReal32( w ) * iHSkipReal ); + + TInt uvIdxW( uvIdx + ( sourceX >> 1 ) ); + + TInt ay = y[ hTimesW + sourceX ]; + TInt cb = u[ uvIdxW ] - 128; + TInt cr = v[ uvIdxW ] - 128; + + TInt greenCbCr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 136 ) + + cb * *reinterpret_cast< const TInt32* >( clip - 140 ) + ) >> 16; + cr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 144 ) + ) >> 16; + cb = + ( + cb * *reinterpret_cast< const TInt32* >( clip - 132 ) + ) >> 16; + + *dTemp++ = clip[ ay + cb ]; + *dTemp++ = clip[ ay - greenCbCr ]; + *dTemp++ = clip[ ay + cr ]; + } + d += dPitch; + } + + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess16M(): for <<"), RThread().Id().operator TUint())); + + iDestination->UnlockHeap(); + } + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess16M() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVTYUVPlanarFbsBitmapConverter::DoProcess16MNoScale() +// When vertical and horizontal scaling is not required we can do two vertical +// lines in parallel in that case we need to calculate Cr and Cb values only +// once for four pixels. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVTYUVPlanarFbsBitmapConverter::DoProcess16MNoScale() + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess16MNoScale() >>"), RThread().Id().operator TUint())); + + TInt height( SourceSize().iHeight >> 1 ); + TInt width( SourceSize().iWidth ); + + const TUint32* y1 = reinterpret_cast< const TUint32* >( iY ); + const TUint32* u = reinterpret_cast< const TUint32* >( iU ); + const TUint32* v = reinterpret_cast< const TUint32* >( iV ); + + iDestination->LockHeap(); + + TUint32 bytesPerDestRow = CFbsBitmap::ScanLineLength + ( DestinationSize().iWidth, EColor16M ); + + TUint8* d1 = reinterpret_cast< TUint8* >( iDestination->DataAddress() ); + + TUint32 ywidth = width >> 2; + + width >>= 3; + + TInt32 cb; + TInt32 cr; + TInt32 greenCbCr; + TInt32 yy; + TInt32 idx1; + TInt32 idx2; + const TUint8* clip = COFF_TBL_16M + 144; + + for( TInt y = 0; y < height; y++ ) + { + idx1 = 0; + idx2 = bytesPerDestRow; + + for( TInt x = 0; x < width; x++ ) + { + TUint32 u1 = *u++; + TUint32 v1 = *v++; + + for( TInt c2 = 0; c2 < 2; c2++ ) + { + TUint32 yy2 = y1[ ywidth ]; + TUint32 yy1 = *y1++; + + for( TInt c = 0; c < 2; c++ ) + { + cb = TInt32( u1 & 0xff ) - 128; + u1 >>= 8; + cr = TInt32( v1 & 0xff ) - 128; + v1 >>= 8; + + greenCbCr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 136 ) + + cb * *reinterpret_cast< const TInt32* >( clip - 140 ) + ) >> 16; + cr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 144 ) + ) >> 16; + cb = + ( + cb * *reinterpret_cast< const TInt32* >( clip - 132 ) + ) >> 16; + + // lower left + yy = ( yy2 & 0xff ); + yy2 >>= 8; + + d1[ idx2++ ] = clip[ yy + cb ]; + d1[ idx2++ ] = clip[ yy - greenCbCr ]; + d1[ idx2++ ] = clip[ yy + cr ]; + + // lower right + yy = ( yy2 & 0xff ); + yy2 >>= 8; + + d1[ idx2++ ] = clip[ yy + cb ]; + d1[ idx2++ ] = clip[ yy - greenCbCr ]; + d1[ idx2++ ] = clip[ yy + cr ]; + + // upper left + yy = ( yy1 & 0xff ); + yy1 >>= 8; + + d1[ idx1++ ] = clip[ yy + cb ]; + d1[ idx1++ ] = clip[ yy - greenCbCr ]; + d1[ idx1++ ] = clip[ yy + cr ]; + + // upper right + yy = ( yy1 & 0xff ); + yy1 >>= 8; + + d1[ idx1++ ] = clip[ yy + cb ]; + d1[ idx1++ ] = clip[ yy - greenCbCr ]; + d1[ idx1++ ] = clip[ yy + cr ]; + } + } + } + + y1 += ( width << 1 ); + d1 += bytesPerDestRow * 2; + } + + iDestination->UnlockHeap(); + + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess16MNoScale() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVTYUVPlanarFbsBitmapConverter::DoProcess16MU16MA() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVTYUVPlanarFbsBitmapConverter::DoProcess16MU16MA() + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess16MU16MA() >>"), RThread().Id().operator TUint())); + + // Vertical scaling needed? + if( ( iVSkipReal == 1 ) && ( iHSkipReal == 1 ) ) + { + // NO: Use really fast conversion + DoProcess16MU16MANoScale(); + } + else + { + // YES: Use slower conversion method + const TUint8* y = iY; + const TUint8* u = iU; + const TUint8* v = iV; + const TUint8* clip = COFF_TBL_16M + 144; + + TInt height = DestinationSize().iHeight; + TInt width = DestinationSize().iWidth; + + iDestination->LockHeap(); + TUint32* d = iDestination->DataAddress(); + + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess16MU16MA(): [%d, %d] for >>"), RThread().Id().operator TUint(), width, height )); + + for( TInt h = 0; h < height; h++ ) + { + TInt sourceY = TInt( TReal32( h ) * iVSkipReal ); + TInt hTimesW = sourceY * SourceSize().iWidth; + TInt uvIdx = ( sourceY >> 1 ) * ( SourceSize().iWidth >> 1 ); + for( TInt w = 0; w < width; w++ ) + { + TInt sourceX = TInt( TReal32( w ) * iHSkipReal ); + + TInt uvIdxW( uvIdx + ( sourceX >> 1 ) ); + + TInt ay = y[ hTimesW + sourceX ]; + TInt cb = u[ uvIdxW ] - 128; + TInt cr = v[ uvIdxW ] - 128; + + TInt greenCbCr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 136 ) + + cb * *reinterpret_cast< const TInt32* >( clip - 140 ) + ) >> 16; + cr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 144 ) + ) >> 16; + cb = + ( + cb * *reinterpret_cast< const TInt32* >( clip - 132 ) + ) >> 16; + + + // 0xffBBGG + TUint32 p = 0xff0000 | + ( clip[ ay + cr ] << 8 ) | clip[ ay - greenCbCr ]; + // 0xffBBGGRR + *d++ = clip[ ay + cb ] | ( p << 8 ); + } + } + + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess16MU16MA(): for <<"), RThread().Id().operator TUint())); + + iDestination->UnlockHeap(); + } + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess16MU16MA() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVTYUVPlanarFbsBitmapConverter::DoProcess16MU16MANoScale() +// When vertical and horizontal scaling is not required we can do two vertical +// lines in parallel in that case we need to calculate Cr and Cb values only +// once for four pixels. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVTYUVPlanarFbsBitmapConverter::DoProcess16MU16MANoScale() + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess16MU16MANoScale() >>"), RThread().Id().operator TUint())); + + TInt height( SourceSize().iHeight >> 1 ); + TInt width( SourceSize().iWidth ); + + const TUint32* y1 = reinterpret_cast< const TUint32* >( iY ); + const TUint32* u = reinterpret_cast< const TUint32* >( iU ); + const TUint32* v = reinterpret_cast< const TUint32* >( iV ); + + iDestination->LockHeap(); + + TUint32 uintsPerDestRow = CFbsBitmap::ScanLineLength + ( DestinationSize().iWidth, EColor16MU ) >> 2; + + TUint32* d1 = iDestination->DataAddress(); + + TUint32 ywidth = width >> 2; + + width >>= 3; + + TInt32 cb; + TInt32 cr; + TInt32 greenCbCr; + TInt32 yy; + TUint32 p; + const TUint8* clip = COFF_TBL_16M + 144; + + for( TInt y = 0; y < height; y++ ) + { + for( TInt x = 0; x < width; x++ ) + { + TUint32 u1 = *u++; + TUint32 v1 = *v++; + + for( TInt c2 = 0; c2 < 2; c2++ ) + { + TUint32 yy2 = y1[ ywidth ]; + TUint32 yy1 = *y1++; + + for( TInt c = 0; c < 2; c++ ) + { + cb = TInt32( u1 & 0xff ) - 128; + u1 >>= 8; + cr = TInt32( v1 & 0xff ) - 128; + v1 >>= 8; + + greenCbCr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 136 ) + + cb * *reinterpret_cast< const TInt32* >( clip - 140 ) + ) >> 16; + cr = + ( + cr * *reinterpret_cast< const TInt32* >( clip - 144 ) + ) >> 16; + cb = + ( + cb * *reinterpret_cast< const TInt32* >( clip - 132 ) + ) >> 16; + + // lower left + yy = ( yy2 & 0xff ); + yy2 >>= 8; + + // 0xffBBGG + p = 0xff0000 | + ( clip[ yy + cr ] << 8 ) | clip[ yy - greenCbCr ]; + // 0xffBBGGRR + d1[ uintsPerDestRow ] = clip[ yy + cb ] | ( p << 8 ); + + // lower right + yy = ( yy2 & 0xff ); + yy2 >>= 8; + + // 0xffBBGG + p = 0xff0000 | + ( clip[ yy + cr ] << 8 ) | clip[ yy - greenCbCr ]; + // 0xffBBGGRR + d1[ uintsPerDestRow + 1 ] = clip[ yy + cb ] | ( p << 8 ); + + // upper left + yy = ( yy1 & 0xff ); + yy1 >>= 8; + + // 0xffBBGG + p = 0xff0000 | + ( clip[ yy + cr ] << 8 ) | clip[ yy - greenCbCr ]; + // 0xffBBGGRR + *d1++ = clip[ yy + cb ] | ( p << 8 ); + + // upper right + yy = ( yy1 & 0xff ); + yy1 >>= 8; + + // 0xffBBGG + p = 0xff0000 | + ( clip[ yy + cr ] << 8 ) | clip[ yy - greenCbCr ]; + // 0xffBBGGRR + *d1++ = clip[ yy + cb ] | ( p << 8 ); + } + } + } + + y1 += ( width << 1 ); + d1 += uintsPerDestRow; + } + + iDestination->UnlockHeap(); + + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYUVPlanarFbsBitmapConverter::DoProcess16MU16MANoScale() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVTYUVPlanarFbsBitmapConverter::SetSourceL( const TDesC8& aSourceData ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CVTYUVPlanarFbsBitmapConverter::SetSourceL( + const TDesC8& aSourceData ) + { + // make sure dimension and buffer size match + if( aSourceData.Length() != + ( ( SourceSize().iWidth * SourceSize().iHeight * 12 ) / 8 ) ) + { + User::Leave( KErrArgument ); + } + SetYUVPtrs( aSourceData ); + } + +// ============================ CVTIYUVFbsBitmapConverter =============================== + +// ----------------------------------------------------------------------------- +// CVTIYUVFbsBitmapConverter::NewL( const TSize& aSourceSize, +// const CFbsBitmap& aDestinationBitmap ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CVTIYUVFbsBitmapConverter* CVTIYUVFbsBitmapConverter::NewL( + const TSize& aSourceSize, + const CFbsBitmap& aDestinationBitmap ) + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTIYUVFbsBitmapConverter::NewL() >>"), RThread().Id().operator TUint())); + CVTIYUVFbsBitmapConverter* self = NewL( + aSourceSize, aDestinationBitmap.Handle() ); + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTIYUVFbsBitmapConverter::NewL() <<"), RThread().Id().operator TUint())); + return self; + } + +// ----------------------------------------------------------------------------- +// CVTIYUVFbsBitmapConverter::NewL( const TSize& aSourceSize, +// TInt aBitmapHandle ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CVTIYUVFbsBitmapConverter* CVTIYUVFbsBitmapConverter::NewL( + const TSize& aSourceSize, + TInt aBitmapHandle ) + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTIYUVFbsBitmapConverter::NewL() >>"), RThread().Id().operator TUint())); + CVTIYUVFbsBitmapConverter* self = new (ELeave) + CVTIYUVFbsBitmapConverter( aSourceSize ); + CleanupStack::PushL( self ); + self->ConstructL( aBitmapHandle ); + CleanupStack::Pop(); // self + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTIYUVFbsBitmapConverter::NewL() <<"), RThread().Id().operator TUint())); + return self; + } + +// ----------------------------------------------------------------------------- +// CVTIYUVFbsBitmapConverter::SetYUVPtrs( const TDesC8& aSourceData ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVTIYUVFbsBitmapConverter::SetYUVPtrs( const TDesC8& aSourceData ) + { + TInt ySize = SourceSize().iWidth * SourceSize().iHeight; + TInt ySizeDiv4 = ( ySize >> 2 ); + iY = aSourceData.Mid( 0, ySize ).Ptr(); + iU = aSourceData.Mid( ySize, ySizeDiv4 ).Ptr(); + iV = aSourceData.Mid( ySize + ySizeDiv4, ySizeDiv4 ).Ptr(); + } + +// ----------------------------------------------------------------------------- +// CVTIYUVFbsBitmapConverter::CVTIYUVFbsBitmapConverter( const TSize& +// aSourceSize ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CVTIYUVFbsBitmapConverter::CVTIYUVFbsBitmapConverter( const TSize& aSourceSize ) +: CVTYUVPlanarFbsBitmapConverter( aSourceSize ) + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTIYUVFbsBitmapConverter::CVTIYUVFbsBitmapConverter() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTIYUVFbsBitmapConverter::CVTIYUVFbsBitmapConverter() <<"), RThread().Id().operator TUint())); + } + +// ============================ CVTYV12FbsBitmapConverter =============================== + +// ----------------------------------------------------------------------------- +// CVTYV12FbsBitmapConverter::NewL( const TSize& aSourceSize, +// const CFbsBitmap& aDestinationBitmap ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CVTYV12FbsBitmapConverter* CVTYV12FbsBitmapConverter::NewL( + const TSize& aSourceSize, + const CFbsBitmap& aDestinationBitmap ) + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYV12FbsBitmapConverter::NewL() >>"), RThread().Id().operator TUint())); + CVTYV12FbsBitmapConverter* self = NewL( + aSourceSize, aDestinationBitmap.Handle() ); + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYV12FbsBitmapConverter::NewL() <<"), RThread().Id().operator TUint())); + return self; + } + +// ----------------------------------------------------------------------------- +// CVTYV12FbsBitmapConverter::NewL( const TSize& aSourceSize, +// TInt aBitmapHandle ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CVTYV12FbsBitmapConverter* CVTYV12FbsBitmapConverter::NewL( + const TSize& aSourceSize, + TInt aBitmapHandle ) + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYV12FbsBitmapConverter::NewL() >>"), RThread().Id().operator TUint())); + CVTYV12FbsBitmapConverter* self = new (ELeave) + CVTYV12FbsBitmapConverter( aSourceSize ); + CleanupStack::PushL( self ); + self->ConstructL( aBitmapHandle ); + CleanupStack::Pop(); // self + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYV12FbsBitmapConverter::NewL() <<"), RThread().Id().operator TUint())); + return self; + } + +// ----------------------------------------------------------------------------- +// CVTYV12FbsBitmapConverter::SetYUVPtrs( const TDesC8& aSourceData ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVTYV12FbsBitmapConverter::SetYUVPtrs( const TDesC8& aSourceData ) + { + TInt ySize = SourceSize().iWidth * SourceSize().iHeight; + TInt ySizeDiv4 = ( ySize >> 2 ); + iY = aSourceData.Mid( 0, ySize ).Ptr(); + iV = aSourceData.Mid( ySize, ySizeDiv4 ).Ptr(); + iU = aSourceData.Mid( ySize + ySizeDiv4, ySizeDiv4 ).Ptr(); + } + +// ----------------------------------------------------------------------------- +// CVTYV12FbsBitmapConverter::CVTYV12FbsBitmapConverter( +// const TSize& aSourceSize ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CVTYV12FbsBitmapConverter::CVTYV12FbsBitmapConverter( const TSize& aSourceSize ) +: CVTYUVPlanarFbsBitmapConverter( aSourceSize ) + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYV12FbsBitmapConverter::CVTYV12FbsBitmapConverter() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource: [%d] CVTYV12FbsBitmapConverter::CVTYV12FbsBitmapConverter() <<"), RThread().Id().operator TUint())); + } + +// ============================ CVSFbsBitmapIYUVConverter =============================== + +// ----------------------------------------------------------------------------- +// CVSFbsBitmapIYUVConverter::CVSFbsBitmapIYUVConverter() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CVSFbsBitmapIYUVConverter::CVSFbsBitmapIYUVConverter() + { + } + +// ----------------------------------------------------------------------------- +// CVSFbsBitmapIYUVConverter::NewL( const CFbsBitmap& aBitmap ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CVSFbsBitmapIYUVConverter* CVSFbsBitmapIYUVConverter::NewL( + const CFbsBitmap& aBitmap ) + { + CVSFbsBitmapIYUVConverter* self = new (ELeave) CVSFbsBitmapIYUVConverter(); + CleanupStack::PushL( self ); + self->ConstructL( aBitmap ); + CleanupStack::Pop(); // self + return self; + } + +// ----------------------------------------------------------------------------- +// CVSFbsBitmapIYUVConverter::~CVSFbsBitmapIYUVConverter() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CVSFbsBitmapIYUVConverter::~CVSFbsBitmapIYUVConverter() + { + delete iSource; + delete iYUVData; + } + +// ----------------------------------------------------------------------------- +// CVSFbsBitmapIYUVConverter::SetSourceL( const CFbsBitmap& aBitmap ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CVSFbsBitmapIYUVConverter::SetSourceL( const CFbsBitmap& aBitmap ) + { + ReConstructL( aBitmap ); + } + +// ----------------------------------------------------------------------------- +// CVSFbsBitmapIYUVConverter::ProcessL() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CVSFbsBitmapIYUVConverter::ProcessL() + { + switch( iSource->DisplayMode() ) + { + case EColor4K: + DoProcess( VSReadColor4K ); + break; + + case EColor64K: + DoProcess( VSReadColor64K ); + break; + + case EColor16M: + DoProcess( VSReadColor16M ); + break; + + case EColor16MU: + DoProcess( VSReadColor16MU ); + break; + + case EColor16MA: + DoProcess( VSReadColor16MA ); + break; + + case EColor16MAP: + DoProcess( VSReadColor16MAP ); + break; + + default: + User::Leave( KErrNotSupported ); + break; + }; + } + +// ----------------------------------------------------------------------------- +// CVSFbsBitmapIYUVConverter::YUVData() const +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TPtrC8 CVSFbsBitmapIYUVConverter::YUVData() const + { + return *iYUVData; + } + +// ----------------------------------------------------------------------------- +// CVSFbsBitmapIYUVConverter::ConstructL( const CFbsBitmap& aBitmap ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVSFbsBitmapIYUVConverter::ConstructL( const CFbsBitmap& aBitmap ) + { + iSource = new (ELeave) CFbsBitmap(); + ReConstructL( aBitmap ); + } + +// ----------------------------------------------------------------------------- +// CVSFbsBitmapIYUVConverter::ReConstructL( const CFbsBitmap& aBitmap ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVSFbsBitmapIYUVConverter::ReConstructL( const CFbsBitmap& aBitmap ) + { + User::LeaveIfError( iSource->Duplicate( aBitmap.Handle() ) ); + + // make sure that source bitmap's displaymode is supported + if( ( iSource->DisplayMode() != EColor4K ) && + ( iSource->DisplayMode() != EColor64K ) && + ( iSource->DisplayMode() != EColor16M ) && + ( iSource->DisplayMode() != EColor16MU ) && + ( iSource->DisplayMode() != EColor16MA ) && + ( iSource->DisplayMode() != EColor16MAP ) ) + { + User::Leave( KErrNotSupported ); + } + + if( !iYUVData || !( iSize == iSource->SizeInPixels() ) ) + { + iSize = iSource->SizeInPixels(); + delete iYUVData; iYUVData = 0; + TInt ySize = iSize.iWidth * iSize.iHeight; + iYUVData = HBufC8::NewMaxL( ySize + ( ySize >> 1 ) ); + iY.Set( iYUVData->Des().Mid( 0, ySize ) ); + iU.Set( iYUVData->Des().Mid( ySize, ySize >> 2 ) ); + iV.Set( iYUVData->Des().Mid( ySize + ( ySize >> 2 ), ySize >> 2 ) ); + } + } + +// ----------------------------------------------------------------------------- +// CVSFbsBitmapIYUVConverter::DoProcess( TVSColorReadFunc aReadFunction ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVSFbsBitmapIYUVConverter::DoProcess( TVSColorReadFunc aReadFunction ) + { + TUint8* pY = const_cast( iY.Ptr() ); + TUint8* pU = const_cast( iU.Ptr() ); + TUint8* pV = const_cast( iV.Ptr() ); + TVSYCrCb yuv1, yuv2; + + iSource->LockHeap(); + TAny* s = iSource->DataAddress(); + for( TInt h = 0; h < iSize.iHeight; h++ ) + { + if( h&1 ) + { + // Note! width must be even divisible by 2 + for( TInt w = 0; w < iSize.iWidth >> 1; w++ ) + { + *pY++ = RGBtoYCbCr( &yuv1, aReadFunction( s ) ); + *pY++ = RGBtoYCbCr( &yuv2, aReadFunction( s ) ); + *pU++ = static_cast( AVG( yuv1.iCb, yuv2.iCb ) ); + *pV++ = static_cast( AVG( yuv1.iCr, yuv2.iCr ) ); + } + } + else + { + // Note! width must be even divisible by 2 + for( TInt w = 0; w < iSize.iWidth >> 1; w++ ) + { + *pY++ = RGBtoYCbCr( &yuv1, aReadFunction( s ) ); + *pY++ = RGBtoYCbCr( &yuv2, aReadFunction( s ) ); + *pU++ = static_cast( + AVG( *pU, AVG( yuv1.iCb, yuv2.iCb ) ) ); + *pV++ = static_cast( + AVG( *pV, AVG( yuv1.iCr, yuv2.iCr ) ) ); + } + // if even row -> decrease pU and pV, we will calculate average for + // those on odd rows + pU -= ( iSize.iWidth >> 1 ); + pV -= ( iSize.iWidth >> 1 ); + } + } + iSource->UnlockHeap(); + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/src/CVtImageIYUV.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/src/CVtImageIYUV.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,294 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + +// INCLUDE FILES + +#include +#include + +#include "CVtImageIYUV.h" + +// MACROS + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::NewL( TInt aBitmapHandle ) +// ----------------------------------------------------------------------------- +EXPORT_C CVtImageIYUV* CVtImageIYUV::NewL( const TSize& aSize ) + { + CVtImageIYUV* self = new ( ELeave ) CVtImageIYUV( aSize ); + CleanupStack::PushL( self ); + self->ConstructL( 0 ); + CleanupStack::Pop(); // self + return self; + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::NewL( const TSize& aSize, TDisplayMode aDisplayMode, +// const TDesC8& aImage ) +// ----------------------------------------------------------------------------- +EXPORT_C CVtImageIYUV* CVtImageIYUV::NewL( + const TSize& aSize, + const TDesC8& aImage ) + { + CVtImageIYUV* self = new ( ELeave ) CVtImageIYUV( aSize ); + CleanupStack::PushL( self ); + self->ConstructL( &aImage ); + CleanupStack::Pop(); // self + return self; + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::NewL( const TSize& aSize, TDisplayMode aDisplayMode, +// TPtr8& aImage ) +// ----------------------------------------------------------------------------- +EXPORT_C CVtImageIYUV* CVtImageIYUV::NewL( + const TSize& aSize, + TPtr8& aImage ) + { + CVtImageIYUV* self = new ( ELeave ) CVtImageIYUV( aSize ); + CleanupStack::PushL( self ); + self->ValidateSizeL( aSize ); + self->SetImageL( aImage ); // No constructor call! + CleanupStack::Pop(); // self + return self; + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::~CVtImageIYUV() +// ----------------------------------------------------------------------------- +EXPORT_C CVtImageIYUV::~CVtImageIYUV() + { + delete iImage; + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::SetImageL( const TDesC8& aImage ) +// ----------------------------------------------------------------------------- +EXPORT_C void CVtImageIYUV::SetImageL( const TDesC8& aImage ) + { + CheckDescriptorSizeL( aImage ); + if( !iImage ) + { + ConstructL( &aImage ); + } + else + { + *iImage = aImage; + } + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::SetImageL( TPtr8& aImage ) +// ----------------------------------------------------------------------------- +EXPORT_C void CVtImageIYUV::SetImageL( TPtr8& aImage ) + { + CheckDescriptorSizeL( aImage ); + delete iImage; iImage = 0; + iPtrImage.Set( aImage ); + SetYUVPointers(); + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::Image() const +// ----------------------------------------------------------------------------- +EXPORT_C TPtrC8 CVtImageIYUV::Image() const + { + return iPtrImage; + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::Y() const +// ----------------------------------------------------------------------------- +EXPORT_C TUint8* CVtImageIYUV::Y() const + { + return iY; + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::U() const +// ----------------------------------------------------------------------------- +EXPORT_C TUint8* CVtImageIYUV::U() const + { + return iU; + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::V() const +// ----------------------------------------------------------------------------- +EXPORT_C TUint8* CVtImageIYUV::V() const + { + return iV; + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::UVPlaneWidth() const +// ----------------------------------------------------------------------------- +EXPORT_C TInt CVtImageIYUV::UVPlaneWidth() const + { + return iSize.iWidth / 2; + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::UVPlaneHeight() const +// ----------------------------------------------------------------------------- +EXPORT_C TInt CVtImageIYUV::UVPlaneHeight() const + { + return iSize.iHeight / 2; + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::NeedHeapLock() const +// ----------------------------------------------------------------------------- +TBool CVtImageIYUV::NeedHeapLock() const + { + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::DisplayMode() const +// ----------------------------------------------------------------------------- +CVtImage::TVtDisplayMode CVtImageIYUV::DisplayMode() const + { + return CVtImage::EVtColorIYUV; + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::Size() const +// ----------------------------------------------------------------------------- +TSize CVtImageIYUV::Size() const + { + return iSize; + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::BytesPerRow() const +// ----------------------------------------------------------------------------- +TInt CVtImageIYUV::BytesPerRow() const + { + return iSize.iWidth; + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::DataAddress() const +// ----------------------------------------------------------------------------- +TUint32* CVtImageIYUV::DataAddress() const + { + return reinterpret_cast< TUint32* >( iY ); + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::LineAddress( TInt aLine ) const +// ----------------------------------------------------------------------------- +TUint32* CVtImageIYUV::LineAddress( TInt aLine ) const + { + if( aLine < 0 ) + { + aLine = 0; + } + else if( aLine > Size().iHeight - 1 ) + { + aLine = Size().iHeight - 1; + } + return reinterpret_cast< TUint32* >( + reinterpret_cast< TUint8* >( DataAddress() ) + BytesPerRow() * aLine ); + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::ImageSize() const +// ----------------------------------------------------------------------------- +TInt CVtImageIYUV::ImageSize() const + { + return UVPlaneWidth() * UVPlaneHeight() * 2 + BytesPerRow() * iSize.iHeight; + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::CVtImageIYUV( const TSize& aSize ) +// ----------------------------------------------------------------------------- +CVtImageIYUV::CVtImageIYUV( const TSize& aSize ) +: CVtImage( CVtImage::EVtImageIYUV ), iSize( aSize ), iPtrImage( 0, 0 ) + { + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::ConstructL( const TDesC8* aImage ) +// ----------------------------------------------------------------------------- +void CVtImageIYUV::ConstructL( const TDesC8* aImage ) + { + ValidateSizeL( iSize ); + if( !aImage ) + { + // empty image + TInt size( ImageSize() ); + iImage = HBufC8::NewL( size ); + iImage->Des().SetLength( size ); + } + else + { + // prefilled image + CheckDescriptorSizeL( *aImage ); + iImage = aImage->AllocL(); + } + // set ptr descriptor + iPtrImage.Set( iImage->Des() ); + // set YUV pointers + SetYUVPointers(); + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::ValidateSizeL( const TSize& aSize ) +// ----------------------------------------------------------------------------- +void CVtImageIYUV::ValidateSizeL( const TSize& aSize ) + { + if( ( aSize.iWidth & 1 ) || ( aSize.iHeight & 1 ) ) + { + User::Leave( KErrNotSupported ); + } + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::CheckDescriptorSizeL( const TDesC8& aImage ) +// ----------------------------------------------------------------------------- +void CVtImageIYUV::CheckDescriptorSizeL( const TDesC8& aImage ) + { + if( aImage.Size() != ImageSize() ) + { + User::Leave( KErrArgument ); + } + } + +// ----------------------------------------------------------------------------- +// CVtImageIYUV::SetYUVPointers() +// ----------------------------------------------------------------------------- +void CVtImageIYUV::SetYUVPointers() + { + iY = const_cast< TUint8* >( iPtrImage.Ptr() ); + iU = iY + BytesPerRow() * iSize.iHeight; + iV = iU + UVPlaneWidth() * UVPlaneHeight(); + } + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/src/CVtImageRotator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/src/CVtImageRotator.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,244 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + +// INCLUDE FILES + +#include +#include + +#include "cvtimagerotator.h" +#include "CVtImageRotatorImplMirrorFlip.h" +#include "CVtImageRotatorImplClockwise.h" + +// CONSTANTS + +_LIT( KModuleName, "CVtImageRotator" ); + +// MACROS + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtImageRotator::NewL( MVtImageRotatorObserver& aObserver, +// TPriority aPriority ) +// ----------------------------------------------------------------------------- +EXPORT_C CVtImageRotator* CVtImageRotator::NewL( + MVtImageRotatorObserver& aObserver, + TPriority aPriority) + { + CVtImageRotator* self = new ( ELeave ) CVtImageRotator( aObserver, aPriority ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); // self + return self; + } + +// ----------------------------------------------------------------------------- +// CVtImageRotator::~CVtImageRotator() +// ----------------------------------------------------------------------------- +EXPORT_C CVtImageRotator::~CVtImageRotator() + { + Cancel(); + delete iAsyncCallBack; + delete iHeapLock; + delete iRotatorImpl; + } + +// ----------------------------------------------------------------------------- +// CVtImageRotator::ScaleL( const CVtImage& aSource, +// CVtImage& aTarget, const TRotationAngle& aAngle ) +// ----------------------------------------------------------------------------- +EXPORT_C void CVtImageRotator::RotateL( const CVtImage& aSource, + CVtImage& aTarget, const TRotationAngle& aAngle ) + { + if ( !IsActive() ) + { + CreateRotatorL( aAngle ); + iRotatorImpl->SetSourceTargetL( aSource, aTarget ); + iCancelled = EFalse; + Activate(); + iAsyncCallBack->CallBack(); + } + else + { + User::Panic( KModuleName(), EBusy ); + } + } + +// ----------------------------------------------------------------------------- +// CVtImageRotator::Rotate +// ----------------------------------------------------------------------------- +EXPORT_C void CVtImageRotator::Rotate( + const CVtImage& aSource, + CVtImage& aTarget, const TRotationAngle& aAngle ) + { + TRAPD( result, RotateL( aSource, aTarget, aAngle ) ); + if ( result != KErrNone ) + { + Activate(); + Signal( result ); + } + } + +// ----------------------------------------------------------------------------- +// CVtImageRotator::CVtImageRotator( MVtImageRotatorObserver& aObserver, +// TPriority aPriority ) +// ----------------------------------------------------------------------------- +CVtImageRotator::CVtImageRotator( MVtImageRotatorObserver& aObserver, + TPriority aPriority ) +: CActive( aPriority ), iObserver( aObserver ) + { + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CVtImageRotator::ConstructL() +// ----------------------------------------------------------------------------- +void CVtImageRotator::ConstructL() + { + iHeapLock = new ( ELeave ) CFbsBitmap(); + iHeapLock->Create( TSize( 1, 1 ), EColor256 ); + iAsyncCallBack = new ( ELeave ) + CAsyncCallBack( TCallBack( StaticRotate, this ), Priority() ); + } + +// ----------------------------------------------------------------------------- +// CVtImageRotator::CreateRotatorL( const TRotationAngle& aAngle ) +// ----------------------------------------------------------------------------- +void CVtImageRotator::CreateRotatorL( const TRotationAngle& aAngle ) + { + if( iRotatorImpl ) + { + if( iRotatorImpl->SupportsRotationAngle( aAngle ) ) + { + iRotatorImpl->SetAngle( aAngle ); + return; + } + delete iRotatorImpl; + iRotatorImpl = 0; + } + + switch( aAngle ) + { + case E90DegreesClockwise: + case E270DegreesClockwise: + iRotatorImpl = + new ( ELeave ) CVtImageRotatorImplClockwise( aAngle ); + break; + + case EMirrorHorizontalAxis: + case EFlipVerticalAxis: + case E180DegreesClockwise: + iRotatorImpl = + new ( ELeave ) CVtImageRotatorImplMirrorFlip( aAngle ); + break; + + default: + User::Leave( KErrNotSupported ); + } + } + +// ----------------------------------------------------------------------------- +// CVtImageRotator::Activate +// ----------------------------------------------------------------------------- +void CVtImageRotator::Activate() + { + iStatus = KRequestPending; + SetActive(); + } + +// ----------------------------------------------------------------------------- +// CVtImageRotator::Signal( TInt aError ) +// ----------------------------------------------------------------------------- +void CVtImageRotator::Signal( TInt aError ) + { + TRequestStatus* pStatus = &iStatus; + User::RequestComplete( pStatus, aError ); + } + +// ----------------------------------------------------------------------------- +// CVtImageRotator::RunL() +// ----------------------------------------------------------------------------- +void CVtImageRotator::RunL() + { + iObserver.RotationFinished( iStatus.Int() ); + } + +// ----------------------------------------------------------------------------- +// CVtImageRotator::DoCancel() +// ----------------------------------------------------------------------------- +void CVtImageRotator::DoCancel() + { + if ( iStatus == KRequestPending ) + { + iCancelled = ETrue; + Signal( KErrCancel ); + iObserver.RotationFinished( KErrCancel ); + } + } + +// ----------------------------------------------------------------------------- +// CVtImageRotator::StaticRotate() +// ----------------------------------------------------------------------------- +TInt CVtImageRotator::StaticRotate( TAny* aPtr ) + { + CVtImageRotator* self = reinterpret_cast< CVtImageRotator* >( aPtr ); + self->DoRotate(); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtImageRotator::DoRotate +// ----------------------------------------------------------------------------- +void CVtImageRotator::DoRotate() + { + if ( !iCancelled ) + { + TBool more; + TBool needsLock = iRotatorImpl->NeedHeapLock(); + if( needsLock ) + { + iHeapLock->LockHeap( ETrue ); + } + TInt result = iRotatorImpl->Rotate( more ); + if( needsLock ) + { + iHeapLock->UnlockHeap( ETrue ); + } + if( !more || ( result != KErrNone ) ) + { + Signal( result ); + } + else + { + iAsyncCallBack->CallBack(); + } + } + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/src/CVtImageRotatorImpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/src/CVtImageRotatorImpl.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,81 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + +// INCLUDE FILES + +#include +#include + +#include "CVtImageRotatorImpl.h" +#include "cvtimage.h" + +// MACROS + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// ============================ MEMBER FUNCTIONS =============================== + +// ========================== CVtImageRotatorImpl ============================== + +// ----------------------------------------------------------------------------- +// CVtImageRotatorImpl::SetSourceTargetL( +// const CVtImage& aSource, CVtImage& aTarget ) +// ----------------------------------------------------------------------------- +void CVtImageRotatorImpl::SetSourceTargetL( + const CVtImage& aSource, + CVtImage& aTarget ) + { + iSource = iTarget = 0; + ValidateSourceTargetL( aSource, aTarget ); + iSource = &aSource; + iTarget = &aTarget; + } + +// ----------------------------------------------------------------------------- +// CVtImageRotatorImpl::NeedHeapLock() const +// ----------------------------------------------------------------------------- +TBool CVtImageRotatorImpl::NeedHeapLock() const + { + return iSource->NeedHeapLock() || iTarget->NeedHeapLock(); + } + +// ----------------------------------------------------------------------------- +// CVtImageRotatorImpl::SetAngle( +// const CVtImageRotator::TRotationAngle& aAngle ) +// ----------------------------------------------------------------------------- +void CVtImageRotatorImpl::SetAngle( const CVtImageRotator::TRotationAngle& aAngle ) + { + iAngle = aAngle; + } + +// ----------------------------------------------------------------------------- +// CVtImageRotatorImpl::CVtImageRotatorImpl( +// const CVtImageRotator::TRotationAngle& aAngle ) +// ----------------------------------------------------------------------------- +CVtImageRotatorImpl::CVtImageRotatorImpl( const CVtImageRotator::TRotationAngle& aAngle ) +: iAngle( aAngle ) + { + } + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/src/CVtImageRotatorImplClockwise.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/src/CVtImageRotatorImplClockwise.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,372 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + +// INCLUDE FILES + +#include +#include + +#include "CVtImageRotatorImplClockwise.h" +#include "cvtimage.h" +#include "CVtImageIYUV.h" + +// MACROS + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// LOCAL CONSTANTS AND MACROS + +// ============================ MEMBER FUNCTIONS =============================== + +// ======================= CVtImageRotatorImplClockwise ======================= + +// ----------------------------------------------------------------------------- +// CVtImageRotatorImplClockwise::CVtImageRotatorImplClockwise( +// const CVtImageRotator::TRotationAngle& aAngle ) +// ----------------------------------------------------------------------------- +CVtImageRotatorImplClockwise::CVtImageRotatorImplClockwise( + const CVtImageRotator::TRotationAngle& aAngle ) : CVtImageRotatorImpl( aAngle ) + { + } + +// ----------------------------------------------------------------------------- +// CVtImageRotatorImplClockwise::Rotate( TBool& aContinue ) +// ----------------------------------------------------------------------------- +TInt CVtImageRotatorImplClockwise::Rotate( TBool& aContinue ) + { + __IF_DEBUG( Print( _L( "ImageRotator [%d]: CVtImageRotatorImplClockwise::Rotate() >>" ), RThread().Id().operator TUint() ) ); + + TInt result( KErrNone ); + + aContinue = EFalse; + + DoRotate(); + + __IF_DEBUG( Print( _L( "ImageRotator [%d]: CVtImageRotatorImplClockwise::Rotate() <<" ), RThread().Id().operator TUint() ) ); + + return result; + } + +// ----------------------------------------------------------------------------- +// CVtImageRotatorImplClockwise::ValidateSourceTargetL( +// const CVtImage& aSource, CVtImage& aTarget ) +// ----------------------------------------------------------------------------- +void CVtImageRotatorImplClockwise::ValidateSourceTargetL( + const CVtImage& aSource, + CVtImage& aTarget ) + { + // SourceWidth == TargetHeight && SourceHeight == TargetWidth + if( ( aSource.Size().iWidth != aTarget.Size().iHeight ) || + ( aSource.Size().iHeight != aTarget.Size().iWidth ) ) + { + User::Leave( KErrNotSupported ); + } + + // Displaymodes must match + if( aSource.DisplayMode() != aTarget.DisplayMode() ) + { + User::Leave( KErrNotSupported ); + } + + // Check that displaymode is one of the supported + switch( aSource.DisplayMode() ) + { + case CVtImage::EVtColor4K: + case CVtImage::EVtColor64K: + case CVtImage::EVtColor16M: + case CVtImage::EVtColor16MU: + case CVtImage::EVtColor16MA: + case CVtImage::EVtColorIYUV: + break; + + default: + User::Leave( KErrNotSupported ); + } + } + +// ----------------------------------------------------------------------------- +// CVtImageRotatorImplClockwise::ValidateSourceTargetL( +// const CVtImage& aSource, CVtImage& aTarget ) +// ----------------------------------------------------------------------------- +TBool CVtImageRotatorImplClockwise::SupportsRotationAngle( + const CVtImageRotator::TRotationAngle& aAngle ) + { + TBool result( EFalse ); + + if( ( aAngle == CVtImageRotator::E90DegreesClockwise ) || + ( aAngle == CVtImageRotator::E270DegreesClockwise ) ) + { + result = ETrue; + } + + return result; + } + +// ----------------------------------------------------------------------------- +// void CVtImageRotatorImplClockwise::DoRotate() +// ----------------------------------------------------------------------------- +void CVtImageRotatorImplClockwise::DoRotate() + { + TInt bytesPerRow( iSource->BytesPerRow() ); + + TInt height( iSource->Size().iHeight ); + + TInt width( iSource->Size().iWidth ); + + TInt targetWidth( iTarget->Size().iWidth ); + + TInt targetHeight( iTarget->Size().iHeight ); + + TInt targetBytesPerRow( iTarget->BytesPerRow() ); + + switch( iSource->DisplayMode() ) + { + // DisplayMode: 4K and 64K + case CVtImage::EVtColor4K: + case CVtImage::EVtColor64K: + { + const TUint8* s = reinterpret_cast< const TUint8* >( iSource->DataAddress() ); + + TUint8* d = reinterpret_cast< TUint8* >( iTarget->DataAddress() ); + + TInt offsetPerRow( -2 ); + + if( iAngle == CVtImageRotator::E90DegreesClockwise ) + { + d += targetBytesPerRow - 2; + + if( targetWidth & 1 ) + { + d -= 2; + } + } + else + { + d += targetBytesPerRow * ( targetHeight - 1 ); + + targetBytesPerRow = -targetBytesPerRow; + + offsetPerRow = 2; + } + + targetBytesPerRow /= 2; // in loop we need 16-bit precalculated + + for( TInt y = height - 1; y >= 0; y-- ) + { + register const TUint16* tempS = reinterpret_cast< const TUint16* >( s ); + + register TUint16* tempD = reinterpret_cast< TUint16* >( d ); + + for( register TInt x = width - 1; x >= 0; x-- ) + { + *tempD = *tempS++; + tempD += targetBytesPerRow; + } + + s += bytesPerRow; + d += offsetPerRow; + } + } + break; + + // DisplayMode: 16M + case CVtImage::EVtColor16M: + { + const TUint8* s = reinterpret_cast< const TUint8* >( iSource->DataAddress() ); + + TUint8* d = reinterpret_cast< TUint8* >( iTarget->DataAddress() ); + + TInt offsetPerRow( -3 ); + + if( iAngle == CVtImageRotator::E90DegreesClockwise ) + { + d += targetWidth * 3 - 3; + } + else + { + d += targetBytesPerRow * ( targetHeight - 1 ); + + targetBytesPerRow = -targetBytesPerRow; + + offsetPerRow = 3; + } + + for( TInt y = height - 1; y >= 0; y-- ) + { + register const TUint8* tempS = s; + + register TUint8* tempD = d; + + for( register TInt x = width - 1; x >= 0; x-- ) + { + tempD[ 0 ] = *tempS++; + tempD[ 1 ] = *tempS++; + tempD[ 2 ] = *tempS++; + tempD += targetBytesPerRow; + } + + s += bytesPerRow; + d += offsetPerRow; + } + } + break; + + // DisplayMode: 16MU and 16MA + case CVtImage::EVtColor16MU: + case CVtImage::EVtColor16MA: + { + const TUint8* s = reinterpret_cast< const TUint8* >( iSource->DataAddress() ); + + TUint8* d = reinterpret_cast< TUint8* >( iTarget->DataAddress() ); + + TInt offsetPerRow( -4 ); + + if( iAngle == CVtImageRotator::E90DegreesClockwise ) + { + d += targetBytesPerRow - 4; + } + else + { + d += targetBytesPerRow * ( targetHeight - 1 ); + + targetBytesPerRow = -targetBytesPerRow; + + offsetPerRow = 4; + } + + targetBytesPerRow /= 4; // in loop we need 32-bit precalculated + + for( TInt y = height - 1; y >= 0; y-- ) + { + register const TUint32* tempS = reinterpret_cast< const TUint32* >( s ); + + register TUint32* tempD = reinterpret_cast< TUint32* >( d ); + + for( register TInt x = width - 1; x >= 0; x-- ) + { + *tempD = *tempS++; + tempD += targetBytesPerRow; + } + + s += bytesPerRow; + d += offsetPerRow; + } + } + break; + + // DisplayMode: IYUV + case CVtImage::EVtColorIYUV: + { + const CVtImageIYUV* src = reinterpret_cast< const CVtImageIYUV* >( iSource ); + CVtImageIYUV* trg = reinterpret_cast< CVtImageIYUV* >( iTarget ); + RotatePlane + ( + src->Y(), + trg->Y(), + width, + height, + bytesPerRow, + targetHeight, + targetBytesPerRow + ); + + RotatePlane + ( + src->U(), + trg->U(), + src->UVPlaneWidth(), + src->UVPlaneHeight(), + src->UVPlaneWidth(), + trg->UVPlaneHeight(), + trg->UVPlaneWidth() + ); + + RotatePlane + ( + src->V(), + trg->V(), + src->UVPlaneWidth(), + src->UVPlaneHeight(), + src->UVPlaneWidth(), + trg->UVPlaneHeight(), + trg->UVPlaneWidth() + ); + + } + break; + + default: + break; + + } + } + +// ----------------------------------------------------------------------------- +// CVtImageRotatorImplClockwise::RotatePlane( +// const TUint8* aSource, +// TUint8* aTarget, +// TInt aSourceWidth, +// TInt aSourceHeight, +// TInt aSourceBytesPerRow, +// TInt aTargetHeight, +// TInt aTargetBytesPerRow ) +// ----------------------------------------------------------------------------- +void CVtImageRotatorImplClockwise::RotatePlane( + const TUint8* aSource, + TUint8* aTarget, + TInt aSourceWidth, + TInt aSourceHeight, + TInt aSourceBytesPerRow, + TInt aTargetHeight, + TInt aTargetBytesPerRow ) + { + TInt offsetPerRow( -1 ); + + if( iAngle == CVtImageRotator::E90DegreesClockwise ) + { + aTarget += aTargetBytesPerRow - 1; + } + else + { + aTarget += aTargetBytesPerRow * ( aTargetHeight - 1 ); + aTargetBytesPerRow = -aTargetBytesPerRow; + offsetPerRow = -offsetPerRow; + } + + for( TInt y = aSourceHeight - 1; y >= 0; y-- ) + { + register const TUint8* tempS = aSource; + register TUint8* tempD = aTarget; + for( register TInt x = aSourceWidth - 1; x >= 0; x-- ) + { + *tempD = *tempS++; + tempD += aTargetBytesPerRow; + } + + aSource += aSourceBytesPerRow; + aTarget += offsetPerRow; + } + } + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/src/CVtImageRotatorImplMirrorFlip.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/src/CVtImageRotatorImplMirrorFlip.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,589 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + +// INCLUDE FILES + +#include +#include + +#include "CVtImageRotatorImplMirrorFlip.h" +#include "cvtimage.h" +#include "CVtImageIYUV.h" + +// MACROS + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// LOCAL CONSTANTS AND MACROS + +// ============================ MEMBER FUNCTIONS =============================== + +// ======================= CVtImageRotatorImplMirrorFlip ======================= + +// ----------------------------------------------------------------------------- +// CVtImageRotatorImplMirrorFlip::CVtImageRotatorImplMirrorFlip( +// const CVtImageRotator::TRotationAngle& aAngle ) +// ----------------------------------------------------------------------------- +CVtImageRotatorImplMirrorFlip::CVtImageRotatorImplMirrorFlip( + const CVtImageRotator::TRotationAngle& aAngle ) : CVtImageRotatorImpl( aAngle ) + { + } + +// ----------------------------------------------------------------------------- +// CVtImageRotatorImplMirrorFlip::Rotate( TBool& aContinue ) +// ----------------------------------------------------------------------------- +TInt CVtImageRotatorImplMirrorFlip::Rotate( TBool& aContinue ) + { + __IF_DEBUG( Print( _L( "ImageRotator [%d]: CVtImageRotatorImplMirrorFlip::Rotate() >>" ), RThread().Id().operator TUint() ) ); + + TInt result( KErrNone ); + + aContinue = EFalse; + + TBool isSameBitmap( iSource->DataAddress() == iTarget->DataAddress() ); + + if( iAngle == CVtImageRotator::EFlipVerticalAxis ) + { + // Are source and target referencing same bitmap? + if( isSameBitmap ) + { + // YES: Flip inside bitmap + Flip( *iTarget ); + } + else + { + // NO: Use flipping from source to target + Flip(); + } + } + else if( iAngle == CVtImageRotator::EMirrorHorizontalAxis ) + { + // Are source and target referencing same bitmap? + if( isSameBitmap ) + { + // YES: Mirror inside bitmap + Mirror( *iTarget ); + } + else + { + // NO: Mirror from source to target + Mirror(); + } + } + else if( iAngle == CVtImageRotator::E180DegreesClockwise ) + { + // Are source and target referencing same bitmap? + if( isSameBitmap ) + { + // YES: Mirror inside bitmap + Mirror( *iTarget ); + } + else + { + // NO: Mirror from source to target + Mirror(); + } + Flip( *iTarget ); + } + + __IF_DEBUG( Print( _L( "ImageRotator [%d]: CVtImageRotatorImplMirrorFlip::Rotate() <<" ), RThread().Id().operator TUint() ) ); + + return result; + } + +// ----------------------------------------------------------------------------- +// CVtImageRotatorImplMirrorFlip::ValidateSourceTargetL( +// const CVtImage& aSource, CVtImage& aTarget ) +// ----------------------------------------------------------------------------- +void CVtImageRotatorImplMirrorFlip::ValidateSourceTargetL( + const CVtImage& aSource, + CVtImage& aTarget ) + { + + + // Sizes must match + if( aSource.Size() != aTarget.Size() ) + { + User::Leave( KErrNotSupported ); + } + + // Displaymodes must match + if( aSource.DisplayMode() != aTarget.DisplayMode() ) + { + User::Leave( KErrNotSupported ); + } + + // Check that displaymode is one of the supported + switch( aSource.DisplayMode() ) + { + case CVtImage::EVtColor4K: + case CVtImage::EVtColor64K: + case CVtImage::EVtColor16M: + case CVtImage::EVtColor16MU: + case CVtImage::EVtColor16MA: + case CVtImage::EVtColorIYUV: + break; + + default: + User::Leave( KErrNotSupported ); + } + } + +// ----------------------------------------------------------------------------- +// CVtImageRotatorImplMirrorFlip::ValidateSourceTargetL( +// const CVtImage& aSource, CVtImage& aTarget ) +// ----------------------------------------------------------------------------- +TBool CVtImageRotatorImplMirrorFlip::SupportsRotationAngle( + const CVtImageRotator::TRotationAngle& aAngle ) + { + TBool result( EFalse ); + + if( ( aAngle == CVtImageRotator::EMirrorHorizontalAxis ) || + ( aAngle == CVtImageRotator::EFlipVerticalAxis ) || + ( aAngle == CVtImageRotator::E180DegreesClockwise ) ) + { + result = ETrue; + } + + return result; + } + +// ----------------------------------------------------------------------------- +// CVtImageRotatorImplMirrorFlip::Mirror() +// ----------------------------------------------------------------------------- +void CVtImageRotatorImplMirrorFlip::Mirror() + { + TInt bytesPerRow( iSource->BytesPerRow() ); + + TInt height( iSource->Size().iHeight ); + + TInt width( iSource->Size().iWidth ); + + switch( iSource->DisplayMode() ) + { + // DisplayMode: 4K and 64K + case CVtImage::EVtColor4K: + case CVtImage::EVtColor64K: + { + const TUint8* s = reinterpret_cast< const TUint8* >( iSource->DataAddress() ); + + TUint8* d = reinterpret_cast< TUint8* >( iTarget->DataAddress() ); + + d += bytesPerRow; + + if( width & 1 ) + { + d -= 2; + } + + for( TInt y = height - 1; y >= 0; y-- ) + { + register const TUint16* tempS = reinterpret_cast< const TUint16* >( s ); + + register TUint16* tempD = reinterpret_cast< TUint16* >( d ); + + for( register TInt x = width - 1; x >= 0; x-- ) + { + *--tempD = *tempS++; + } + + s += bytesPerRow; + + d += bytesPerRow; + } + } + break; + + // DisplayMode: 16M + case CVtImage::EVtColor16M: + { + const TUint8* s = reinterpret_cast< const TUint8* >( iSource->DataAddress() ); + + TUint8* d = reinterpret_cast< TUint8* >( iTarget->DataAddress() ); + + d += width * 3; + + for( TInt y = height - 1; y >= 0; y-- ) + { + const TUint8* tempS = s; + + TUint8* tempD = d - 3; + + for( TInt x = width - 1; x >= 0; x-- ) + { + tempD[ 0 ] = *tempS++; + tempD[ 1 ] = *tempS++; + tempD[ 2 ] = *tempS++; + tempD -= 3; + } + + s += bytesPerRow; + + d += bytesPerRow; + } + } + break; + + // DisplayMode: 16MU and 16MA + case CVtImage::EVtColor16MU: + case CVtImage::EVtColor16MA: + { + const TUint8* s = reinterpret_cast< const TUint8* >( iSource->DataAddress() ); + + TUint8* d = reinterpret_cast< TUint8* >( iTarget->DataAddress() ); + + d += bytesPerRow; + + for( TInt y = height - 1; y >= 0; y-- ) + { + register const TUint32* tempS = reinterpret_cast< const TUint32* >( s ); + register TUint32* tempD = reinterpret_cast< TUint32* >( d ); + + for( TInt x = width - 1; x >= 0; x-- ) + { + *--tempD = *tempS++; + } + + s += bytesPerRow; + + d += bytesPerRow; + } + } + break; + + // IYUV + case CVtImage::EVtColorIYUV: + MirrorIYUV( reinterpret_cast< const CVtImageIYUV& >( *iSource ), reinterpret_cast< CVtImageIYUV& >( *iTarget ) ); + break; + + default: + break; + + } + } + +// ----------------------------------------------------------------------------- +// CVtImageRotatorImplMirrorFlip::Mirror( CVtImage& aTarget ) +// ----------------------------------------------------------------------------- +void CVtImageRotatorImplMirrorFlip::Mirror( CVtImage& aTarget ) + { + TInt bytesPerRow( aTarget.BytesPerRow() ); + + TInt height( aTarget.Size().iHeight ); + + TInt width( aTarget.Size().iWidth ); + + switch( aTarget.DisplayMode() ) + { + // DisplayMode: 4K and 64K + case CVtImage::EVtColor4K: + case CVtImage::EVtColor64K: + { + TUint8* d = reinterpret_cast< TUint8* >( aTarget.DataAddress() ); + + TUint8* s = reinterpret_cast< TUint8* >( d ); + + d += bytesPerRow; + + if( width & 1 ) + { + d -= 2; + } + + for( TInt y = height - 1; y >= 0; y-- ) + { + register TUint16* tempS = reinterpret_cast< TUint16* >( s ); + + register TUint16* tempD = reinterpret_cast< TUint16* >( d ); + + for( register TInt x = width/2 - 1; x >= 0; x-- ) + { + TUint16 p = *tempS; + *tempS++ = *--tempD; + *tempD = p; + } + + s += bytesPerRow; + + d += bytesPerRow; + } + } + break; + + // DisplayMode: 16M + case CVtImage::EVtColor16M: + { + TUint8* d = reinterpret_cast< TUint8* >( aTarget.DataAddress() ); + + TUint8* s = reinterpret_cast< TUint8* >( d ); + + d += width * 3; + + for( TInt y = height - 1; y >= 0; y-- ) + { + TUint8* tempS = s; + + TUint8* tempD = d - 3; + + for( TInt x = width/2 - 1; x >= 0; x-- ) + { + TUint8 s = *tempS; + TUint8 t = *tempD; + *tempD++ = s; + *tempS++ = t; + + s = *tempS; + t = *tempD; + *tempD++ = s; + *tempS++ = t; + + s = *tempS; + t = *tempD; + *tempD++ = s; + *tempS++ = t; + + tempD -= 6; + } + + s += bytesPerRow; + + d += bytesPerRow; + } + } + break; + + // DisplayMode: 16MU and 16MA + case CVtImage::EVtColor16MU: + case CVtImage::EVtColor16MA: + { + TUint8* d = reinterpret_cast< TUint8* >( aTarget.DataAddress() ); + + TUint8* s = reinterpret_cast< TUint8* >( d ); + + d += bytesPerRow; + + for( TInt y = height - 1; y >= 0; y-- ) + { + register TUint32* tempS = reinterpret_cast< TUint32* >( s ); + register TUint32* tempD = reinterpret_cast< TUint32* >( d ); + + for( TInt x = width/2 - 1; x >= 0; x-- ) + { + TUint32 p = *tempS; + *tempS++ = *--tempD; + *tempD = p; + } + + s += bytesPerRow; + + d += bytesPerRow; + } + } + break; + + // IYUV + case CVtImage::EVtColorIYUV: + MirrorIYUV( reinterpret_cast< const CVtImageIYUV& >( aTarget ), reinterpret_cast< CVtImageIYUV& >( aTarget ) ); + break; + + default: + break; + + } + } + +// ----------------------------------------------------------------------------- +// CVtImageRotatorImplMirrorFlip::MirrorIYUV( const CVtImageIYUV& aSource, +// CVtImageIYUV& aTarget ) +// ----------------------------------------------------------------------------- +void CVtImageRotatorImplMirrorFlip::MirrorIYUV( const CVtImageIYUV& aSource, + CVtImageIYUV& aTarget ) + { + MirrorPlane( aSource.Y(), aTarget.Y(), aSource.Size().iWidth, + aSource.Size().iHeight, aSource.BytesPerRow() ); + MirrorPlane( aSource.U(), aTarget.U(), aSource.UVPlaneWidth(), + aSource.UVPlaneHeight(), aSource.UVPlaneWidth() ); + MirrorPlane( aSource.V(), aTarget.V(), aSource.UVPlaneWidth(), + aSource.UVPlaneHeight(), aSource.UVPlaneWidth() ); + } + +// ----------------------------------------------------------------------------- +// CVtImageRotatorImplMirrorFlip::MirrorPlane( TUint8* aSource, TUint8* aTarget, +// TInt aWidth, TInt aHeight, TInt aBytesPerRow ) +// ----------------------------------------------------------------------------- +void CVtImageRotatorImplMirrorFlip::MirrorPlane( TUint8* aSource, + TUint8* aTarget, TInt aWidth, TInt aHeight, TInt aBytesPerRow ) + { + if( aSource != aTarget ) + { + aTarget += aBytesPerRow; + for( TInt y = aHeight - 1; y >= 0; y-- ) + { + register const TUint8* tempS = aSource; + register TUint8* tempD = aTarget; + for( TInt x = aWidth - 1; x >= 0; x-- ) + { + *--tempD = *tempS++; + } + aSource += aBytesPerRow; + aTarget += aBytesPerRow; + } + } + else + { + aTarget += aBytesPerRow; + for( TInt y = aHeight - 1; y >= 0; y-- ) + { + register TUint8* tempS = aSource; + register TUint8* tempD = aTarget; + for( TInt x = aWidth/2 - 1; x >= 0; x-- ) + { + TUint8 p = *tempS; + *tempS++ = *--tempD; + *tempD = p; + } + aSource += aBytesPerRow; + aTarget += aBytesPerRow; + } + } + } + +// ----------------------------------------------------------------------------- +// CVtImageRotatorImplMirrorFlip::Flip() +// ----------------------------------------------------------------------------- +void CVtImageRotatorImplMirrorFlip::Flip() + { + if( iSource->DisplayMode() == CVtImage::EVtColorIYUV ) + { + FlipIYUV + ( + reinterpret_cast< const CVtImageIYUV& >( *iSource ), + reinterpret_cast< CVtImageIYUV& >( *iTarget ) + ); + } + else + { + TInt bytesPerRow( iSource->BytesPerRow() ); + + TInt height( iSource->Size().iHeight ); + + const TUint8* s = reinterpret_cast< const TUint8* >( iSource->DataAddress() ); + + TUint8* d = reinterpret_cast< TUint8* >( iTarget->DataAddress() ); + + d += ( height - 1 ) * bytesPerRow; + + for( TInt y = height - 1; y >= 0; y-- ) + { + Mem::Copy( d, s, bytesPerRow ); + s += bytesPerRow; + d -= bytesPerRow; + } + } + } + +// ----------------------------------------------------------------------------- +// CVtImageRotatorImplMirrorFlip::FlipIYUV() +// ----------------------------------------------------------------------------- +void CVtImageRotatorImplMirrorFlip::FlipIYUV + ( + const CVtImageIYUV& aSource, + CVtImageIYUV& aTarget + ) + { + FlipPlane( aSource.Y(), aTarget.Y(), aSource.Size().iHeight, aSource.BytesPerRow() ); + FlipPlane( aSource.U(), aTarget.U(), aSource.UVPlaneHeight(), aSource.UVPlaneWidth() ); + FlipPlane( aSource.V(), aTarget.V(), aSource.UVPlaneHeight(), aSource.UVPlaneWidth() ); + } + +// ----------------------------------------------------------------------------- +// CVtImageRotatorImplMirrorFlip::FlipPlane() +// ----------------------------------------------------------------------------- +void CVtImageRotatorImplMirrorFlip::FlipPlane + ( + TUint8* aSource, + TUint8* aTarget, + TInt aHeight, + TInt aBytesPerRow + ) + { + TBool doSwap = ( aSource == aTarget ); + + aTarget += ( aHeight - 1 ) * aBytesPerRow; + + if( doSwap ) + { + for( TInt y = aHeight / 2 - 1; y >= 0; y-- ) + { + Mem::Swap( aTarget, aSource, aBytesPerRow ); + aSource += aBytesPerRow; + aTarget -= aBytesPerRow; + } + } + else + { + for( TInt y = aHeight - 1; y >= 0; y-- ) + { + Mem::Copy( aTarget, aSource, aBytesPerRow ); + aSource += aBytesPerRow; + aTarget -= aBytesPerRow; + } + } + } + +// ----------------------------------------------------------------------------- +// CVtImageRotatorImplMirrorFlip::Flip( CVtImage& aTarget ) +// ----------------------------------------------------------------------------- +void CVtImageRotatorImplMirrorFlip::Flip( CVtImage& aTarget ) + { + if( iSource->DisplayMode() == CVtImage::EVtColorIYUV ) + { + FlipIYUV + ( + reinterpret_cast< const CVtImageIYUV& >( aTarget ), + reinterpret_cast< CVtImageIYUV& >( aTarget ) + ); + } + else + { + TInt bytesPerRow( aTarget.BytesPerRow() ); + + TInt height( aTarget.Size().iHeight ); + + TUint8* s = reinterpret_cast< TUint8* >( aTarget.DataAddress() ); + + TUint8* d = s; + + d += ( height - 1 ) * bytesPerRow; + + for( TInt y = height / 2 - 1; y >= 0; y-- ) + { + Mem::Swap( d, s, bytesPerRow ); + s += bytesPerRow; + d -= bytesPerRow; + } + } + } + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/src/CVtImageScaler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/src/CVtImageScaler.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,273 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + +// INCLUDE FILES + +#include +#include + +#include "CVtImageScaler.h" +#include "CVtImageScalerImpl.h" +#include "CVtImageScalerImplNearest.h" +#include "CVtImageScalerImplWeightedAverage.h" +#include "CVtImageScalerImplBilinear.h" + +// CONSTANTS + +_LIT( KModuleName, "CVtImageScaler" ); + +// MACROS + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtImageScaler::NewL( MVtImageScalerObserver& aObserver, TQuality aQuality, +// TPriority aPriority ) +// ----------------------------------------------------------------------------- +EXPORT_C CVtImageScaler* CVtImageScaler::NewL( + MVtImageScalerObserver& aObserver, + TQuality aQuality, + TPriority aPriority ) + { + CVtImageScaler* self = new ( ELeave ) CVtImageScaler( aObserver, aPriority ); + CleanupStack::PushL( self ); + self->ConstructL( aQuality ); + CleanupStack::Pop(); // self + return self; + } + +// ----------------------------------------------------------------------------- +// CVtImageScaler::~CVtImageScaler() +// ----------------------------------------------------------------------------- +EXPORT_C CVtImageScaler::~CVtImageScaler() + { + Cancel(); + delete iAsyncCallBack; + delete iHeapLock; + delete iScalerImpl; + } + +// ----------------------------------------------------------------------------- +// CVtImageScaler::SetQualityL( TQuality aQuality ) +// ----------------------------------------------------------------------------- +EXPORT_C void CVtImageScaler::SetQualityL( TQuality aQuality ) + { + delete iScalerImpl; + iScalerImpl = 0; + + switch( aQuality ) + { + case ENearest: + iScalerImpl = new ( ELeave ) CVtImageScalerImplNearest(); + break; + + case EWeightedAverage: + iScalerImpl = new ( ELeave ) CVtImageScalerImplWeightedAverage(); + break; + + case EBilinear: + iScalerImpl = new ( ELeave ) CVtImageScalerImplBilinear(); + break; + } + } + +// ----------------------------------------------------------------------------- +// CVtImageScaler::ScaleL( const CVtImage& aSource, CVtImage& aTarget ) +// ----------------------------------------------------------------------------- +EXPORT_C void CVtImageScaler::ScaleL( + const CVtImage& aSource, + CVtImage& aTarget ) + { + if( !IsActive() ) + { + if( !iScalerImpl ) + { + User::Leave( KErrNotReady ); + } + iScalerImpl->SetSourceTargetL( aSource, aTarget ); + iCancelled = EFalse; + Activate(); + iAsyncCallBack->CallBack(); + } + else + { + User::Panic( KModuleName(), EBusy ); + } + } + +// ----------------------------------------------------------------------------- +// CVtImageScaler::Scale( const CVtImage& aSource, CVtImage& aTarget ) +// ----------------------------------------------------------------------------- +EXPORT_C void CVtImageScaler::Scale( + const CVtImage& aSource, + CVtImage& aTarget ) + { + TRAPD( result, ScaleL( aSource, aTarget ) ); + if( result != KErrNone ) + { + Activate(); + Signal( result ); + } + } + +// ----------------------------------------------------------------------------- +// CVtImageScaler::ScaleNowL( const CVtImage& aSource, CVtImage& aTarget ) +// ----------------------------------------------------------------------------- +EXPORT_C void CVtImageScaler::ScaleNowL( + const CVtImage& aSource, CVtImage& aTarget ) + { + if( !iScalerImpl ) + { + User::Leave( KErrNotReady ); + } + + iScalerImpl->SetSourceTargetL( aSource, aTarget ); + + TInt result; + TBool more; + TBool needsLock( iScalerImpl->NeedHeapLock() ); + do + { + + if ( needsLock ) + { + iHeapLock->LockHeap( ETrue ); + } + + result = iScalerImpl->Scale( more ); + + if ( needsLock ) + { + iHeapLock->UnlockHeap( ETrue ); + } + + } while ( more && ( result == KErrNone ) ); + + User::LeaveIfError( result ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScaler::CVtImageScaler() +// ----------------------------------------------------------------------------- +CVtImageScaler::CVtImageScaler( MVtImageScalerObserver& aObserver, TPriority aPriority ) +: CActive( aPriority ), iObserver( aObserver ) + { + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScaler::ConstructL( TQuality aQuality ) +// ----------------------------------------------------------------------------- +void CVtImageScaler::ConstructL( TQuality aQuality ) + { + SetQualityL( aQuality ); + iHeapLock = new ( ELeave ) CFbsBitmap(); + iHeapLock->Create( TSize( 1, 1 ), EColor256 ); + iAsyncCallBack = new ( ELeave ) + CAsyncCallBack( TCallBack( StaticScale, this ), Priority() ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScaler::Activate +// ----------------------------------------------------------------------------- +void CVtImageScaler::Activate() + { + iStatus = KRequestPending; + SetActive(); + } + +// ----------------------------------------------------------------------------- +// CVtImageScaler::Signal( TInt aError ) +// ----------------------------------------------------------------------------- +void CVtImageScaler::Signal( TInt aError ) + { + TRequestStatus* pStatus = &iStatus; + User::RequestComplete( pStatus, aError ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScaler::RunL() +// ----------------------------------------------------------------------------- +void CVtImageScaler::RunL() + { + iObserver.ScalingFinished( iStatus.Int() ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScaler::DoCancel() +// ----------------------------------------------------------------------------- +void CVtImageScaler::DoCancel() + { + if ( iStatus == KRequestPending ) + { + iCancelled = ETrue; + Signal( KErrCancel ); + iObserver.ScalingFinished( KErrCancel ); + } + } + +// ----------------------------------------------------------------------------- +// CVtImageScaler::StaticScale() +// ----------------------------------------------------------------------------- +TInt CVtImageScaler::StaticScale( TAny* aPtr ) + { + CVtImageScaler* self = reinterpret_cast< CVtImageScaler* >( aPtr ); + self->DoScale(); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVtImageScaler::DoScale +// ----------------------------------------------------------------------------- +void CVtImageScaler::DoScale() + { + if ( !iCancelled ) + { + TBool more; + TBool needsLock = iScalerImpl->NeedHeapLock(); + if ( needsLock ) + { + iHeapLock->LockHeap( ETrue ); + } + TInt result = iScalerImpl->Scale( more ); + if ( needsLock ) + { + iHeapLock->UnlockHeap( ETrue ); + } + if ( !more || ( result != KErrNone ) ) + { + Signal( result ); + } + else + { + iAsyncCallBack->CallBack(); + } + } + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/src/CVtImageScalerImpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/src/CVtImageScalerImpl.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,157 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + +// INCLUDE FILES + +#include +#include + +#include "CVtImageScalerImpl.h" +#include "cvtimage.h" +#include "CVtImageBitmap.h" + +// MACROS + +#ifdef _DEBUG + #include + #define PRINT RDebug::Print + #define _IFDBG(a) a +#else + #define PRINT + #define _IFDBG(a) +#endif + + +// ============================ MEMBER FUNCTIONS =============================== + +// ========================== CVtImageScalerImpl ============================== + +// ----------------------------------------------------------------------------- +// CVtImageScalerImpl::CVtImageScalerImpl() +// ----------------------------------------------------------------------------- +CVtImageScalerImpl::CVtImageScalerImpl() : CActive( EPriorityStandard ) + { + _IFDBG(PRINT( _L("ScaleImpl.Ctor<") )); + CActiveScheduler::Add( this ); + _IFDBG(PRINT( _L("ScaleImpl.Ctor>") )); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImpl::~CVtImageScalerImpl() +// ----------------------------------------------------------------------------- +CVtImageScalerImpl::~CVtImageScalerImpl() + { + _IFDBG(PRINT( _L("ScaleImpl.~<") )); + Cancel(); + delete iScaler; + _IFDBG(PRINT( _L("ScaleImpl.~>") )); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImpl::SetSourceTargetL( +// const CVtImage& aSource, CVtImage& aTarget ) +// ----------------------------------------------------------------------------- +void CVtImageScalerImpl::SetSourceTargetL( + const CVtImage& aSource, + CVtImage& aTarget ) + { + iSource = iTarget = 0; + LeaveIfNotValidSizeL( aSource.Size(), TSize( 2, 2 ) ); + LeaveIfNotValidSizeL( aTarget.Size() ); + ValidateSourceTargetL( aSource, aTarget ); + iSource = &aSource; + iTarget = &aTarget; + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImpl::NeedHeapLock() const +// ----------------------------------------------------------------------------- +TBool CVtImageScalerImpl::NeedHeapLock() const + { + return iSource->NeedHeapLock() || iTarget->NeedHeapLock(); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImpl::ScaleWithBitmapScalerL() +// ----------------------------------------------------------------------------- +void CVtImageScalerImpl::ScaleWithBitmapScalerL( + const CBitmapScaler::TQualityAlgorithm +#ifdef _DEBUG + aQuality +#endif // _DEBUG + ) + { + _IFDBG(PRINT( _L("ScaleImpl.ScaleWithBitmapScalerL<") )); + if ( IsActive() || iActiveSchedulerWait.IsStarted() ) + { + _IFDBG(PRINT( _L("ScaleImpl.ScaleWithBitmapScalerL LEAVE KErrInUse>") )); + User::Leave( KErrInUse ); + } + _IFDBG(PRINT( _L("ScaleImpl::ScaleWithBitmapScalerL aQuality = %d"), aQuality )); + CFbsBitmap& source( static_cast< CVtImageBitmap* >( + const_cast< CVtImage* >( iSource ) )->Bitmap() ); + CFbsBitmap& target( static_cast< CVtImageBitmap* >( iTarget )->Bitmap() ); + iScaler = CBitmapScaler::NewL(); + SetActive(); + iScaler->Scale( &iStatus, source, target, EFalse ); + iActiveSchedulerWait.Start(); + delete iScaler; iScaler = NULL; + _IFDBG(PRINT( _L("ScaleImpl.ScaleWithBitmapScalerL iStatus.Int() = %d"), iStatus.Int() )); + User::LeaveIfError( iStatus.Int() ); + _IFDBG(PRINT( _L("ScaleImpl.ScaleWithBitmapScalerL>") )); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImpl::LeaveIfNotValidSizeL( +// const TSize& aSize, const TSize aMinSize ) +// ----------------------------------------------------------------------------- +void CVtImageScalerImpl::LeaveIfNotValidSizeL( + const TSize& aSize, + const TSize aMinSize ) + { + _IFDBG(PRINT( _L("ScaleImpl.LeaveIfNotValidSizeL<") )); + if( ( aSize.iWidth < aMinSize.iWidth ) || + ( aSize.iHeight < aMinSize.iHeight ) ) + { + User::Leave( KErrNotSupported ); + } + _IFDBG(PRINT( _L("ScaleImpl.LeaveIfNotValidSizeL>") )); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImpl::RunL() +// ----------------------------------------------------------------------------- +void CVtImageScalerImpl::RunL() + { + _IFDBG(PRINT( _L("CVtImageScalerImpl.RunL") )); + iActiveSchedulerWait.AsyncStop(); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImpl::RunL() +// ----------------------------------------------------------------------------- +void CVtImageScalerImpl::DoCancel() + { + _IFDBG(PRINT( _L("CVtImageScalerImpl.DoCancel") )); + iScaler->Cancel(); + iActiveSchedulerWait.AsyncStop(); + } + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/src/CVtImageScalerImplBilinear.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/src/CVtImageScalerImplBilinear.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,1462 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + +// INCLUDE FILES + +#include +#include + +#include "CVtImageScalerImplBilinear.h" +#include "cvtimage.h" +#include "CVtImageScalerMacros.h" + +// MACROS + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// LOCAL CONSTANTS AND MACROS + +const TUint32 KDecimalBits = 14; // 18.14 pseudo real format, + // this must be lower than 15! + +// ============================ MEMBER FUNCTIONS =============================== + +// ======================= CVtImageScalerImplBilinear ========================== + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplBilinear::Scale( TBool& aContinue ) +// ----------------------------------------------------------------------------- +TInt CVtImageScalerImplBilinear::Scale( TBool& aContinue ) + { + TInt result( KErrNone ); + + aContinue = EFalse; + + // this implementation does not support different display modes for source + // and target + if( iSource->DisplayMode() != iTarget->DisplayMode() ) + { + return KErrNotSupported; + } + + // if sizes are same, just copy the data + if( iSource->Size() == iTarget->Size() ) + { + Mem::Copy( + iTarget->DataAddress(), + iSource->DataAddress(), + iTarget->BytesPerRow() * iTarget->Size().iHeight ); + } + else if ( ( iSource->Size().iHeight * 2 == iTarget->Size().iHeight ) + && ( iSource->Size().iWidth * 2 == iTarget->Size().iWidth ) ) + { + switch( iSource->DisplayMode() ) + { + case CVtImage::EVtColor4K: + Scale2x4K64K( 0xeee ); // 0000ggggbbbbrrrr -> + break; // mask = %0000111011101110 = 0xeee + + case CVtImage::EVtColor64K: + Scale2x4K64K( 0xf7de ); // bbbbbggggggrrrrr -> + break; // mask = %1111011111011110 = 0xf7de + + case CVtImage::EVtColor16M: + Scale2x16M(); + break; + + case CVtImage::EVtColor16MU: + case CVtImage::EVtColor16MA: + Scale2x16MU16MA(); + break; + + default: + if ( iSource->Type() == CVtImage::EVtImageBitmap && + iTarget->Type() == CVtImage::EVtImageBitmap ) + { + TRAPD( error, + ScaleWithBitmapScalerL( + CBitmapScaler::EMaximumQuality ) ); + result = error; + } + else + { + result = KErrNotSupported; + } + } + } + else + { + Initialize(); + + switch( iSource->DisplayMode() ) + { + case CVtImage::EVtColor4K: + Scale4K(); + break; + + case CVtImage::EVtColor64K: + Scale64K(); + break; + + case CVtImage::EVtColor16M: + Scale16M(); + break; + + case CVtImage::EVtColor16MU: + Scale16MU(); + break; + + case CVtImage::EVtColor16MA: + Scale16MA(); + break; + + default: + if ( iSource->Type() == CVtImage::EVtImageBitmap && + iTarget->Type() == CVtImage::EVtImageBitmap ) + { + TRAPD( error, + ScaleWithBitmapScalerL( + CBitmapScaler::EMaximumQuality ) ); + result = error; + } + else + { + result = KErrNotSupported; + } + } + } + + return result; + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplBilinear::ValidateSourceTargetL( +// const CVtImage& aSource, CVtImage& aTarget ) +// ----------------------------------------------------------------------------- +void CVtImageScalerImplBilinear::ValidateSourceTargetL( + const CVtImage& aSource, + CVtImage& aTarget ) + { + if( aSource.DisplayMode() != aTarget.DisplayMode() ) + { + User::Leave( KErrNotSupported ); + } + + switch( aSource.DisplayMode() ) + { + case CVtImage::EVtColor4K: + case CVtImage::EVtColor64K: + case CVtImage::EVtColor16M: + case CVtImage::EVtColor16MU: + case CVtImage::EVtColor16MA: + break; + + default: + // Scaling for bitmaps is supported for other display modes + if ( !( aSource.Type() == CVtImage::EVtImageBitmap && + aTarget.Type() == CVtImage::EVtImageBitmap ) ) + { + User::Leave( KErrNotSupported ); + } + } + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplBilinear::Initialize() +// ----------------------------------------------------------------------------- +void CVtImageScalerImplBilinear::Initialize() + { + iU = ( 1 << KDecimalBits ) * iSource->Size().iWidth / + iTarget->Size().iWidth; + iV = ( 1 << KDecimalBits ) * iSource->Size().iHeight / + iTarget->Size().iHeight; + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplBilinear::Scale4K() +// ----------------------------------------------------------------------------- +void CVtImageScalerImplBilinear::Scale4K() + { + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplBilinear::Scale4K() >>" ), RThread().Id().operator TUint() ) ); + + TInt width = iTarget->Size().iWidth; + + TInt height = iTarget->Size().iHeight; + + TInt mod_width = width - ( ( 1 << KDecimalBits ) / iU ); + + TUint16* t = reinterpret_cast< TUint16* >( iTarget->DataAddress() ); + + TUint32 sourceY( 0 ); + + TUint32 b00( 0 ); + TUint32 g00( 0 ); + TUint32 r00( 0 ); + TUint32 b01( 0 ); + TUint32 g01( 0 ); + TUint32 r01( 0 ); + TUint32 b10( 0 ); + TUint32 g10( 0 ); + TUint32 r10( 0 ); + TUint32 b11( 0 ); + TUint32 g11( 0 ); + TUint32 r11( 0 ); + + for( TInt y = 0; y < height; y++ ) + { + TUint16* s = reinterpret_cast< TUint16* >( + iSource->LineAddress( sourceY >> KDecimalBits ) ); + TUint16* snext = reinterpret_cast< TUint16* >( + iSource->LineAddress( ( sourceY >> KDecimalBits ) + 1 ) ); + + TUint32 invdv = sourceY & ( ( 1 << KDecimalBits ) - 1 ); // decimal part + TUint32 dv = ( 1 << KDecimalBits ) - invdv; // 1 - decimal part + + TUint32 sourceX( 0 ); + TUint32 x0prev( TUint32( -1 ) ); + + TInt x; + + for( x = 0; x < mod_width; x++ ) + { + TUint32 x0 = sourceX >> KDecimalBits; + + // If the source is still same then we don't have to fetch + // pixels from memory and unpack them again + if( x0 != x0prev ) + { + TUint32 p0 = *( s + x0 ); + + b00 = UNPACK_4K_BLUE( p0 ); + g00 = UNPACK_4K_GREEN( p0 ); + r00 = UNPACK_4K_RED( p0 ); + + p0 = *( s + x0 + 1 ); + + b01 = UNPACK_4K_BLUE( p0 ); + g01 = UNPACK_4K_GREEN( p0 ); + r01 = UNPACK_4K_RED( p0 ); + + p0 = *( snext + x0 ); + + b10 = UNPACK_4K_BLUE( p0 ); + g10 = UNPACK_4K_GREEN( p0 ); + r10 = UNPACK_4K_RED( p0 ); + + p0 = *( snext + x0 + 1 ); + + b11 = UNPACK_4K_BLUE( p0 ); + g11 = UNPACK_4K_GREEN( p0 ); + r11 = UNPACK_4K_RED( p0 ); + + x0prev = x0; + } + + TUint32 invdu = sourceX & ( ( 1 << KDecimalBits ) - 1 ); // decimal + TUint32 du = ( 1 << KDecimalBits ) - invdu; // 1 - decimal part + + TUint32 w1 = ( du * dv ) >> KDecimalBits; + TUint32 w2 = ( invdu * dv ) >> KDecimalBits; + TUint32 w3 = ( du * invdv ) >> KDecimalBits; + TUint32 w4 = ( invdu * invdv ) >> KDecimalBits; + + TUint32 bres = w1 * b00 + w2 * b01 + w3 * b10 + w4 * b11; + bres += ( 1 << ( KDecimalBits - 1 ) ); + TUint32 gres = w1 * g00 + w2 * g01 + w3 * g10 + w4 * g11; + gres += ( 1 << ( KDecimalBits - 1 ) ); + TUint32 rres = w1 * r00 + w2 * r01 + w3 * r10 + w4 * r11; + rres += ( 1 << ( KDecimalBits - 1 ) ); + + *t = 0; + + *t++ = PACK_4K_BGR( + bres >> KDecimalBits, + gres >> KDecimalBits, + rres >> KDecimalBits ); + + sourceX += iU; + } + + // last columns + for( ; x < width; x++ ) + { + TUint32 x0 = sourceX >> KDecimalBits; + + // If the source is still same then we don't have to fetch pixels + // from memory and unpack them again + if( x0 != x0prev ) + { + TUint32 p0 = *( s + x0 ); + b01 = b00 = UNPACK_4K_BLUE( p0 ); + g01 = g00 = UNPACK_4K_GREEN( p0 ); + r01 = r00 = UNPACK_4K_RED( p0 ); + + p0 = *( snext + x0 ); + b11 = b10 = UNPACK_4K_BLUE( p0 ); + g11 = g10 = UNPACK_4K_GREEN( p0 ); + r11 = r10 = UNPACK_4K_RED( p0 ); + + x0prev = x0; + } + + TUint32 invdu = sourceX & ( ( 1 << KDecimalBits ) - 1 ); // decimal + TUint32 du = ( 1 << KDecimalBits ) - invdu; // 1 - decimal part + + TUint32 w1 = ( du * dv ) >> KDecimalBits; + TUint32 w2 = ( invdu * dv ) >> KDecimalBits; + TUint32 w3 = ( du * invdv ) >> KDecimalBits; + TUint32 w4 = ( invdu * invdv ) >> KDecimalBits; + + TUint32 bres = w1 * b00 + w2 * b01 + w3 * b10 + w4 * b11; + bres += ( 1 << ( KDecimalBits - 1 ) ); + TUint32 gres = w1 * g00 + w2 * g01 + w3 * g10 + w4 * g11; + gres += ( 1 << ( KDecimalBits - 1 ) ); + TUint32 rres = w1 * r00 + w2 * r01 + w3 * r10 + w4 * r11; + rres += ( 1 << ( KDecimalBits - 1 ) ); + + *t++ = PACK_4K_BGR( + bres >> KDecimalBits, + gres >> KDecimalBits, + rres >> KDecimalBits ); + + sourceX += iU; + } + + // if width is not even -> then we need to skip one additional byte + if( width & 1 ) + { + t++; + } + + sourceY += iV; + } + + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplBilinear::Scale4K() <<" ), RThread().Id().operator TUint() ) ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplBilinear::Scale64K() +// ----------------------------------------------------------------------------- +void CVtImageScalerImplBilinear::Scale64K() + { + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplBilinear::Scale64K() >>" ), RThread().Id().operator TUint() ) ); + + TInt width = iTarget->Size().iWidth; + + TInt height = iTarget->Size().iHeight; + + TInt mod_width = width - ( ( 1 << KDecimalBits ) / iU ); + + TUint16* t = reinterpret_cast< TUint16* >( iTarget->DataAddress() ); + + TUint32 sourceY( 0 ); + + TUint32 b00( 0 ); + TUint32 g00( 0 ); + TUint32 r00( 0 ); + TUint32 b01( 0 ); + TUint32 g01( 0 ); + TUint32 r01( 0 ); + TUint32 b10( 0 ); + TUint32 g10( 0 ); + TUint32 r10( 0 ); + TUint32 b11( 0 ); + TUint32 g11( 0 ); + TUint32 r11( 0 ); + + for( TInt y = 0; y < height; y++ ) + { + TUint16* s = reinterpret_cast< TUint16* >( + iSource->LineAddress( sourceY >> KDecimalBits ) ); + TUint16* snext = reinterpret_cast< TUint16* >( + iSource->LineAddress( ( sourceY >> KDecimalBits ) + 1 ) ); + + TUint32 invdv = sourceY & ( ( 1 << KDecimalBits ) - 1 ); // decimal part + TUint32 dv = ( 1 << KDecimalBits ) - invdv; // 1 - decimal part + + TUint32 sourceX( 0 ); + TUint32 x0prev( TUint32( -1 ) ); + + TInt x; + + for( x = 0; x < mod_width; x++ ) + { + TUint32 x0 = sourceX >> KDecimalBits; + + // If the source is still same then we don't have to fetch pixels + // from memory and unpack them again + if( x0 != x0prev ) + { + TUint32 p0 = *( s + x0 ); + + b00 = UNPACK_64K_BLUE( p0 ); + g00 = UNPACK_64K_GREEN( p0 ); + r00 = UNPACK_64K_RED( p0 ); + + p0 = *( s + x0 + 1 ); + + b01 = UNPACK_64K_BLUE( p0 ); + g01 = UNPACK_64K_GREEN( p0 ); + r01 = UNPACK_64K_RED( p0 ); + + p0 = *( snext + x0 ); + + b10 = UNPACK_64K_BLUE( p0 ); + g10 = UNPACK_64K_GREEN( p0 ); + r10 = UNPACK_64K_RED( p0 ); + + p0 = *( snext + x0 + 1 ); + + b11 = UNPACK_64K_BLUE( p0 ); + g11 = UNPACK_64K_GREEN( p0 ); + r11 = UNPACK_64K_RED( p0 ); + + x0prev = x0; + } + + TUint32 invdu = sourceX & ( ( 1 << KDecimalBits ) - 1 ); // decimal + TUint32 du = ( 1 << KDecimalBits ) - invdu; // 1 - decimal part + + TUint32 w1 = ( du * dv ) >> KDecimalBits; + TUint32 w2 = ( invdu * dv ) >> KDecimalBits; + TUint32 w3 = ( du * invdv ) >> KDecimalBits; + TUint32 w4 = ( invdu * invdv ) >> KDecimalBits; + + TUint32 bres = w1 * b00 + w2 * b01 + w3 * b10 + w4 * b11; + bres += ( 1 << ( KDecimalBits - 1 ) ); + TUint32 gres = w1 * g00 + w2 * g01 + w3 * g10 + w4 * g11; + gres += ( 1 << ( KDecimalBits - 1 ) ); + TUint32 rres = w1 * r00 + w2 * r01 + w3 * r10 + w4 * r11; + rres += ( 1 << ( KDecimalBits - 1 ) ); + + *t++ = PACK_64K_BGR( + bres >> KDecimalBits, + gres >> KDecimalBits, + rres >> KDecimalBits ); + + sourceX += iU; + } + + // last columns + for( ; x < width; x++ ) + { + TUint32 x0 = sourceX >> KDecimalBits; + + // If the source is still same then we don't have to fetch pixels + // from memory and unpack them again + if( x0 != x0prev ) + { + TUint32 p0 = *( s + x0 ); + b01 = b00 = UNPACK_64K_BLUE( p0 ); + g01 = g00 = UNPACK_64K_GREEN( p0 ); + r01 = r00 = UNPACK_64K_RED( p0 ); + + p0 = *( snext + x0 ); + b11 = b10 = UNPACK_64K_BLUE( p0 ); + g11 = g10 = UNPACK_64K_GREEN( p0 ); + r11 = r10 = UNPACK_64K_RED( p0 ); + + x0prev = x0; + } + + TUint32 invdu = sourceX & ( ( 1 << KDecimalBits ) - 1 ); // decimal + TUint32 du = ( 1 << KDecimalBits ) - invdu; // 1 - decimal part + + TUint32 w1 = ( du * dv ) >> KDecimalBits; + TUint32 w2 = ( invdu * dv ) >> KDecimalBits; + TUint32 w3 = ( du * invdv ) >> KDecimalBits; + TUint32 w4 = ( invdu * invdv ) >> KDecimalBits; + + TUint32 bres = w1 * b00 + w2 * b01 + w3 * b10 + w4 * b11; + bres += ( 1 << ( KDecimalBits - 1 ) ); + TUint32 gres = w1 * g00 + w2 * g01 + w3 * g10 + w4 * g11; + gres += ( 1 << ( KDecimalBits - 1 ) ); + TUint32 rres = w1 * r00 + w2 * r01 + w3 * r10 + w4 * r11; + rres += ( 1 << ( KDecimalBits - 1 ) ); + + *t++ = PACK_64K_BGR( + bres >> KDecimalBits, + gres >> KDecimalBits, + rres >> KDecimalBits ); + + sourceX += iU; + } + + // if width is not even -> then we need to skip one additional byte + if( width & 1 ) + { + t++; + } + + sourceY += iV; + } + + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplBilinear::Scale64K() <<" ), RThread().Id().operator TUint() ) ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplBilinear::Scale16M() +// ----------------------------------------------------------------------------- +void CVtImageScalerImplBilinear::Scale16M() + { + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplBilinear::Scale16M() >>" ), RThread().Id().operator TUint() ) ); + + TInt width = iTarget->Size().iWidth; + + TInt height = iTarget->Size().iHeight; + + TInt mod_width = width - ( ( 1 << KDecimalBits ) / iU ); + + TUint32 t_pitch = iTarget->BytesPerRow(); + + TUint8* t = reinterpret_cast< TUint8* >( iTarget->DataAddress() ); + + TUint32 sourceY( 0 ); + + TUint32 b00( 0 ); + TUint32 g00( 0 ); + TUint32 r00( 0 ); + TUint32 b01( 0 ); + TUint32 g01( 0 ); + TUint32 r01( 0 ); + TUint32 b10( 0 ); + TUint32 g10( 0 ); + TUint32 r10( 0 ); + TUint32 b11( 0 ); + TUint32 g11( 0 ); + TUint32 r11( 0 ); + + for( TInt y = 0; y < height; y++ ) + { + TUint8* s = reinterpret_cast< TUint8* >( + iSource->LineAddress( sourceY >> KDecimalBits ) ); + TUint8* snext = reinterpret_cast< TUint8* >( + iSource->LineAddress( ( sourceY >> KDecimalBits ) + 1 ) ); + + TUint32 invdv = sourceY & ( ( 1 << KDecimalBits ) - 1 ); // decimal part + TUint32 dv = ( 1 << KDecimalBits ) - invdv; // 1 - decimal part + + TUint32 sourceX( 0 ); + TUint32 x0prev( TUint32( -1 ) ); + + TInt x; + + TUint8* d = t; + + for( x = 0; x < mod_width; x++ ) + { + TUint32 x0 = ( sourceX >> KDecimalBits ) * 3; + + if( x0 != x0prev ) + { + TUint8* tempSrc = s + x0; + + b00 = *tempSrc++; + g00 = *tempSrc++; + r00 = *tempSrc++; + + b01 = *tempSrc++; + g01 = *tempSrc++; + r01 = *tempSrc++; + + tempSrc = snext + x0; + + b10 = *tempSrc++; + g10 = *tempSrc++; + r10 = *tempSrc++; + + b11 = *tempSrc++; + g11 = *tempSrc++; + r11 = *tempSrc++; + + x0prev = x0; + } + + TUint32 invdu = sourceX & ( ( 1 << KDecimalBits ) - 1 ); // decimal + TUint32 du = ( 1 << KDecimalBits ) - invdu; // 1 - decimal part + + TUint32 w1 = ( du * dv ) >> KDecimalBits; + TUint32 w2 = ( invdu * dv ) >> KDecimalBits; + TUint32 w3 = ( du * invdv ) >> KDecimalBits; + TUint32 w4 = ( invdu * invdv ) >> KDecimalBits; + + TUint32 bres = w1 * b00 + w2 * b01 + w3 * b10 + w4 * b11; + bres += ( 1 << ( KDecimalBits - 1 ) ); + TUint32 gres = w1 * g00 + w2 * g01 + w3 * g10 + w4 * g11; + gres += ( 1 << ( KDecimalBits - 1 ) ); + TUint32 rres = w1 * r00 + w2 * r01 + w3 * r10 + w4 * r11; + rres += ( 1 << ( KDecimalBits - 1 ) ); + + *d++ = static_cast< TUint8 >( bres >> KDecimalBits ); + *d++ = static_cast< TUint8 >( gres >> KDecimalBits ); + *d++ = static_cast< TUint8 >( rres >> KDecimalBits ); + + sourceX += iU; + } + + // last columns + for( ; x < width; x++ ) + { + TUint32 x0 = ( sourceX >> KDecimalBits ) * 3; + + if( x0 != x0prev ) + { + TUint8* tempSrc = s + x0; + + b01 = b00 = *tempSrc++; + g01 = g00 = *tempSrc++; + r01 = r00 = *tempSrc++; + + tempSrc = snext + x0; + + b11 = b10 = *tempSrc++; + g11 = g10 = *tempSrc++; + r11 = r10 = *tempSrc++; + + x0prev = x0; + } + + TUint32 invdu = sourceX & ( ( 1 << KDecimalBits ) - 1 ); // decimal + TUint32 du = ( 1 << KDecimalBits ) - invdu; // 1 - decimal part + + TUint32 w1 = ( du * dv ) >> KDecimalBits; + TUint32 w2 = ( invdu * dv ) >> KDecimalBits; + TUint32 w3 = ( du * invdv ) >> KDecimalBits; + TUint32 w4 = ( invdu * invdv ) >> KDecimalBits; + + TUint32 bres = w1 * b00 + w2 * b01 + w3 * b10 + w4 * b11; + bres += ( 1 << ( KDecimalBits - 1 ) ); + TUint32 gres = w1 * g00 + w2 * g01 + w3 * g10 + w4 * g11; + gres += ( 1 << ( KDecimalBits - 1 ) ); + TUint32 rres = w1 * r00 + w2 * r01 + w3 * r10 + w4 * r11; + rres += ( 1 << ( KDecimalBits - 1 ) ); + + *d++ = static_cast< TUint8 >( bres >> KDecimalBits ); + *d++ = static_cast< TUint8 >( gres >> KDecimalBits ); + *d++ = static_cast< TUint8 >( rres >> KDecimalBits ); + + sourceX += iU; + } + + t += t_pitch; + + sourceY += iV; + } + + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplBilinear::Scale16M() <<" ), RThread().Id().operator TUint() ) ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplBilinear::Scale16MU() +// ----------------------------------------------------------------------------- +void CVtImageScalerImplBilinear::Scale16MU() + { + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplBilinear::Scale16MU() >>" ), RThread().Id().operator TUint() ) ); + + TInt width = iTarget->Size().iWidth; + + TInt height = iTarget->Size().iHeight; + + TInt mod_width = width - ( ( 1 << KDecimalBits ) / iU ); + + TUint32* t = iTarget->DataAddress(); + + TUint32 sourceY( 0 ); + + TUint32 b00( 0 ); + TUint32 g00( 0 ); + TUint32 r00( 0 ); + TUint32 b01( 0 ); + TUint32 g01( 0 ); + TUint32 r01( 0 ); + TUint32 b10( 0 ); + TUint32 g10( 0 ); + TUint32 r10( 0 ); + TUint32 b11( 0 ); + TUint32 g11( 0 ); + TUint32 r11( 0 ); + + for( TInt y = 0; y < height; y++ ) + { + TUint32* s = iSource->LineAddress( sourceY >> KDecimalBits ); + TUint32* snext = iSource->LineAddress( ( sourceY >> KDecimalBits ) + 1 ); + + TUint32 invdv = sourceY & ( ( 1 << KDecimalBits ) - 1 ); // decimal part + TUint32 dv = ( 1 << KDecimalBits ) - invdv; // 1 - decimal part + + TUint32 sourceX( 0 ); + TUint32 x0prev( TUint32( -1 ) ); + + TInt x; + + for( x = 0; x < mod_width; x++ ) + { + TUint32 x0 = sourceX >> KDecimalBits; + + // If the source is still same then we don't have to fetch pixels + // from memory and unpack them again + if( x0 != x0prev ) + { + TUint32 p0 = *( s + x0 ); + + b00 = UNPACK_16MU_BLUE( p0 ); + g00 = UNPACK_16MU_GREEN( p0 ); + r00 = UNPACK_16MU_RED( p0 ); + + p0 = *( s + x0 + 1 ); + + b01 = UNPACK_16MU_BLUE( p0 ); + g01 = UNPACK_16MU_GREEN( p0 ); + r01 = UNPACK_16MU_RED( p0 ); + + p0 = *( snext + x0 ); + + b10 = UNPACK_16MU_BLUE( p0 ); + g10 = UNPACK_16MU_GREEN( p0 ); + r10 = UNPACK_16MU_RED( p0 ); + + p0 = *( snext + x0 + 1 ); + + b11 = UNPACK_16MU_BLUE( p0 ); + g11 = UNPACK_16MU_GREEN( p0 ); + r11 = UNPACK_16MU_RED( p0 ); + + x0prev = x0; + } + + TUint32 invdu = sourceX & ( ( 1 << KDecimalBits ) - 1 ); // decimal + TUint32 du = ( 1 << KDecimalBits ) - invdu; // 1 - decimal part + + TUint32 w1 = ( du * dv ) >> KDecimalBits; + TUint32 w2 = ( invdu * dv ) >> KDecimalBits; + TUint32 w3 = ( du * invdv ) >> KDecimalBits; + TUint32 w4 = ( invdu * invdv ) >> KDecimalBits; + + TUint32 bres = w1 * b00 + w2 * b01 + w3 * b10 + w4 * b11; + bres += ( 1 << ( KDecimalBits - 1 ) ); + TUint32 gres = w1 * g00 + w2 * g01 + w3 * g10 + w4 * g11; + gres += ( 1 << ( KDecimalBits - 1 ) ); + TUint32 rres = w1 * r00 + w2 * r01 + w3 * r10 + w4 * r11; + rres += ( 1 << ( KDecimalBits - 1 ) ); + + *t++ = PACK_16MU_BGR( + bres >> KDecimalBits, + gres >> KDecimalBits, + rres >> KDecimalBits ); + + sourceX += iU; + } + + // last columns + for( ; x < width; x++ ) + { + TUint32 x0 = sourceX >> KDecimalBits; + + // If the source is still same then we don't have to fetch pixels + // from memory and unpack them again + if( x0 != x0prev ) + { + TUint32 p0 = *( s + x0 ); + b01 = b00 = UNPACK_16MU_BLUE( p0 ); + g01 = g00 = UNPACK_16MU_GREEN( p0 ); + r01 = r00 = UNPACK_16MU_RED( p0 ); + + p0 = *( snext + x0 ); + b11 = b10 = UNPACK_16MU_BLUE( p0 ); + g11 = g10 = UNPACK_16MU_GREEN( p0 ); + r11 = r10 = UNPACK_16MU_RED( p0 ); + + x0prev = x0; + } + + TUint32 invdu = sourceX & ( ( 1 << KDecimalBits ) - 1 ); // decimal + TUint32 du = ( 1 << KDecimalBits ) - invdu; // 1 - decimal part + + TUint32 w1 = ( du * dv ) >> KDecimalBits; + TUint32 w2 = ( invdu * dv ) >> KDecimalBits; + TUint32 w3 = ( du * invdv ) >> KDecimalBits; + TUint32 w4 = ( invdu * invdv ) >> KDecimalBits; + + TUint32 bres = w1 * b00 + w2 * b01 + w3 * b10 + w4 * b11; + bres += ( 1 << ( KDecimalBits - 1 ) ); + TUint32 gres = w1 * g00 + w2 * g01 + w3 * g10 + w4 * g11; + gres += ( 1 << ( KDecimalBits - 1 ) ); + TUint32 rres = w1 * r00 + w2 * r01 + w3 * r10 + w4 * r11; + rres += ( 1 << ( KDecimalBits - 1 ) ); + + *t++ = PACK_16MU_BGR( + bres >> KDecimalBits, + gres >> KDecimalBits, + rres >> KDecimalBits ); + + sourceX += iU; + } + + sourceY += iV; + } + + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplBilinear::Scale16MU() <<" ), RThread().Id().operator TUint() ) ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplBilinear::Scale16MA() +// ----------------------------------------------------------------------------- +void CVtImageScalerImplBilinear::Scale16MA() + { + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplBilinear::Scale16MA() >>" ), RThread().Id().operator TUint() ) ); + + TInt width = iTarget->Size().iWidth; + + TInt height = iTarget->Size().iHeight; + + TInt mod_width = width - ( ( 1 << KDecimalBits ) / iU ); + + TUint32* t = iTarget->DataAddress(); + + TUint32 sourceY( 0 ); + + TUint32 a00( 0 ); + TUint32 b00( 0 ); + TUint32 g00( 0 ); + TUint32 r00( 0 ); + TUint32 a01( 0 ); + TUint32 b01( 0 ); + TUint32 g01( 0 ); + TUint32 r01( 0 ); + TUint32 a10( 0 ); + TUint32 b10( 0 ); + TUint32 g10( 0 ); + TUint32 r10( 0 ); + TUint32 a11( 0 ); + TUint32 b11( 0 ); + TUint32 g11( 0 ); + TUint32 r11( 0 ); + + for( TInt y = 0; y < height; y++ ) + { + TUint32* s = iSource->LineAddress( sourceY >> KDecimalBits ); + TUint32* snext = iSource->LineAddress( ( sourceY >> KDecimalBits ) + 1 ); + + TUint32 invdv = sourceY & ( ( 1 << KDecimalBits ) - 1 ); // decimal part + TUint32 dv = ( 1 << KDecimalBits ) - invdv; // 1 - decimal part + + TUint32 sourceX( 0 ); + TUint32 x0prev( TUint32( -1 ) ); + + TInt x; + + for( x = 0; x < mod_width; x++ ) + { + TUint32 x0 = sourceX >> KDecimalBits; + + // If the source is still same then we don't have to fetch pixels + // from memory and unpack them again + if( x0 != x0prev ) + { + TUint32 p0 = *( s + x0 ); + + a00 = UNPACK_16MA_ALPHA( p0 ); + b00 = UNPACK_16MA_BLUE( p0 ); + g00 = UNPACK_16MA_GREEN( p0 ); + r00 = UNPACK_16MA_RED( p0 ); + + p0 = *( s + x0 + 1 ); + + a01 = UNPACK_16MA_ALPHA( p0 ); + b01 = UNPACK_16MA_BLUE( p0 ); + g01 = UNPACK_16MA_GREEN( p0 ); + r01 = UNPACK_16MA_RED( p0 ); + + p0 = *( snext + x0 ); + + a10 = UNPACK_16MA_ALPHA( p0 ); + b10 = UNPACK_16MA_BLUE( p0 ); + g10 = UNPACK_16MA_GREEN( p0 ); + r10 = UNPACK_16MA_RED( p0 ); + + p0 = *( snext + x0 + 1 ); + + a11 = UNPACK_16MA_ALPHA( p0 ); + b11 = UNPACK_16MA_BLUE( p0 ); + g11 = UNPACK_16MA_GREEN( p0 ); + r11 = UNPACK_16MA_RED( p0 ); + + x0prev = x0; + } + + TUint32 invdu = sourceX & ( ( 1 << KDecimalBits ) - 1 ); // decimal + TUint32 du = ( 1 << KDecimalBits ) - invdu; // 1 - decimal part + + TUint32 w1 = ( du * dv ) >> KDecimalBits; + TUint32 w2 = ( invdu * dv ) >> KDecimalBits; + TUint32 w3 = ( du * invdv ) >> KDecimalBits; + TUint32 w4 = ( invdu * invdv ) >> KDecimalBits; + + TUint32 ares = w1 * a00 + w2 * a01 + w3 * a10 + w4 * a11; + ares += ( 1 << ( KDecimalBits - 1 ) ); + TUint32 bres = w1 * b00 + w2 * b01 + w3 * b10 + w4 * b11; + bres += ( 1 << ( KDecimalBits - 1 ) ); + TUint32 gres = w1 * g00 + w2 * g01 + w3 * g10 + w4 * g11; + gres += ( 1 << ( KDecimalBits - 1 ) ); + TUint32 rres = w1 * r00 + w2 * r01 + w3 * r10 + w4 * r11; + rres += ( 1 << ( KDecimalBits - 1 ) ); + + *t++ = PACK_16MA_ABGR( + ares >> KDecimalBits, + bres >> KDecimalBits, + gres >> KDecimalBits, + rres >> KDecimalBits ); + + sourceX += iU; + } + + // last columns + for( ; x < width; x++ ) + { + TUint32 x0 = sourceX >> KDecimalBits; + + // If the source is still same then we don't have to fetch pixels + // from memory and unpack them again + if( x0 != x0prev ) + { + TUint32 p0 = *( s + x0 ); + a01 = a00 = UNPACK_16MA_ALPHA( p0 ); + b01 = b00 = UNPACK_16MA_BLUE( p0 ); + g01 = g00 = UNPACK_16MA_GREEN( p0 ); + r01 = r00 = UNPACK_16MA_RED( p0 ); + + p0 = *( snext + x0 ); + a11 = a10 = UNPACK_16MA_ALPHA( p0 ); + b11 = b10 = UNPACK_16MA_BLUE( p0 ); + g11 = g10 = UNPACK_16MA_GREEN( p0 ); + r11 = r10 = UNPACK_16MA_RED( p0 ); + + x0prev = x0; + } + + TUint32 invdu = sourceX & ( ( 1 << KDecimalBits ) - 1 ); // decimal + TUint32 du = ( 1 << KDecimalBits ) - invdu; // 1 - decimal part + + TUint32 w1 = ( du * dv ) >> KDecimalBits; + TUint32 w2 = ( invdu * dv ) >> KDecimalBits; + TUint32 w3 = ( du * invdv ) >> KDecimalBits; + TUint32 w4 = ( invdu * invdv ) >> KDecimalBits; + + TUint32 ares = w1 * a00 + w2 * a01 + w3 * a10 + w4 * a11; + ares += ( 1 << ( KDecimalBits - 1 ) ); + TUint32 bres = w1 * b00 + w2 * b01 + w3 * b10 + w4 * b11; + bres += ( 1 << ( KDecimalBits - 1 ) ); + TUint32 gres = w1 * g00 + w2 * g01 + w3 * g10 + w4 * g11; + gres += ( 1 << ( KDecimalBits - 1 ) ); + TUint32 rres = w1 * r00 + w2 * r01 + w3 * r10 + w4 * r11; + rres += ( 1 << ( KDecimalBits - 1 ) ); + + *t++ = PACK_16MA_ABGR( + ares >> KDecimalBits, + bres >> KDecimalBits, + gres >> KDecimalBits, + rres >> KDecimalBits ); + + sourceX += iU; + } + + sourceY += iV; + } + + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplBilinear::Scale16MA() <<" ), RThread().Id().operator TUint() ) ); + } + + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplBilinear::Scale2x4K64K( TUint32 aMask ) +// ----------------------------------------------------------------------------- +void CVtImageScalerImplBilinear::Scale2x4K64K( TUint32 aMask ) + { + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplBilinear::Scale2x4K64K() >>" ), RThread().Id().operator TUint() ) ); + + TInt sheight = iSource->Size().iHeight; + TInt swidth = iSource->Size().iWidth; + TInt spitch = iSource->BytesPerRow(); + TInt dpitch = iTarget->BytesPerRow(); + + TUint32* s = iSource->DataAddress(); + TUint32* d = iTarget->DataAddress(); + TInt y; + + // first average source rows + for( y = 0; y < sheight; y++ ) + { + TUint32* s1 = s; + TUint32* d1 = d; + + TUint32 p = *s1++; // 2 pixels + TUint32 p1 = p & 0xffff; + TUint32 p2 = ( p >> 16 ) & 0xffff; + TInt x; + + for( x = 0; x < swidth/2 - 1; x++ ) + { + TUint32 p1a = ( ( ( p1 ^ p2 ) & aMask ) >> 1 ) + ( p1 & p2 ); + *d1++ = p1 | ( p1a << 16 ); + + p = *s1++; // 2 pixels + + p1 = p & 0xffff; + TUint32 p2a = ( ( ( p1 ^ p2 ) & aMask ) >> 1 ) + ( p1 & p2 ); + *d1++ = p2 | ( p2a << 16 ); + + p2 = ( p >> 16 ) & 0xffff; + } + + TUint32 p1a = ( ( ( p1 ^ p2 ) & aMask ) >> 1 ) + ( p1 & p2 ); + *d1++ = p1 | ( p1a << 16 ); + + if( swidth & 1 ) + { + p = *s1; // 2 pixels + p1 = p & 0xffff; + TUint32 p2a = ( ( ( p1 ^ p2 ) & aMask ) >> 1 ) + ( p1 & p2 ); + *d1++ = p2 | ( p2a << 16 ); + + p = *--s1; // 2 pixels + p2 = ( p >> 16 ) & 0xffff; + *d1++ = p1 | ( p1 << 16 ); + } + else + { + p = *--s1; // 2 pixels + p2 = ( p >> 16 ) & 0xffff; + *d1++ = p2 | ( p2 << 16 ); + } + + d = reinterpret_cast< TUint32* > + ( reinterpret_cast< TUint8* >( d ) + dpitch * 2 ); + s = reinterpret_cast< TUint32* > + ( reinterpret_cast< TUint8* >( s ) + spitch ); + } + + // then average rows between + d = iTarget->DataAddress(); + + TUint32 mask32bit = aMask | ( aMask << 16 ); + + for( y = 0; y < sheight - 1; y++ ) + { + TUint32* d1 = reinterpret_cast< TUint32* >( d ); + TUint32* d2 = reinterpret_cast< TUint32* > + ( reinterpret_cast< TUint8* >( d1 ) + dpitch ); + TUint32* d3 = reinterpret_cast< TUint32* > + ( reinterpret_cast< TUint8* >( d2 ) + dpitch ); + + for( TInt x = 0; x < swidth; x++ ) + { + TUint32 p1 = *d1++; + TUint32 p2 = *d3++; + *d2++ = ( ( ( p1 ^ p2 ) & mask32bit ) >> 1 ) + ( p1 & p2 ); + } + + d = reinterpret_cast< TUint32* > + ( reinterpret_cast< TUint8* >( d ) + dpitch * 2 ); + } + + // last row is just copy of previous row, because we cannot calculate + // average + Mem::Copy( reinterpret_cast< TUint8* >( d ) + dpitch, d, dpitch ); + + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplBilinear::Scale2x4K64K() <<" ), RThread().Id().operator TUint() ) ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplBilinear::Scale2x16M() +// ----------------------------------------------------------------------------- +void CVtImageScalerImplBilinear::Scale2x16M() + { + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplBilinear::Scale2x16M() >>" ), RThread().Id().operator TUint() ) ); + + TInt sheight = iSource->Size().iHeight; + TInt swidth = iSource->Size().iWidth; + TInt spitch = iSource->BytesPerRow(); + TInt dpitch = iTarget->BytesPerRow(); + + TUint8* s = reinterpret_cast< TUint8* >( iSource->DataAddress() ); + TUint8* d = reinterpret_cast< TUint8* >( iTarget->DataAddress() ); + + TInt y; + + for( y = 0; y < sheight; y++ ) + { + TUint8* s2 = s; + TUint8* d1 = d; + + TUint32 g1 = 0; + TUint32 b1 = 0; + TUint32 r1 = 0; + + TUint32 g2 = 0; + TUint32 b2 = 0; + TUint32 r2 = 0; + + for( TInt x = 0; x < swidth - 1; x++ ) + { + g1 = *s2++; + b1 = *s2++; + r1 = *s2++; + + *d1++ = static_cast< TUint8 >( g1 ); + *d1++ = static_cast< TUint8 >( b1 ); + *d1++ = static_cast< TUint8 >( r1 ); + + g2 = s2[ 0 ]; + b2 = s2[ 1 ]; + r2 = s2[ 2 ]; + + *d1++ = static_cast< TUint8 >( ( g1 + g2 ) >> 1 ); + *d1++ = static_cast< TUint8 >( ( b1 + b2 ) >> 1 ); + *d1++ = static_cast< TUint8 >( ( r1 + r2 ) >> 1 ); + } + + *d1++ = static_cast< TUint8 >( ( g1 + g2 ) >> 1 ); + *d1++ = static_cast< TUint8 >( ( b1 + b2 ) >> 1 ); + *d1++ = static_cast< TUint8 >( ( r1 + r2 ) >> 1 ); + + *d1++ = static_cast< TUint8 >( g2 ); + *d1++ = static_cast< TUint8 >( b2 ); + *d1++ = static_cast< TUint8 >( r2 ); + + d += dpitch * 2; + s += spitch; + } + + // then average rows between + d = reinterpret_cast< TUint8* >( iTarget->DataAddress() ); + + for( y = 0; y < sheight - 1; y++ ) + { + TUint8* d1 = d; + TUint8* d2 = d1 + dpitch; + TUint8* d3 = d2 + dpitch; + + for( TInt x = 0; x < swidth; x++ ) + { + TUint32 g1 = *d1++; + TUint32 g2 = *d3++; + *d2++ = static_cast< TUint8 >( ( g1 + g2 ) >> 1 ); + + TUint32 b1 = *d1++; + TUint32 b2 = *d3++; + *d2++ = static_cast< TUint8 >( ( b1 + b2 ) >> 1 ); + + TUint32 r1 = *d1++; + TUint32 r2 = *d3++; + *d2++ = static_cast< TUint8 >( ( r1 + r2 ) >> 1 ); + + g1 = *d1++; + g2 = *d3++; + *d2++ = static_cast< TUint8 >( ( g1 + g2 ) >> 1 ); + + b1 = *d1++; + b2 = *d3++; + *d2++ = static_cast< TUint8 >( ( b1 + b2 ) >> 1 ); + + r1 = *d1++; + r2 = *d3++; + *d2++ = static_cast< TUint8 >( ( r1 + r2 ) >> 1 ); + } + + d += dpitch * 2; + } + + // last row is just copy of previous row, because we cannot calculate + // average + Mem::Copy( reinterpret_cast< TUint8* >( d ) + dpitch, d, dpitch ); + + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplBilinear::Scale2x16M() <<" ), RThread().Id().operator TUint() ) ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplBilinear::Scale2x16MU16MA() +// ----------------------------------------------------------------------------- +void CVtImageScalerImplBilinear::Scale2x16MU16MA() + { + +#if defined ( __MARM_ARMI__ ) && defined ( NDEBUG ) && defined ( __USE_ASM_OPTS ) // From urel + + asm("stmfd sp!, {r4, r5, r6, r7, r8, r9, sl, r11, r12, lr} "); + asm("ldr r11, .L1_671"); + asm("sub sp, sp, #24 "); + asm("mov r6, r0 "); + asm("ldr r1, [r6, #4] "); + asm("ldr r3, [r1, #0] "); + asm("add r0, sp, #16 "); + asm("ldr ip, [r3, #20] "); + asm("mov lr, pc "); + asm("bx ip "); + asm("ldr r7, [sp, #20] "); + asm("ldr r1, [r6, #4] "); + asm("ldr r3, [r1, #0] "); + asm("add r0, sp, #8 "); + asm("ldr ip, [r3, #20] "); + asm("mov lr, pc "); + asm("bx ip "); + asm("ldr r9, [sp, #8] "); + asm("str r9, [sp, #0] "); + asm("ldr r0, [r6, #4] "); + asm("ldr r3, [r0, #0] "); + asm("ldr ip, [r3, #24] "); + asm("mov lr, pc "); + asm("bx ip "); + asm("str r0, [sp, #4] "); + asm("ldr r0, [r6, #8] "); + asm("ldr r3, [r0, #0] "); + asm("ldr ip, [r3, #24] "); + asm("mov lr, pc "); + asm("bx ip "); + asm("mov sl, r0 "); + asm("ldr r0, [r6, #4] "); + asm("ldr r3, [r0, #0] "); + asm("ldr ip, [r3, #28] "); + asm("mov lr, pc "); + asm("bx ip "); + asm("mov r4, r0 "); + asm("ldr r0, [r6, #8] "); + asm("ldr r3, [r0, #0] "); + asm("ldr ip, [r3, #28] "); + asm("mov lr, pc "); + asm("bx ip "); + asm("mov r5, r0 "); + asm("subs r8, r7, #1 "); + asm("bmi .L1_654 "); + +asm(" .L1_656: "); + asm("mov ip, r5 "); + asm("mov lr, r4 "); + asm("ldr r1, [lr], #4 "); + asm("ldr r9, [sp, #0] "); + asm("cmp r9, #4"); + asm("bhi .L1_658_1"); + + // picture width lower or equal to 4 + asm("subs r0, r9, #2"); + asm("bmi .L1_658"); + + asm("ldr r9, [lr], #4 "); + asm("eor r2, r9, r1 "); + asm("and r2, r2, r11 "); + asm("and r3, r9, r1 "); + asm("add r3, r3, r2, lsr #1 "); + asm("str r1, [ip], #4"); + asm("str r3, [ip], #4"); + + asm("subs r0, r0, #1"); + asm("strmi r9, [ip], #4"); + asm("strmi r9, [ip], #4"); + asm("bmi .L1_658"); + + asm("ldr r1, [lr], #4 "); + asm("eor r2, r9, r1 "); + asm("and r2, r2, r11 "); + asm("and r3, r9, r1 "); + asm("add r3, r3, r2, lsr #1 "); + asm("str r9, [ip], #4"); + asm("str r3, [ip], #4"); + + asm("subs r0, r0, #1"); + asm("strmi r1, [ip], #4"); + asm("strmi r1, [ip], #4"); + asm("bmi .L1_658"); + + asm("ldr r9, [lr], #4 "); + asm("eor r2, r9, r1 "); + asm("and r2, r2, r11 "); + asm("and r3, r9, r1 "); + asm("add r3, r3, r2, lsr #1 "); + asm("str r1, [ip], #4"); + asm("str r3, [ip], #4"); + + asm("b .L1_658"); + + // picture width higher than 4 +asm(" .L1_658_1:"); + asm("mov r9, r9, lsr #1 "); + asm("subs r0, r9, #2 "); + asm("bmi .L1_658 "); + +asm(" .L1_660: "); + asm("ldr r9, [lr], #4 "); + asm("eor r2, r9, r1 "); + asm("and r2, r2, r11 "); + asm("and r3, r9, r1 "); + asm("add r3, r3, r2, lsr #1 "); + asm("stmia ip!, { r1, r3, r9 } "); + asm("sub r0, r0, #1 "); + asm("ldr r1, [lr], #4 "); + asm("eor r2, r9, r1 "); + asm("and r2, r2, r11 "); + asm("and r3, r9, r1 "); + asm("add r3, r3, r2, lsr #1 "); + asm("str r3, [ip], #4"); + asm("cmp r0,#0"); + asm("bge .L1_660 "); + +asm(" .L1_658: "); + asm("str r1, [ip], #4 "); + asm("str r1, [ip, #0] "); + asm("add r5, r5, sl, asl #1 "); + asm("ldr r9, [sp, #4] "); + asm("add r4, r4, r9 "); + asm("subs r8, r8, #1 "); + asm("bpl .L1_656 "); + +asm(" .L1_654: "); + asm("ldr r0, [r6, #8] "); + asm("ldr r3, [r0, #0] "); + asm("ldr ip, [r3, #28] "); + asm("mov lr, pc "); + asm("bx ip "); + asm("mov r5, r0 "); + asm("subs r8, r7, #2 "); + asm("bmi .L1_664 "); + +asm(" .L1_666: "); + asm("mov r7, r5 "); + asm("add r4, r5, sl "); + asm("add r6, r4, sl "); + asm("ldr r9, [sp, #0] "); + asm("subs lr, r9, #1 "); + asm("bmi .L1_668 "); + +asm(" .L1_670: "); + asm("ldr r1, [r7], #4 "); + asm("ldr r2, [r7], #4 "); + asm("ldr r0, [r6], #4 "); + asm("ldr ip, [r6], #4 "); + asm("eor r3, r1, r0 "); + asm("and r3, r3, r11 "); + asm("and r1, r1, r0 "); + asm("add r1, r1, r3, lsr #1 "); + asm("str r1, [r4], #4 "); + asm("eor r3, r2, ip "); + asm("and r3, r3, r11 "); + asm("and r2, r2, ip "); + asm("add r2, r2, r3, lsr #1 "); + asm("str r2, [r4], #4 "); + asm("subs lr, lr, #1 "); + asm("bpl .L1_670 "); + +asm(" .L1_668: "); + asm("add r5, r5, sl, asl #1 "); + asm("subs r8, r8, #1 "); + asm("bpl .L1_666 "); + +asm(" .L1_664: "); + asm("add r0, r5, sl "); + asm("mov r1, r5 "); + asm("mov r2, sl "); + asm("bl Copy__3MemPvPCvi "); + asm("add sp, sp, #24 "); + asm("ldmfd sp!, {r4, r5, r6, r7, r8, r9, sl, r11, r12, lr} "); + asm("bx lr "); + +asm(" .align 0 "); +asm(" .L1_671: "); +asm(" .word 0x00fefefe "); + +#else + + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplBilinear::Scale2x16MU16MA() >>" ), RThread().Id().operator TUint() ) ); + + TInt sheight = iSource->Size().iHeight; + TInt swidth = iSource->Size().iWidth; + TInt spitch = iSource->BytesPerRow(); + TInt dpitch = iTarget->BytesPerRow(); + + TUint32 mask = 0xfefefefe; + TUint32* s = iSource->DataAddress(); + TUint32* d = iTarget->DataAddress(); + TInt y; + + TUint32 p1; + TUint32 p2; + TUint32 p3; + TUint32 p4; + + // first average source rows + for( y = sheight - 1; y >= 0; y-- ) + { + TUint32* s1 = s; + TUint32* d1 = d; + + TUint32 p2 = *s1++; + TUint32 p1 = 0; + + for( TInt x = swidth - 2; x >= 0; x-- ) + { + *d1++ = p2; + p1 = p2; + p2 = *s1++; + *d1++ = ( ( ( p1 ^ p2 ) & mask ) >> 1 ) + ( p1 & p2 ); + } + + *d1++ = p2; + *d1++ = p2; + + d = reinterpret_cast< TUint32* > + ( reinterpret_cast< TUint8* >( d ) + dpitch * 2 ); + s = reinterpret_cast< TUint32* > + ( reinterpret_cast< TUint8* >( s ) + spitch ); + } + + // then average rows between + d = iTarget->DataAddress(); + + for( y = sheight - 2; y >= 0; y-- ) + { + TUint32* d1 = reinterpret_cast< TUint32* >( d ); + TUint32* d2 = reinterpret_cast< TUint32* > + ( reinterpret_cast< TUint8* >( d1 ) + dpitch ); + TUint32* d3 = reinterpret_cast< TUint32* > + ( reinterpret_cast< TUint8* >( d2 ) + dpitch ); + + for( TInt x = swidth - 1; x >= 0; x-- ) + { + p1 = *d1++; + p2 = *d3++; + *d2++ = ( ( ( p1 ^ p2 ) & mask ) >> 1 ) + ( p1 & p2 ); + p3 = *d1++; + p4 = *d3++; + *d2++ = ( ( ( p3 ^ p4 ) & mask ) >> 1 ) + ( p3 & p4 ); + } + + d = reinterpret_cast< TUint32* > + ( reinterpret_cast< TUint8* >( d ) + dpitch * 2 ); + } + + // last row is just copy of previous row, because we cannot calculate + // average + Mem::Copy( reinterpret_cast< TUint8* >( d ) + dpitch, d, dpitch ); + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplBilinear::Scale2x16MU16MA() <<" ), RThread().Id().operator TUint() ) ); + +#endif + + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/src/CVtImageScalerImplNearest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/src/CVtImageScalerImplNearest.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,522 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + +// INCLUDE FILES + +#include +#include + +#include "CVtImageScalerImplNearest.h" +#include "cvtimage.h" + +// MACROS + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// LOCAL CONSTANTS AND MACROS + +const TUint32 KDecimalBits = 16; // 16.16 pseudo real format + +// ============================ MEMBER FUNCTIONS =============================== + +// ======================= CVtImageScalerImplNearest ======================= + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplNearest::Scale( TBool& aContinue ) +// ----------------------------------------------------------------------------- +TInt CVtImageScalerImplNearest::Scale( TBool& aContinue ) + { + TInt result( KErrNone ); + + aContinue = EFalse; + + // this implementation does not support different display modes for source + // and target + if( iSource->DisplayMode() != iTarget->DisplayMode() ) + { + return KErrNotSupported; + } + + // if sizes are same, just copy the data + if( iSource->Size() == iTarget->Size() ) + { + Mem::Copy( + iTarget->DataAddress(), + iSource->DataAddress(), + iTarget->BytesPerRow() * iTarget->Size().iHeight ); + } + else if( ( iSource->Size().iHeight * 2 == iTarget->Size().iHeight ) && + ( iSource->Size().iWidth * 2 == iTarget->Size().iWidth ) ) + { + switch( iSource->DisplayMode() ) + { + case CVtImage::EVtColor4K: + case CVtImage::EVtColor64K: + Scale2x4K64K(); + break; + + case CVtImage::EVtColor16M: + Scale2x16M(); + break; + + case CVtImage::EVtColor16MU: + case CVtImage::EVtColor16MA: + Scale2x16MU16MA(); + break; + + default: + if ( iSource->Type() == CVtImage::EVtImageBitmap && + iTarget->Type() == CVtImage::EVtImageBitmap ) + { + TRAPD( error, + ScaleWithBitmapScalerL( + CBitmapScaler::EMinimumQuality ) ); + result = error; + } + else + { + result = KErrNotSupported; + } + } + } + else + { + Initialize(); + + switch( iSource->DisplayMode() ) + { + case CVtImage::EVtColor4K: + Scale4K( + reinterpret_cast< const TUint16* >( + iSource->DataAddress() ), + iSource->BytesPerRow(), + reinterpret_cast< TUint16* >( iTarget->DataAddress() ), + iTarget->Size().iWidth, + iTarget->Size().iHeight, + iU, + iV ); + break; + + case CVtImage::EVtColor64K: + Scale64K( + reinterpret_cast< const TUint16* >( + iSource->DataAddress() ), + iSource->BytesPerRow(), + reinterpret_cast< TUint16* >( iTarget->DataAddress() ), + iTarget->Size().iWidth, + iTarget->Size().iHeight, + iU, + iV ); + break; + + case CVtImage::EVtColor16M: + Scale16M( + reinterpret_cast< const TUint8* >( + iSource->DataAddress() ), + iSource->BytesPerRow(), + reinterpret_cast< TUint8* >( iTarget->DataAddress() ), + iTarget->Size().iWidth, + iTarget->Size().iHeight, + iTarget->BytesPerRow(), + iU, + iV ); + break; + + case CVtImage::EVtColor16MU: + case CVtImage::EVtColor16MA: + Scale16MU16MA( + iSource->DataAddress(), + iSource->BytesPerRow(), + iTarget->DataAddress(), + iTarget->Size().iWidth, + iTarget->Size().iHeight, + iU, + iV ); + break; + + default: + if ( iSource->Type() == CVtImage::EVtImageBitmap && + iTarget->Type() == CVtImage::EVtImageBitmap ) + { + TRAPD( error, + ScaleWithBitmapScalerL( + CBitmapScaler::EMinimumQuality ) ); + result = error; + } + else + { + result = KErrNotSupported; + } + } + } + + return result; + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplNearest::ValidateSourceTargetL( +// const CVtImage& aSource, CVtImage& aTarget ) +// ----------------------------------------------------------------------------- +void CVtImageScalerImplNearest::ValidateSourceTargetL( + const CVtImage& aSource, + CVtImage& aTarget ) + { + if( aSource.DisplayMode() != aTarget.DisplayMode() ) + { + User::Leave( KErrNotSupported ); + } + + switch( aSource.DisplayMode() ) + { + case CVtImage::EVtColor4K: + case CVtImage::EVtColor64K: + case CVtImage::EVtColor16M: + case CVtImage::EVtColor16MU: + case CVtImage::EVtColor16MA: + break; + + default: + // Scaling for bitmaps is supported for other display modes + if ( !( aSource.Type() == CVtImage::EVtImageBitmap && + aTarget.Type() == CVtImage::EVtImageBitmap ) ) + { + User::Leave( KErrNotSupported ); + } + } + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplNearest::Initialize() +// ----------------------------------------------------------------------------- +void CVtImageScalerImplNearest::Initialize() + { + iU = ( 1 << KDecimalBits ) * iSource->Size().iWidth / + iTarget->Size().iWidth + 1; + iV = ( 1 << KDecimalBits ) * iSource->Size().iHeight / + iTarget->Size().iHeight + 1; + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplNearest::Scale4K( +// const TUint16* aSrcPtr, TUint32 aSrcWidth, TUint16* aTrgPtr, +// TUint32 aTrgWidth, TUint32 aTrgHeight, TUint32 aDx, TUint32 aDy ) +// ----------------------------------------------------------------------------- +void CVtImageScalerImplNearest::Scale4K( + const TUint16* aSrcPtr, + TUint32 aSrcWidth, + TUint16* aTrgPtr, + TUint32 aTrgWidth, + TUint32 aTrgHeight, + TUint32 aDx, + TUint32 aDy ) + { + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplNearest::Scale4K() >>" ), RThread().Id().operator TUint() ) ); + // scaling 4K and 64K is equal procedure + Scale64K( aSrcPtr, aSrcWidth, aTrgPtr, aTrgWidth, aTrgHeight, aDx, aDy ); + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplNearest::Scale4K() <<" ), RThread().Id().operator TUint() ) ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplNearest::Scale64K( +// const TUint16* aSrcPtr, TUint32 aSrcPitch, TUint16* aTrgPtr, +// TUint32 aTrgWidth, TUint32 aTrgHeight, TUint32 aDx, TUint32 aDy ) +// ----------------------------------------------------------------------------- +void CVtImageScalerImplNearest::Scale64K( + const TUint16* aSrcPtr, + TUint32 aSrcPitch, + TUint16* aTrgPtr, + TUint32 aTrgWidth, + TUint32 aTrgHeight, + TUint32 aDx, + TUint32 aDy ) + { + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplNearest::Scale64K() >>" ), RThread().Id().operator TUint() ) ); + + TUint32 sy( 0 ); + + for( TUint32 y = 0; y < aTrgHeight; y++ ) + { + const TUint16* srow = + aSrcPtr + ( sy >> KDecimalBits ) * ( aSrcPitch >> 1 ); + + TUint32 sx( 0 ); + + TUint32 x( 0 ); + + // loop unrolled with 8 + for( ; x < ( aTrgWidth >> 3 ); x++ ) + { + *aTrgPtr++ = srow[ sx >> KDecimalBits ]; + sx += aDx; + *aTrgPtr++ = srow[ sx >> KDecimalBits ]; + sx += aDx; + *aTrgPtr++ = srow[ sx >> KDecimalBits ]; + sx += aDx; + *aTrgPtr++ = srow[ sx >> KDecimalBits ]; + sx += aDx; + *aTrgPtr++ = srow[ sx >> KDecimalBits ]; + sx += aDx; + *aTrgPtr++ = srow[ sx >> KDecimalBits ]; + sx += aDx; + *aTrgPtr++ = srow[ sx >> KDecimalBits ]; + sx += aDx; + *aTrgPtr++ = srow[ sx >> KDecimalBits ]; + sx += aDx; + } + + // handle remaining columns + for( x = 0; x < ( aTrgWidth & 7 ); x++ ) + { + *aTrgPtr++ = srow[ sx >> KDecimalBits ]; + sx += aDx; + } + + // if target width is not even aligning is needed + if( aTrgWidth & 1 ) + { + aTrgPtr++; + } + + sy += aDy; + } + + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplNearest::Scale64K() <<" ), RThread().Id().operator TUint() ) ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplNearest::Scale16M( +// const TUint8* aSrcPtr, TUint32 aSrcPitch, TUint8* aTrgPtr, +// TUint32 aTrgWidth, TUint32 aTrgHeight, TUint32 aTrgPitch, TUint32 aDx, TUint32 aDy ) +// ----------------------------------------------------------------------------- +void CVtImageScalerImplNearest::Scale16M( + const TUint8* aSrcPtr, + TUint32 aSrcPitch, + TUint8* aTrgPtr, + TUint32 aTrgWidth, + TUint32 aTrgHeight, + TUint32 aTrgPitch, + TUint32 aDx, + TUint32 aDy ) + { + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplNearest::Scale16M() >>" ), RThread().Id().operator TUint() ) ); + + TUint32 sy( 0 ); + + for( TUint32 y = 0; y < aTrgHeight; y++ ) + { + const TUint8* s = aSrcPtr + ( sy >> KDecimalBits ) * aSrcPitch; + + TUint8* d = aTrgPtr; + + TUint32 sx( 0 ); + + TUint32 x( 0 ); + + for( ; x < aTrgWidth; x++ ) + { + const TUint8* tempSrc = s + ( sx >> KDecimalBits ) * 3; + *d++ = *tempSrc++; + *d++ = *tempSrc++; + *d++ = *tempSrc++; + sx += aDx; + } + + aTrgPtr += aTrgPitch; + + sy += aDy; + } + + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplNearest::Scale16M() <<" ), RThread().Id().operator TUint() ) ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplNearest::Scale16MU16MA( const TUint32* aSrcPtr, +// TUint32 aSrcPitch, TUint32* aTrgPtr, TUint32 aTrgWidth, TUint32 aTrgHeight, +// TUint32 aDx, TUint32 aDy ) +// ----------------------------------------------------------------------------- +void CVtImageScalerImplNearest::Scale16MU16MA( + const TUint32* aSrcPtr, + TUint32 aSrcPitch, + TUint32* aTrgPtr, + TUint32 aTrgWidth, + TUint32 aTrgHeight, + TUint32 aDx, + TUint32 aDy ) + { + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplNearest::Scale16MU16MA() >>" ), RThread().Id().operator TUint() ) ); + + TUint32 sy( 0 ); + + for( TUint32 y = 0; y < aTrgHeight; y++ ) + { + const TUint32* srow = + aSrcPtr + ( sy >> KDecimalBits ) * ( aSrcPitch >> 2 ); + + TUint32 sx( 0 ); + + TUint32 x( 0 ); + + // loop unrolled with 8 + for( ; x < ( aTrgWidth >> 3 ); x++ ) + { + *aTrgPtr++ = srow[ sx >> KDecimalBits ]; + sx += aDx; + *aTrgPtr++ = srow[ sx >> KDecimalBits ]; + sx += aDx; + *aTrgPtr++ = srow[ sx >> KDecimalBits ]; + sx += aDx; + *aTrgPtr++ = srow[ sx >> KDecimalBits ]; + sx += aDx; + *aTrgPtr++ = srow[ sx >> KDecimalBits ]; + sx += aDx; + *aTrgPtr++ = srow[ sx >> KDecimalBits ]; + sx += aDx; + *aTrgPtr++ = srow[ sx >> KDecimalBits ]; + sx += aDx; + *aTrgPtr++ = srow[ sx >> KDecimalBits ]; + sx += aDx; + } + + // handle remaining columns + for( x = 0; x < ( aTrgWidth & 7 ); x++ ) + { + *aTrgPtr++ = srow[ sx >> KDecimalBits ]; + sx += aDx; + } + + sy += aDy; + } + + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplNearest::Scale16MU16MA() <<" ), RThread().Id().operator TUint() ) ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplNearest::Scale2x4K64K() +// ----------------------------------------------------------------------------- +void CVtImageScalerImplNearest::Scale2x4K64K() + { + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplNearest::Scale2x4K64K() >>" ), RThread().Id().operator TUint() ) ); + + TInt sheight = iSource->Size().iHeight; + TInt swidth = iSource->Size().iWidth; + TInt spitch = iSource->BytesPerRow(); + TInt dpitch = iTarget->BytesPerRow(); + + TUint16* s = reinterpret_cast< TUint16* >( iSource->DataAddress() ); + TUint32* d = iTarget->DataAddress(); + + for( TInt y = 0; y < sheight; y++ ) + { + TUint16* s2 = s; + TUint32* d1 = d; + for( TInt x = 0; x < swidth; x++ ) + { + TUint32 p = *s2++; + p |= ( p << 16 ); + *d1++ = p; + } + d = reinterpret_cast< TUint32* >( + Mem::Copy( reinterpret_cast< TUint8* >( d ) + dpitch, d, dpitch ) ); + s = reinterpret_cast< TUint16* >( + reinterpret_cast< TUint8* >( s ) + spitch ); + } + + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplNearest::Scale2x4K64K() <<" ), RThread().Id().operator TUint() ) ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplNearest::Scale2x16M() +// ----------------------------------------------------------------------------- +void CVtImageScalerImplNearest::Scale2x16M() + { + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplNearest::Scale2x16M() >>" ), RThread().Id().operator TUint() ) ); + + TInt sheight = iSource->Size().iHeight; + TInt swidth = iSource->Size().iWidth; + TInt spitch = iSource->BytesPerRow(); + TInt dpitch = iTarget->BytesPerRow(); + + TUint8* s = reinterpret_cast< TUint8* >( iSource->DataAddress() ); + TUint8* d = reinterpret_cast< TUint8* >( iTarget->DataAddress() ); + + for( TInt y = 0; y < sheight; y++ ) + { + TUint8* s2 = s; + TUint8* d1 = d; + for( TInt x = 0; x < swidth; x++ ) + { + TUint8 g = *s2++; + TUint8 b = *s2++; + TUint8 r = *s2++; + + *d1++ = g; + *d1++ = b; + *d1++ = r; + + *d1++ = g; + *d1++ = b; + *d1++ = r; + } + d = Mem::Copy( d + dpitch, d, dpitch ); + s += spitch; + } + + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplNearest::Scale2x16M() <<" ), RThread().Id().operator TUint() ) ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplNearest::Scale2x16MU16MA() +// ----------------------------------------------------------------------------- +void CVtImageScalerImplNearest::Scale2x16MU16MA() + { + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplNearest::Scale2x16MU16MA() >>" ), RThread().Id().operator TUint() ) ); + + TInt sheight = iSource->Size().iHeight; + TInt swidth = iSource->Size().iWidth; + TInt spitch = iSource->BytesPerRow(); + TInt dpitch = iTarget->BytesPerRow(); + + TUint32* s = iSource->DataAddress(); + TUint32* d = iTarget->DataAddress(); + + for( TInt y = 0; y < sheight; y++ ) + { + TUint32* s2 = s; + TUint32* d1 = d; + for( TInt x = 0; x < swidth; x++ ) + { + TUint32 p = *s2++; + *d1++ = p; + *d1++ = p; + } + d = reinterpret_cast< TUint32* >( + Mem::Copy( reinterpret_cast< TUint8* >( d ) + dpitch, d, dpitch ) ); + s = reinterpret_cast< TUint32* >( + reinterpret_cast< TUint8* >( s ) + spitch ); + } + + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplNearest::Scale2x16MU16MA() <<" ), RThread().Id().operator TUint() ) ); + } + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/src/CVtImageScalerImplWeightedAverage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/src/CVtImageScalerImplWeightedAverage.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,1183 @@ +/* +* Copyright (c) 2004 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: Image Transforms subsystem. +* +*/ + + +// INCLUDE FILES + +#include +#include + +#include "CVtImageScalerImplWeightedAverage.h" +#include "cvtimage.h" +#include "CVtImageScalerMacros.h" + +// MACROS + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// LOCAL CONSTANTS AND MACROS + +const TUint32 KDecimalBits = 16; // 16.16 pseudo real format + +// ============================ MEMBER FUNCTIONS =============================== + +// ======================= CVtImageScalerImplWeightedAverage =================== + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplWeightedAverage::Scale( TBool& aContinue ) +// ----------------------------------------------------------------------------- +TInt CVtImageScalerImplWeightedAverage::Scale( TBool& aContinue ) + { + TInt result( KErrNone ); + + aContinue = EFalse; + + // this implementation does not support different display modes for source + // and target + if( iSource->DisplayMode() != iTarget->DisplayMode() ) + { + return KErrNotSupported; + } + + // if sizes are same, just copy the data + if( iSource->Size() == iTarget->Size() ) + { + Mem::Copy( + iTarget->DataAddress(), + iSource->DataAddress(), + iTarget->BytesPerRow() * iTarget->Size().iHeight ); + } + else if ( ( iSource->Size().iHeight * 2 == iTarget->Size().iHeight ) + && ( iSource->Size().iWidth * 2 == iTarget->Size().iWidth ) ) + { + switch( iSource->DisplayMode() ) + { + case CVtImage::EVtColor4K: + Scale2x4K64K( 0xeee ); // 0000ggggbbbbrrrr -> + break; // mask = %0000111011101110 = 0xeee + + case CVtImage::EVtColor64K: + Scale2x4K64K( 0xf7de ); // bbbbbggggggrrrrr -> + break; // mask = %1111011111011110 = 0xf7de + + case CVtImage::EVtColor16M: + Scale2x16M(); + break; + + case CVtImage::EVtColor16MU: + case CVtImage::EVtColor16MA: + Scale2x16MU16MA(); + break; + + default: + if ( iSource->Type() == CVtImage::EVtImageBitmap && + iTarget->Type() == CVtImage::EVtImageBitmap ) + { + TRAPD( error, + ScaleWithBitmapScalerL( + CBitmapScaler::EMediumQuality ) ); + result = error; + } + else + { + result = KErrNotSupported; + } + } + } + else + { + Initialize(); + + switch( iSource->DisplayMode() ) + { + case CVtImage::EVtColor4K: + Scale4K(); + break; + + case CVtImage::EVtColor64K: + Scale64K(); + break; + + case CVtImage::EVtColor16M: + Scale16M(); + break; + + case CVtImage::EVtColor16MU: + Scale16MU(); + break; + + case CVtImage::EVtColor16MA: + Scale16MA(); + break; + + default: + if ( iSource->Type() == CVtImage::EVtImageBitmap && + iTarget->Type() == CVtImage::EVtImageBitmap ) + { + TRAPD( error, + ScaleWithBitmapScalerL( + CBitmapScaler::EMediumQuality ) ); + result = error; + } + else + { + result = KErrNotSupported; + } + } + } + + return result; + } + + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplWeightedAverage::ValidateSourceTargetL( +// const CVtImage& aSource, CVtImage& aTarget ) +// ----------------------------------------------------------------------------- +void CVtImageScalerImplWeightedAverage::ValidateSourceTargetL( + const CVtImage& aSource, + CVtImage& aTarget ) + { + // source and target must have same displaymode + if( aSource.DisplayMode() != aTarget.DisplayMode() ) + { + User::Leave( KErrNotSupported ); + } + + // only 4K, 64K, 16M and 16MU modes are supported + switch( aSource.DisplayMode() ) + { + case CVtImage::EVtColor4K: + case CVtImage::EVtColor64K: + case CVtImage::EVtColor16M: + case CVtImage::EVtColor16MU: + case CVtImage::EVtColor16MA: + break; + + default: + // Scaling for bitmaps is supported for other display modes + if ( !( aSource.Type() == CVtImage::EVtImageBitmap && + aTarget.Type() == CVtImage::EVtImageBitmap ) ) + { + User::Leave( KErrNotSupported ); + } + } + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplWeightedAverage::Initialize() +// ----------------------------------------------------------------------------- +void CVtImageScalerImplWeightedAverage::Initialize() + { + iU = ( 1 << KDecimalBits ) * iSource->Size().iWidth / + iTarget->Size().iWidth; + iV = ( 1 << KDecimalBits ) * iSource->Size().iHeight / + iTarget->Size().iHeight; + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplWeightedAverage::Scale4K() +// ----------------------------------------------------------------------------- +void CVtImageScalerImplWeightedAverage::Scale4K() + { + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplWeightedAverage::Scale4K() >>" ), RThread().Id().operator TUint() ) ); + + TInt width = iTarget->Size().iWidth; + + TInt height = iTarget->Size().iHeight; + + TInt mod_width = width - ( ( 1 << KDecimalBits ) / iU ); + + TUint16* t = reinterpret_cast< TUint16* >( iTarget->DataAddress() ); + + TUint32 sourceY( 0 ); + + TUint32 b00( 0 ); + TUint32 g00( 0 ); + TUint32 r00( 0 ); + TUint32 b01( 0 ); + TUint32 g01( 0 ); + TUint32 r01( 0 ); + TUint32 b10( 0 ); + TUint32 g10( 0 ); + TUint32 r10( 0 ); + + for( TInt y = 0; y < height; y++ ) + { + TUint16* s = reinterpret_cast< TUint16* >( + iSource->LineAddress( sourceY >> KDecimalBits ) ); + TUint16* snext = reinterpret_cast< TUint16* >( + iSource->LineAddress( ( sourceY >> KDecimalBits ) + 1 ) ); + + TUint32 invdv = sourceY & ( ( 1 << KDecimalBits ) - 1 ); // decimal part + TUint32 dv = ( 1 << KDecimalBits ) - invdv; // 1 - decimal part + + TUint32 sourceX( 0 ); + + TInt x; + + TUint32 x0prev( TUint32( -1 ) ); + + for( x = 0; x < mod_width; x++ ) + { + TUint32 x0 = sourceX >> KDecimalBits; + + if( x0 != x0prev ) + { + TUint32 p0 = *( s + x0 ); + + b00 = UNPACK_4K_BLUE( p0 ); + g00 = UNPACK_4K_GREEN( p0 ); + r00 = UNPACK_4K_RED( p0 ); + + p0 = *( s + x0 + 1 ); + + b01 = UNPACK_4K_BLUE( p0 ); + g01 = UNPACK_4K_GREEN( p0 ); + r01 = UNPACK_4K_RED( p0 ); + + p0 = *( snext + x0 ); + + b10 = UNPACK_4K_BLUE( p0 ); + g10 = UNPACK_4K_GREEN( p0 ); + r10 = UNPACK_4K_RED( p0 ); + + x0prev = x0; + } + + TUint32 invdu = sourceX & ( ( 1 << KDecimalBits ) - 1 ); + TUint32 du = ( 1 << KDecimalBits ) - invdu; // 1 - decimal part + + TUint32 bres = ( du + dv ) * b00 + invdu * b01 + invdv * b10; + TUint32 gres = ( du + dv ) * g00 + invdu * g01 + invdv * g10; + TUint32 rres = ( du + dv ) * r00 + invdu * r01 + invdv * r10; + + *t++ = PACK_4K_BGR( + bres >> ( KDecimalBits + 1 ), + gres >> ( KDecimalBits + 1 ), + rres >> ( KDecimalBits + 1 ) ); + + sourceX += iU; + } + + // handle last columns + for( ; x < width; x++ ) + { + TUint32 x0 = sourceX >> KDecimalBits; + + if( x0 != x0prev ) + { + TUint32 p0 = *( s + x0 ); + b01 = b00 = UNPACK_4K_BLUE( p0 ); + g01 = g00 = UNPACK_4K_GREEN( p0 ); + r01 = r00 = UNPACK_4K_RED( p0 ); + + p0 = *( snext + x0 ); + b10 = UNPACK_4K_BLUE( p0 ); + g10 = UNPACK_4K_GREEN( p0 ); + r10 = UNPACK_4K_RED( p0 ); + + x0prev = x0; + } + + TUint32 invdu = sourceX & ( ( 1 << KDecimalBits ) - 1 ); // decimal + TUint32 du = ( 1 << KDecimalBits ) - invdu; // 1 - decimal part + + TUint32 bres = ( du + dv ) * b00 + invdu * b01 + invdv * b10; + TUint32 gres = ( du + dv ) * g00 + invdu * g01 + invdv * g10; + TUint32 rres = ( du + dv ) * r00 + invdu * r01 + invdv * r10; + + *t++ = PACK_4K_BGR( + bres >> ( KDecimalBits + 1 ), + gres >> ( KDecimalBits + 1 ), + rres >> ( KDecimalBits + 1 ) ); + + sourceX += iU; + } + + // if width is not even -> then we need to skip one additional byte + if( width & 1 ) + { + t++; + } + + sourceY += iV; + } + + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplWeightedAverage::Scale4K() <<" ), RThread().Id().operator TUint() ) ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplWeightedAverage::Scale64K() +// ----------------------------------------------------------------------------- +void CVtImageScalerImplWeightedAverage::Scale64K() + { + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplWeightedAverage::Scale64K() >>" ), RThread().Id().operator TUint() ) ); + + TInt width = iTarget->Size().iWidth; + + TInt height = iTarget->Size().iHeight; + + TInt mod_width = width - ( ( 1 << KDecimalBits ) / iU ); + + TUint16* t = reinterpret_cast< TUint16* >( iTarget->DataAddress() ); + + TUint32 sourceY( 0 ); + + TUint32 b00( 0 ); + TUint32 g00( 0 ); + TUint32 r00( 0 ); + TUint32 b01( 0 ); + TUint32 g01( 0 ); + TUint32 r01( 0 ); + TUint32 b10( 0 ); + TUint32 g10( 0 ); + TUint32 r10( 0 ); + + for( TInt y = 0; y < height; y++ ) + { + TUint16* s = reinterpret_cast< TUint16* > + ( iSource->LineAddress( sourceY >> KDecimalBits ) ); + TUint16* snext = reinterpret_cast< TUint16* > + ( iSource->LineAddress( ( sourceY >> KDecimalBits ) + 1 ) ); + + TUint32 invdv = sourceY & ( ( 1 << KDecimalBits ) - 1 ); // decimal part + TUint32 dv = ( 1 << KDecimalBits ) - invdv; // 1 - decimal part + + TUint32 sourceX( 0 ); + + TInt x; + + TUint32 x0prev( TUint32( -1 ) ); + + for( x = 0; x < mod_width; x++ ) + { + TUint32 x0 = sourceX >> KDecimalBits; + + if( x0 != x0prev ) + { + TUint32 p0 = *( s + x0 ); + + b00 = UNPACK_64K_BLUE( p0 ); + g00 = UNPACK_64K_GREEN( p0 ); + r00 = UNPACK_64K_RED( p0 ); + + p0 = *( s + x0 + 1 ); + + b01 = UNPACK_64K_BLUE( p0 ); + g01 = UNPACK_64K_GREEN( p0 ); + r01 = UNPACK_64K_RED( p0 ); + + p0 = *( snext + x0 ); + + b10 = UNPACK_64K_BLUE( p0 ); + g10 = UNPACK_64K_GREEN( p0 ); + r10 = UNPACK_64K_RED( p0 ); + + x0prev = x0; + } + + TUint32 invdu = sourceX & ( ( 1 << KDecimalBits ) - 1 ); + TUint32 du = ( 1 << KDecimalBits ) - invdu; // 1 - decimal part + + TUint32 bres = ( du + dv ) * b00 + invdu * b01 + invdv * b10; + TUint32 gres = ( du + dv ) * g00 + invdu * g01 + invdv * g10; + TUint32 rres = ( du + dv ) * r00 + invdu * r01 + invdv * r10; + + *t++ = PACK_64K_BGR( + bres >> ( KDecimalBits + 1 ), + gres >> ( KDecimalBits + 1 ), + rres >> ( KDecimalBits + 1 ) ); + + sourceX += iU; + } + + // handle last columns + for( ; x < width; x++ ) + { + TUint32 x0 = sourceX >> KDecimalBits; + + if( x0 != x0prev ) + { + TUint32 p0 = *( s + x0 ); + b01 = b00 = UNPACK_64K_BLUE( p0 ); + g01 = g00 = UNPACK_64K_GREEN( p0 ); + r01 = r00 = UNPACK_64K_RED( p0 ); + + p0 = *( snext + x0 ); + b10 = UNPACK_64K_BLUE( p0 ); + g10 = UNPACK_64K_GREEN( p0 ); + r10 = UNPACK_64K_RED( p0 ); + + x0prev = x0; + } + + TUint32 invdu = sourceX & ( ( 1 << KDecimalBits ) - 1 ); // decimal + TUint32 du = ( 1 << KDecimalBits ) - invdu; // 1 - decimal part + + TUint32 bres = ( du + dv ) * b00 + invdu * b01 + invdv * b10; + TUint32 gres = ( du + dv ) * g00 + invdu * g01 + invdv * g10; + TUint32 rres = ( du + dv ) * r00 + invdu * r01 + invdv * r10; + + *t++ = PACK_64K_BGR( + bres >> ( KDecimalBits + 1 ), + gres >> ( KDecimalBits + 1 ), + rres >> ( KDecimalBits + 1 ) ); + + sourceX += iU; + } + + // if width is not even -> then we need to skip one additional byte + if( width & 1 ) + { + t++; + } + + sourceY += iV; + } + + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplWeightedAverage::Scale64K() <<" ), RThread().Id().operator TUint() ) ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplWeightedAverage::Scale16M() +// ----------------------------------------------------------------------------- +void CVtImageScalerImplWeightedAverage::Scale16M() + { + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplWeightedAverage::Scale16M() >>" ), RThread().Id().operator TUint() ) ); + + TInt width = iTarget->Size().iWidth; + + TInt height = iTarget->Size().iHeight; + + TInt mod_width = width - ( ( 1 << KDecimalBits ) / iU ); + + TUint32 t_pitch = iTarget->BytesPerRow(); + + TUint8* t = reinterpret_cast< TUint8* >( iTarget->DataAddress() ); + + TUint32 sourceY( 0 ); + + TUint32 b00( 0 ); + TUint32 g00( 0 ); + TUint32 r00( 0 ); + TUint32 b01( 0 ); + TUint32 g01( 0 ); + TUint32 r01( 0 ); + TUint32 b10( 0 ); + TUint32 g10( 0 ); + TUint32 r10( 0 ); + + for( TInt y = 0; y < height; y++ ) + { + TUint8* s = reinterpret_cast< TUint8* >( + iSource->LineAddress( sourceY >> KDecimalBits ) ); + TUint8* snext = reinterpret_cast< TUint8* >( + iSource->LineAddress( ( sourceY >> KDecimalBits ) + 1 ) ); + + TUint32 invdv = sourceY & ( ( 1 << KDecimalBits ) - 1 ); // decimal part + TUint32 dv = ( 1 << KDecimalBits ) - invdv; // 1 - decimal part + + TUint32 sourceX( 0 ); + + TInt x; + + TUint32 x0prev( TUint32( -1 ) ); + + TUint8* d = t; + + // first columns + for( x = 0; x < mod_width; x++ ) + { + TUint32 x0 = ( sourceX >> KDecimalBits ) * 3; + + if( x0 != x0prev ) + { + TUint8* tempSrc = s + x0; + + b00 = *tempSrc++; + g00 = *tempSrc++; + r00 = *tempSrc++; + + b01 = *tempSrc++; + g01 = *tempSrc++; + r01 = *tempSrc++; + + tempSrc = snext + x0; + + b10 = *tempSrc++; + g10 = *tempSrc++; + r10 = *tempSrc++; + + x0prev = x0; + } + + TUint32 invdu = sourceX & ( ( 1 << KDecimalBits ) - 1 ); // decimal + TUint32 du = ( 1 << KDecimalBits ) - invdu; // 1 - decimal part + + TUint32 bres = ( du + dv ) * b00 + invdu * b01 + invdv * b10; + TUint32 gres = ( du + dv ) * g00 + invdu * g01 + invdv * g10; + TUint32 rres = ( du + dv ) * r00 + invdu * r01 + invdv * r10; + + *d++ = static_cast< TUint8 >( bres >> ( KDecimalBits + 1 ) ); + *d++ = static_cast< TUint8 >( gres >> ( KDecimalBits + 1 ) ); + *d++ = static_cast< TUint8 >( rres >> ( KDecimalBits + 1 ) ); + + sourceX += iU; + } + + // handle last columns + for( ; x < width; x++ ) + { + TUint32 x0 = ( sourceX >> KDecimalBits ) * 3; + + if( x0 != x0prev ) + { + TUint8* tempSrc = s + x0; + + b01 = b00 = *tempSrc++; + g01 = g00 = *tempSrc++; + r01 = r00 = *tempSrc++; + + tempSrc = snext + x0; + + b10 = *tempSrc++; + g10 = *tempSrc++; + r10 = *tempSrc++; + + x0prev = x0; + } + + TUint32 invdu = sourceX & ( ( 1 << KDecimalBits ) - 1 ); // decimal + TUint32 du = ( 1 << KDecimalBits ) - invdu; // 1 - decimal part + + TUint32 bres = ( du + dv ) * b00 + invdu * b01 + invdv * b10; + TUint32 gres = ( du + dv ) * g00 + invdu * g01 + invdv * g10; + TUint32 rres = ( du + dv ) * r00 + invdu * r01 + invdv * r10; + + *d++ = static_cast< TUint8 >( bres >> ( KDecimalBits + 1 ) ); + *d++ = static_cast< TUint8 >( gres >> ( KDecimalBits + 1 ) ); + *d++ = static_cast< TUint8 >( rres >> ( KDecimalBits + 1 ) ); + + sourceX += iU; + } + + t += t_pitch; + + sourceY += iV; + } + + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplWeightedAverage::Scale16M() <<" ), RThread().Id().operator TUint() ) ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplWeightedAverage::Scale16MU() +// ----------------------------------------------------------------------------- +void CVtImageScalerImplWeightedAverage::Scale16MU() + { + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplWeightedAverage::Scale16MU() >>" ), RThread().Id().operator TUint() ) ); + + TInt width = iTarget->Size().iWidth; + + TInt height = iTarget->Size().iHeight; + + TInt mod_width = width - ( ( 1 << KDecimalBits ) / iU ); + + TUint32* t = iTarget->DataAddress(); + + TUint32 sourceY( 0 ); + + TUint32 b00( 0 ); + TUint32 g00( 0 ); + TUint32 r00( 0 ); + TUint32 b01( 0 ); + TUint32 g01( 0 ); + TUint32 r01( 0 ); + TUint32 b10( 0 ); + TUint32 g10( 0 ); + TUint32 r10( 0 ); + + for( TInt y = 0; y < height; y++ ) + { + TUint32* s = iSource->LineAddress( sourceY >> KDecimalBits ); + TUint32* snext = iSource->LineAddress( ( sourceY >> KDecimalBits ) + 1 ); + + TUint32 invdv = sourceY & ( ( 1 << KDecimalBits ) - 1 ); // decimal part + TUint32 dv = ( 1 << KDecimalBits ) - invdv; // 1 - decimal part + + TUint32 sourceX( 0 ); + + TInt x; + + TUint32 x0prev( TUint32( -1 ) ); + + for( x = 0; x < mod_width; x++ ) + { + TUint32 x0 = sourceX >> KDecimalBits; + + if( x0 != x0prev ) + { + TUint32 p0 = *( s + x0 ); + + b00 = UNPACK_16MU_BLUE( p0 ); + g00 = UNPACK_16MU_GREEN( p0 ); + r00 = UNPACK_16MU_RED( p0 ); + + p0 = *( s + x0 + 1 ); + + b01 = UNPACK_16MU_BLUE( p0 ); + g01 = UNPACK_16MU_GREEN( p0 ); + r01 = UNPACK_16MU_RED( p0 ); + + p0 = *( snext + x0 ); + + b10 = UNPACK_16MU_BLUE( p0 ); + g10 = UNPACK_16MU_GREEN( p0 ); + r10 = UNPACK_16MU_RED( p0 ); + + x0prev = x0; + } + + TUint32 invdu = sourceX & ( ( 1 << KDecimalBits ) - 1 ); + TUint32 du = ( 1 << KDecimalBits ) - invdu; // 1 - decimal part + + TUint32 bres = ( du + dv ) * b00 + invdu * b01 + invdv * b10; + TUint32 gres = ( du + dv ) * g00 + invdu * g01 + invdv * g10; + TUint32 rres = ( du + dv ) * r00 + invdu * r01 + invdv * r10; + + *t++ = PACK_16MU_BGR( + bres >> ( KDecimalBits + 1 ), + gres >> ( KDecimalBits + 1 ), + rres >> ( KDecimalBits + 1 ) ); + + sourceX += iU; + } + + // handle last columns + for( ; x < width; x++ ) + { + TUint32 x0 = sourceX >> KDecimalBits; + + if( x0 != x0prev ) + { + TUint32 p0 = *( s + x0 ); + b01 = b00 = UNPACK_16MU_BLUE( p0 ); + g01 = g00 = UNPACK_16MU_GREEN( p0 ); + r01 = r00 = UNPACK_16MU_RED( p0 ); + + p0 = *( snext + x0 ); + b10 = UNPACK_16MU_BLUE( p0 ); + g10 = UNPACK_16MU_GREEN( p0 ); + r10 = UNPACK_16MU_RED( p0 ); + + x0prev = x0; + } + + TUint32 invdu = sourceX & ( ( 1 << KDecimalBits ) - 1 ); // decimal + TUint32 du = ( 1 << KDecimalBits ) - invdu; // 1 - decimal part + + TUint32 bres = ( du + dv ) * b00 + invdu * b01 + invdv * b10; + TUint32 gres = ( du + dv ) * g00 + invdu * g01 + invdv * g10; + TUint32 rres = ( du + dv ) * r00 + invdu * r01 + invdv * r10; + + *t++ = PACK_16MU_BGR( + bres >> ( KDecimalBits + 1 ), + gres >> ( KDecimalBits + 1 ), + rres >> ( KDecimalBits + 1 ) ); + + sourceX += iU; + } + + sourceY += iV; + } + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplWeightedAverage::Scale16MU() <<" ), RThread().Id().operator TUint() ) ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplWeightedAverage::Scale16MA() +// ----------------------------------------------------------------------------- +void CVtImageScalerImplWeightedAverage::Scale16MA() + { + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplWeightedAverage::Scale16MA() >>" ), RThread().Id().operator TUint() ) ); + + TInt width = iTarget->Size().iWidth; + + TInt height = iTarget->Size().iHeight; + + TInt mod_width = width - ( ( 1 << KDecimalBits ) / iU ); + + TUint32* t = iTarget->DataAddress(); + + TUint32 sourceY( 0 ); + + TUint32 a00( 0 ); + TUint32 b00( 0 ); + TUint32 g00( 0 ); + TUint32 r00( 0 ); + TUint32 a01( 0 ); + TUint32 b01( 0 ); + TUint32 g01( 0 ); + TUint32 r01( 0 ); + TUint32 a10( 0 ); + TUint32 b10( 0 ); + TUint32 g10( 0 ); + TUint32 r10( 0 ); + + for( TInt y = 0; y < height; y++ ) + { + TUint32* s = iSource->LineAddress( sourceY >> KDecimalBits ); + TUint32* snext = iSource->LineAddress( ( sourceY >> KDecimalBits ) + 1 ); + + TUint32 invdv = sourceY & ( ( 1 << KDecimalBits ) - 1 ); // decimal part + TUint32 dv = ( 1 << KDecimalBits ) - invdv; // 1 - decimal part + + TUint32 sourceX( 0 ); + + TInt x; + + TUint32 x0prev( TUint32( -1 ) ); + + for( x = 0; x < mod_width; x++ ) + { + TUint32 x0 = sourceX >> KDecimalBits; + + if( x0 != x0prev ) + { + TUint32 p0 = *( s + x0 ); + + a00 = UNPACK_16MA_ALPHA( p0 ); + b00 = UNPACK_16MA_BLUE( p0 ); + g00 = UNPACK_16MA_GREEN( p0 ); + r00 = UNPACK_16MA_RED( p0 ); + + p0 = *( s + x0 + 1 ); + + a01 = UNPACK_16MA_ALPHA( p0 ); + b01 = UNPACK_16MA_BLUE( p0 ); + g01 = UNPACK_16MA_GREEN( p0 ); + r01 = UNPACK_16MA_RED( p0 ); + + p0 = *( snext + x0 ); + + a10 = UNPACK_16MA_ALPHA( p0 ); + b10 = UNPACK_16MA_BLUE( p0 ); + g10 = UNPACK_16MA_GREEN( p0 ); + r10 = UNPACK_16MA_RED( p0 ); + + x0prev = x0; + } + + TUint32 invdu = sourceX & ( ( 1 << KDecimalBits ) - 1 ); + TUint32 du = ( 1 << KDecimalBits ) - invdu; // 1 - decimal part + + TUint32 ares = ( du + dv ) * a00 + invdu * a01 + invdv * a10; + TUint32 bres = ( du + dv ) * b00 + invdu * b01 + invdv * b10; + TUint32 gres = ( du + dv ) * g00 + invdu * g01 + invdv * g10; + TUint32 rres = ( du + dv ) * r00 + invdu * r01 + invdv * r10; + + *t++ = PACK_16MA_ABGR( + ares >> ( KDecimalBits + 1 ), + bres >> ( KDecimalBits + 1 ), + gres >> ( KDecimalBits + 1 ), + rres >> ( KDecimalBits + 1 ) ); + + sourceX += iU; + } + + // handle last columns + for( ; x < width; x++ ) + { + TUint32 x0 = sourceX >> KDecimalBits; + + if( x0 != x0prev ) + { + TUint32 p0 = *( s + x0 ); + a01 = a00 = UNPACK_16MA_ALPHA( p0 ); + b01 = b00 = UNPACK_16MA_BLUE( p0 ); + g01 = g00 = UNPACK_16MA_GREEN( p0 ); + r01 = r00 = UNPACK_16MA_RED( p0 ); + + p0 = *( snext + x0 ); + a10 = UNPACK_16MA_ALPHA( p0 ); + b10 = UNPACK_16MA_BLUE( p0 ); + g10 = UNPACK_16MA_GREEN( p0 ); + r10 = UNPACK_16MA_RED( p0 ); + + x0prev = x0; + } + + TUint32 invdu = sourceX & ( ( 1 << KDecimalBits ) - 1 ); // decimal + TUint32 du = ( 1 << KDecimalBits ) - invdu; // 1 - decimal part + + TUint32 ares = ( du + dv ) * a00 + invdu * a01 + invdv * a10; + TUint32 bres = ( du + dv ) * b00 + invdu * b01 + invdv * b10; + TUint32 gres = ( du + dv ) * g00 + invdu * g01 + invdv * g10; + TUint32 rres = ( du + dv ) * r00 + invdu * r01 + invdv * r10; + + *t++ = PACK_16MA_ABGR( + ares >> ( KDecimalBits + 1 ), + bres >> ( KDecimalBits + 1 ), + gres >> ( KDecimalBits + 1 ), + rres >> ( KDecimalBits + 1 ) ); + + sourceX += iU; + } + + sourceY += iV; + } + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplWeightedAverage::Scale16MA() <<" ), RThread().Id().operator TUint() ) ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplWeightedAverage::Scale2x4K64K( TUint32 aMask ) +// ----------------------------------------------------------------------------- +void CVtImageScalerImplWeightedAverage::Scale2x4K64K( TUint32 aMask ) + { + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplWeightedAverage::Scale2x4K64K() >>" ), RThread().Id().operator TUint() ) ); + + TInt sheight = iSource->Size().iHeight; + TInt swidth = iSource->Size().iWidth; + TInt spitch = iSource->BytesPerRow(); + TInt dpitch = iTarget->BytesPerRow(); + + TUint32* s = iSource->DataAddress(); + TUint32* d = iTarget->DataAddress(); + TInt y; + + // first average source rows + for( y = 0; y < sheight; y++ ) + { + TUint32* s1 = s; + TUint32* d1 = d; + + TUint32 p = *s1++; // 2 pixels + TUint32 p1 = p & 0xffff; + TUint32 p2 = ( p >> 16 ) & 0xffff; + TInt x; + + for( x = 0; x < swidth/2 - 1; x++ ) + { + TUint32 p1a = ( ( ( p1 ^ p2 ) & aMask ) >> 1 ) + ( p1 & p2 ); + p1a = ( ( ( p1 ^ p1a ) & aMask ) >> 1 ) + ( p1 & p1a ); + *d1++ = p1 | ( p1a << 16 ); + + p = *s1++; // 2 pixels + + p1 = p & 0xffff; + TUint32 p2a = ( ( ( p1 ^ p2 ) & aMask ) >> 1 ) + ( p1 & p2 ); + p2a = ( ( ( p2a ^ p2 ) & aMask ) >> 1 ) + ( p2a & p2 ); + *d1++ = p2 | ( p2a << 16 ); + + p2 = ( p >> 16 ) & 0xffff; + } + + TUint32 p1a = ( ( ( p1 ^ p2 ) & aMask ) >> 1 ) + ( p1 & p2 ); + p1a = ( ( ( p1 ^ p1a ) & aMask ) >> 1 ) + ( p1 & p1a ); + *d1++ = p1 | ( p1a << 16 ); + + if( swidth & 1 ) + { + p = *s1; // 2 pixels + p1 = p & 0xffff; + TUint32 p2a = ( ( ( p1 ^ p2 ) & aMask ) >> 1 ) + ( p1 & p2 ); + p2a = ( ( ( p2a ^ p2 ) & aMask ) >> 1 ) + ( p2a & p2 ); + *d1++ = p2 | ( p2a << 16 ); + + p = *--s1; // 2 pixels + p2 = ( p >> 16 ) & 0xffff; + *d1++ = p1 | ( p1 << 16 ); + } + else + { + p = *--s1; // 2 pixels + p2 = ( p >> 16 ) & 0xffff; + *d1++ = p2 | ( p2 << 16 ); + } + + d = reinterpret_cast< TUint32* > + ( reinterpret_cast< TUint8* >( d ) + dpitch * 2 ); + s = reinterpret_cast< TUint32* > + ( reinterpret_cast< TUint8* >( s ) + spitch ); + } + + // then average rows between + d = iTarget->DataAddress(); + + for( y = 0; y < sheight - 1; y++ ) + { + TUint32* d1 = reinterpret_cast< TUint32* >( d ); + TUint32* d2 = reinterpret_cast< TUint32* > + ( reinterpret_cast< TUint8* >( d1 ) + dpitch ); + TUint32* d3 = reinterpret_cast< TUint32* > + ( reinterpret_cast< TUint8* >( d2 ) + dpitch ); + + TUint32 p1 = *d1++; + for( TInt x = 0; x < swidth - 1; x++ ) + { + TUint32 p11 = p1 & 0xffff; + TUint32 p3 = *d3++; + TUint32 p31 = p3 & 0xffff; + + TUint32 r1 = ( ( ( p11 ^ p31 ) & aMask ) >> 1 ) + ( p11 & p31 ); + r1 = ( ( ( p11 ^ r1 ) & aMask ) >> 1 ) + ( p11 & r1 ); + + p1 = *d1++; // read ahead + TUint32 p21 = p1 & 0xffff; + TUint32 r2 = ( ( ( p21 ^ p31 ) & aMask ) >> 1 ) + ( p21 & p31 ); + r2 = ( ( ( p11 ^ r2 ) & aMask ) >> 1 ) + ( p11 & r2 ); + + *d2++ = r1 | ( r2 << 16 ); + } + + TUint32 p11 = p1 & 0xffff; + TUint32 p3 = *d3++; + TUint32 p31 = p3 & 0xffff; + TUint32 r1 = ( ( ( p11 ^ p31 ) & aMask ) >> 1 ) + ( p11 & p31 ); + r1 = ( ( ( p11 ^ r1 ) & aMask ) >> 1 ) + ( p11 & r1 ); + *d2++ = r1 | ( r1 << 16 ); + + d = reinterpret_cast< TUint32* > + ( reinterpret_cast< TUint8* >( d ) + dpitch * 2 ); + } + + // last row is just copy of previous row, because we cannot calculate + // average + Mem::Copy( reinterpret_cast< TUint8* >( d ) + dpitch, d, dpitch ); + + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplWeightedAverage::Scale2x4K64K() <<" ), RThread().Id().operator TUint() ) ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplWeightedAverage::Scale2x16M() +// ----------------------------------------------------------------------------- +void CVtImageScalerImplWeightedAverage::Scale2x16M() + { + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplWeightedAverage::Scale2x16M() >>" ), RThread().Id().operator TUint() ) ); + + TInt sheight = iSource->Size().iHeight; + TInt swidth = iSource->Size().iWidth; + TInt spitch = iSource->BytesPerRow(); + TInt dpitch = iTarget->BytesPerRow(); + + TUint8* s = reinterpret_cast< TUint8* >( iSource->DataAddress() ); + TUint8* d = reinterpret_cast< TUint8* >( iTarget->DataAddress() ); + + TInt y; + + for( y = 0; y < sheight; y++ ) + { + TUint8* s2 = s; + TUint8* d1 = d; + + TUint32 g1 = 0; + TUint32 b1 = 0; + TUint32 r1 = 0; + + TUint32 g2 = 0; + TUint32 b2 = 0; + TUint32 r2 = 0; + + for( TInt x = 0; x < swidth - 1; x++ ) + { + g1 = *s2++; + b1 = *s2++; + r1 = *s2++; + + *d1++ = static_cast< TUint8 >( g1 ); + *d1++ = static_cast< TUint8 >( b1 ); + *d1++ = static_cast< TUint8 >( r1 ); + + g2 = s2[ 0 ]; + b2 = s2[ 1 ]; + r2 = s2[ 2 ]; + + *d1++ = static_cast< TUint8 >( ( g1 + ( ( g1 + g2 ) >> 1 ) ) >> 1 ); + *d1++ = static_cast< TUint8 >( ( b1 + ( ( b1 + b2 ) >> 1 ) ) >> 1 ); + *d1++ = static_cast< TUint8 >( ( r1 + ( ( r1 + r2 ) >> 1 ) ) >> 1 ); + } + + *d1++ = static_cast< TUint8 >( ( g1 + g2 ) >> 1 ); + *d1++ = static_cast< TUint8 >( ( b1 + b2 ) >> 1 ); + *d1++ = static_cast< TUint8 >( ( r1 + r2 ) >> 1 ); + + *d1++ = static_cast< TUint8 >( g2 ); + *d1++ = static_cast< TUint8 >( b2 ); + *d1++ = static_cast< TUint8 >( r2 ); + + d += dpitch * 2; + s += spitch; + } + + // then average rows between + d = reinterpret_cast< TUint8* >( iTarget->DataAddress() ); + + for( y = 0; y < sheight - 1; y++ ) + { + TUint8* d1 = d; + TUint8* d2 = d1 + dpitch; + TUint8* d3 = d2 + dpitch; + + for( TInt x = 0; x < swidth; x++ ) + { + TUint32 g1 = *d1++; + TUint32 g2 = *d3++; + *d2++ = static_cast< TUint8 >( ( g1 + g2 ) >> 1 ); + + TUint32 b1 = *d1++; + TUint32 b2 = *d3++; + *d2++ = static_cast< TUint8 >( ( b1 + b2 ) >> 1 ); + + TUint32 r1 = *d1++; + TUint32 r2 = *d3++; + *d2++ = static_cast< TUint8 >( ( r1 + r2 ) >> 1 ); + + g1 = *d1++; + g2 = *d3++; + *d2++ = static_cast< TUint8 >( ( g1 + g2 ) >> 1 ); + + b1 = *d1++; + b2 = *d3++; + *d2++ = static_cast< TUint8 >( ( b1 + b2 ) >> 1 ); + + r1 = *d1++; + r2 = *d3++; + *d2++ = static_cast< TUint8 >( ( r1 + r2 ) >> 1 ); + } + + d += dpitch * 2; + } + + // last row is just copy of previous row, because we cannot calculate + // average + Mem::Copy( reinterpret_cast< TUint8* >( d ) + dpitch, d, dpitch ); + + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplWeightedAverage::Scale2x16M() <<" ), RThread().Id().operator TUint() ) ); + } + +// ----------------------------------------------------------------------------- +// CVtImageScalerImplWeightedAverage::Scale2x16MU16MA() +// ----------------------------------------------------------------------------- +void CVtImageScalerImplWeightedAverage::Scale2x16MU16MA() + { + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplWeightedAverage::Scale2x16MU16MA() >>" ), RThread().Id().operator TUint() ) ); + + TInt sheight = iSource->Size().iHeight; + TInt swidth = iSource->Size().iWidth; + TInt spitch = iSource->BytesPerRow(); + TInt dpitch = iTarget->BytesPerRow(); + + TUint32 mask = 0xfefefefe; + TUint32* s = iSource->DataAddress(); + TUint32* d = iTarget->DataAddress(); + TInt y; + + // first average source rows + for( y = 0; y < sheight; y++ ) + { + TInt x; + TUint32* s1 = s; + TUint32* d1 = d; + TUint32 p2 = *s1++; + TUint32 p1 = 0; + for( x = 0; x < swidth - 1; x++ ) + { + p1 = p2; + *d1++ = p1; + p2 = *s1++; + TUint32 p1a = ( ( ( p1 ^ p2 ) & mask ) >> 1 ) + ( p1 & p2 ); + p1a = ( ( ( p1 ^ p1a ) & mask ) >> 1 ) + ( p1 & p1a ); + *d1++ = p1a; + } + + if( swidth & 1 ) + { + TUint32 p2a = ( ( ( p1 ^ p2 ) & mask ) >> 1 ) + ( p1 & p2 ); + p2a = ( ( ( p2a ^ p2 ) & mask ) >> 1 ) + ( p2a & p2 ); + *d1++ = p2a; + *d1++ = p2; + } + else + { + p2 = *--s1; + *d1++ = p2; + *d1++ = p2; + } + + d = reinterpret_cast< TUint32* > + ( reinterpret_cast< TUint8* >( d ) + dpitch * 2 ); + s = reinterpret_cast< TUint32* > + ( reinterpret_cast< TUint8* >( s ) + spitch ); + } + + // then average rows between + d = iTarget->DataAddress(); + + for( y = 0; y < sheight - 1; y++ ) + { + TUint32* d1 = reinterpret_cast< TUint32* >( d ); + TUint32* d2 = reinterpret_cast< TUint32* > + ( reinterpret_cast< TUint8* >( d1 ) + dpitch ); + TUint32* d3 = reinterpret_cast< TUint32* > + ( reinterpret_cast< TUint8* >( d2 ) + dpitch ); + + TUint32 p1 = *d1++; + + for( TInt x = 0; x < swidth - 1; x++ ) + { + TUint32 p3 = *d3++; + d3++; + + TUint32 r1 = ( ( ( p1 ^ p3 ) & mask ) >> 1 ) + ( p1 & p3 ); + r1 = ( ( ( p1 ^ r1 ) & mask ) >> 1 ) + ( p1 & r1 ); + + *d2++ = r1; + + d1++; + TUint32 p2 = *d1++; + + TUint32 r2 = ( ( ( p2 ^ p3 ) & mask ) >> 1 ) + ( p2 & p3 ); + r2 = ( ( ( p1 ^ r2 ) & mask ) >> 1 ) + ( p1 & r2 ); + + *d2++ = r2; + + p1 = p2; + } + + TUint32 p3 = *d3++; + TUint32 r1 = ( ( ( p1 ^ p3 ) & mask ) >> 1 ) + ( p1 & p3 ); + r1 = ( ( ( p1 ^ r1 ) & mask ) >> 1 ) + ( p1 & r1 ); + *d2++ = r1; + *d2++ = r1; + + d = reinterpret_cast< TUint32* > + ( reinterpret_cast< TUint8* >( d ) + dpitch * 2 ); + } + + // last row is just copy of previous row, because we cannot calculate + // average + Mem::Copy( reinterpret_cast< TUint8* >( d ) + dpitch, d, dpitch ); + + __IF_DEBUG( Print( _L( "ImageScaler [%d]: CVtImageScalerImplWeightedAverage::Scale2x16MU16MA() <<" ), RThread().Id().operator TUint() ) ); + } + +// End of File + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/DisplaySink/src/vtyuvconverter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/DisplaySink/src/vtyuvconverter.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,109 @@ +/* +* Copyright (c) 2005-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: YUV format transcoder. +* +*/ + + +#include "vtyuvconverter.h" + +#ifdef _DEBUG + #include + #define PRINT RDebug::Print + #define _IFDBG(a) a +#else + #define PRINT + #define _IFDBG(a) +#endif + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// VtYuvConverter::ConvertFrom420PlanarTo422Interleaved +// --------------------------------------------------------------------------- +// +TInt VtYuvConverter::ConvertFrom420PlanarTo422Interleaved( + const TDesC8& aSource, + const TSize& aSize, + TDes8& aTarget, + TInt aStride ) + { + _IFDBG(PRINT( _L( "VtYuvConverter::ConvertFrom420PlanarTo422Interleaved<" ) )); + + if ( aTarget.MaxLength() < ByteSize422Interleaved( aSize ) ) + { + _IFDBG(PRINT( _L( "VtYuvConverter::ConvertFrom420PlanarTo422Interleaved> TargetMaxLength < ByteSize422" ) )); + return KErrUnderflow; + } + + if ( aSource.Size() != ByteSize420Planar( aSize ) ) + { + _IFDBG(PRINT( _L( "VtYuvConverter::ConvertFrom420PlanarTo422Interleaved> 420SourceSize != ByteSize420" ) )); + return KErrArgument; + } + + TInt planeSize( aSize.iWidth * aSize.iHeight ); + const TUint8* sy = aSource.Ptr(); + const TUint8* su = sy + planeSize; + const TUint8* sv = su + ( planeSize >> 2 ); + TUint8* t = const_cast< TUint8* >( aTarget.Ptr() ); + + TUint8* tsave = t; + for ( TInt y = ( aSize.iHeight >> 1 ) - 1; y >= 0; y-- ) + { + const TUint8* susave = su; + const TUint8* svsave = sv; + for ( TInt x = ( aSize.iWidth >> 1 ) - 1; x >= 0; x-- ) + { + *t++ = *su++; + *t++ = *sy++; + *t++ = *sv++; + *t++ = *sy++; + } + tsave = t = tsave + aStride; + su = susave; + sv = svsave; + for ( TInt x = ( aSize.iWidth >> 1 ) - 1; x >= 0; x-- ) + { + *t++ = *su++; + *t++ = *sy++; + *t++ = *sv++; + *t++ = *sy++; + } + tsave = t = tsave + aStride; + } + + _IFDBG(PRINT( _L( "VtYuvConverter::ConvertFrom420PlanarTo422Interleaved>" ) )); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// VtYuvConverter::ByteSize420Planar +// --------------------------------------------------------------------------- +// +TInt VtYuvConverter::ByteSize420Planar( const TSize& aSizeInPixels ) + { + TInt planeSize( aSizeInPixels.iWidth * aSizeInPixels.iHeight ); + return planeSize + planeSize / 2; + } + +// --------------------------------------------------------------------------- +// VtYuvConverter::ByteSize422Interleaved +// --------------------------------------------------------------------------- +// +TInt VtYuvConverter::ByteSize422Interleaved( const TSize& aSizeInPixels ) + { + TInt planeSize( aSizeInPixels.iWidth * aSizeInPixels.iHeight ); + return planeSize * 2; + } diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/EABI/VideoSourceU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/EABI/VideoSourceU.DEF Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,38 @@ +EXPORTS + _ZN13CVSController4NewLEP21MVSControllerObserver @ 1 NONAME + _ZN14CVsFrameBuffer4NewLEi @ 2 NONAME + _ZN14CVsFrameBufferD0Ev @ 3 NONAME + _ZN14CVsFrameBufferD1Ev @ 4 NONAME + _ZN14CVsFrameBufferD2Ev @ 5 NONAME + _ZN16CVSMMFDataBuffer4NewLEi @ 6 NONAME + _ZN16CVSMMFDataBuffer4NewLEv @ 7 NONAME + _ZN16CVSMMFDataBufferD0Ev @ 8 NONAME + _ZN16CVSMMFDataBufferD1Ev @ 9 NONAME + _ZN16CVSMMFDataBufferD2Ev @ 10 NONAME + _ZTI14CVsFrameBuffer @ 11 NONAME ; ## + _ZTI15CVSDataProvider @ 12 NONAME ; ## + _ZTI16CVSControllerImp @ 13 NONAME ; ## + _ZTI16CVSDataSourceImp @ 14 NONAME ; ## + _ZTI16CVSMMFDataBuffer @ 15 NONAME ; ## + _ZTI17CVSFrameRateTimer @ 16 NONAME ; ## + _ZTI18CSyncCameraReserve @ 17 NONAME ; ## + _ZTI19CVSProviderSwitchAO @ 18 NONAME ; ## + _ZTI21CVSCameraDataProvider @ 19 NONAME ; ## + _ZTI23CVSDataSourceObserverAO @ 20 NONAME ; ## + _ZTI24CProviderErrorNotifierAO @ 21 NONAME ; ## + _ZTI25CVSStillImageDataProvider @ 22 NONAME ; ## + _ZTI28CVSOnboardCameraDataProvider @ 23 NONAME ; ## + _ZTV14CVsFrameBuffer @ 24 NONAME ; ## + _ZTV15CVSDataProvider @ 25 NONAME ; ## + _ZTV16CVSControllerImp @ 26 NONAME ; ## + _ZTV16CVSDataSourceImp @ 27 NONAME ; ## + _ZTV16CVSMMFDataBuffer @ 28 NONAME ; ## + _ZTV17CVSFrameRateTimer @ 29 NONAME ; ## + _ZTV18CSyncCameraReserve @ 30 NONAME ; ## + _ZTV19CVSProviderSwitchAO @ 31 NONAME ; ## + _ZTV21CVSCameraDataProvider @ 32 NONAME ; ## + _ZTV23CVSDataSourceObserverAO @ 33 NONAME ; ## + _ZTV24CProviderErrorNotifierAO @ 34 NONAME ; ## + _ZTV25CVSStillImageDataProvider @ 35 NONAME ; ## + _ZTV28CVSOnboardCameraDataProvider @ 36 NONAME ; ## + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/bmarm/VIDEOSOURCEU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/bmarm/VIDEOSOURCEU.DEF Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,4 @@ +EXPORTS + NewL__13CVSControllerP21MVSControllerObserver @ 1 NONAME R3UNUSED ; CVSController::NewL(MVSControllerObserver *) + SwitchDataProviderL__16CVSDataSourceImpP15CVSDataProvider @ 2 NONAME R3UNUSED ; CVSDataSourceImp::SwitchDataProviderL(CVSDataProvider *) + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/bwins/VIDEOSOURCEU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/bwins/VIDEOSOURCEU.DEF Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,8 @@ +EXPORTS + ??1CVSMMFDataBuffer@@UAE@XZ @ 1 NONAME ; CVSMMFDataBuffer::~CVSMMFDataBuffer(void) + ??1CVsFrameBuffer@@UAE@XZ @ 2 NONAME ; CVsFrameBuffer::~CVsFrameBuffer(void) + ?NewL@CVSController@@SAPAV1@PAVMVSControllerObserver@@@Z @ 3 NONAME ; class CVSController * CVSController::NewL(class MVSControllerObserver *) + ?NewL@CVSMMFDataBuffer@@SAPAV1@H@Z @ 4 NONAME ; class CVSMMFDataBuffer * CVSMMFDataBuffer::NewL(int) + ?NewL@CVSMMFDataBuffer@@SAPAV1@XZ @ 5 NONAME ; class CVSMMFDataBuffer * CVSMMFDataBuffer::NewL(void) + ?NewL@CVsFrameBuffer@@SAPAV1@H@Z @ 6 NONAME ; class CVsFrameBuffer * CVsFrameBuffer::NewL(int) + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/data/videosource_stub.SIS Binary file vtprotocolplugins/VideoSource/data/videosource_stub.SIS has changed diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/data/videosource_stub.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/data/videosource_stub.pkg Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,29 @@ +; +; Copyright (c) 2009 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: +; +; Languages +&EN + +; Header +#{"videosource"}, (0x101F8692), 1, 0, 0, TYPE=SA + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + +;Files +""-"z:\sys\bin\videosource.dll" diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/group/CApiVideoSource.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/group/CApiVideoSource.mmp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,65 @@ +/* +* Copyright (c) 2004 - 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: Project definition file for Video Source subsystem +* +*/ + + +#include +#include "../inc/VideoSourceUids.hrh" + +TARGET videosource.dll +TARGETTYPE dll +VENDORID VID_DEFAULT + +UID KSharedLibraryUidDefine KUidVideoSourceLibrary + +SOURCEPATH ../src +SOURCE CVSController.cpp +SOURCE CVSControllerImp.cpp +SOURCE CVSDataProvider.cpp +SOURCE CVSStillImageDataProvider.cpp +SOURCE CVSCameraDataProvider.cpp +SOURCE CVSOnboardCameraDataProvider.cpp +SOURCE CVSDataSourceImp.cpp +SOURCE CVSMMFDataBuffer.cpp + +SOURCE cmultiframeloopao.cpp +SOURCE cmultiframeprovider.cpp +SOURCE cmultiframedataao.cpp +USERINCLUDE ../inc +SYSTEMINCLUDE ../../../inc +APP_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE /epoc32/include/mmf/server +SYSTEMINCLUDE /epoc32/include/mmf/common + +LIBRARY euser.lib +LIBRARY fbscli.lib +LIBRARY mmfcontrollerframework.lib +LIBRARY ecam.lib +LIBRARY efsrv.lib +LIBRARY bafl.lib +LIBRARY bitgdi.lib +LIBRARY imageconversion.lib +LIBRARY vtimageconverter.lib +LIBRARY vtimagetransforms.lib +LIBRARY featmgr.lib +LIBRARY phoneclient.lib +LIBRARY ws32.lib +LIBRARY ecamadvsettings.lib + +CAPABILITY CAP_GENERAL_DLL + +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/group/bld.inf Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,37 @@ +/* +* Copyright (c) 2004 - 2007 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: Component definition file for Video Source subsystem +* +*/ + +#include + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS + +../inc/CApiVideoSource.h |../../../inc/capivideosource.h +../inc/capivideosource.inl |../../../inc/capivideosource.inl + +// Export SIS stub file +../data/videosource_stub.SIS /epoc32/data/z/system/install/videosource_stub.sis + +// Export IBY file +../rom/VideoSource.iby CORE_APP_LAYER_IBY_EXPORT_PATH(videosource.iby) + +PRJ_MMPFILES +CApiVideoSource.mmp + +// End of File \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/inc/CApiVideoSource.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/inc/CApiVideoSource.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,922 @@ +/* +* 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. +* +*/ + + +#ifndef CAPIVIDEOSOURCE_H +#define CAPIVIDEOSOURCE_H + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include + +// FORWARD DECLARATIONS + +class MVSControllerObserver; +class MVSDataSourceObserver; +class MVSDataProviderObserver; +class CVSDataSource; +class CVSDataProvider; +class TVSDataProviderInfo; +class CVSDataSourceImp; +class CProviderErrorNotifierAO; + +class MFrameBuffer; +class RWsSession; +class CWsScreenDevice; +class RWindowBase; +class CFbsBitmap; +class MDataSink; +class MDataSource; +class MAsyncEventHandler; +class TMMFPrioritySettings; +class TMMFMessage; +class CDesC8Array; +class CVSMMFDataBuffer; + +// Camera lost during VT error +const TInt KVsErrCameraNoLongerReserved = 666; +// CLASS DECLARATION + +/** +* Initialization settings class for still image provider. +* +* @lib videosource.lib +*/ +class TVSStillImageDataProviderParams + { + public: + /** + * Enumeration that defines different initialization + * types. + */ + enum TInitialize + { + /** Created as blank image */ + EInitializeAsBlankImage, + /** Image will be load from General Settings */ + EInitializeFromGeneralSettings, + /** Image will be from file */ + EInitializeFromFile, + /** Imge will be load from phone server */ + EInitializeAsDefaultStillImage + }; + + public: + /** + * Constructor, set iInitialize to EInitializeAsBlankImage. iFileName + * is initialized as an empty descriptor. + */ + inline TVSStillImageDataProviderParams(); + + /** + * Constructor. iFileName is initialized as an empty descriptor. + * @param aInitialize Defines how provider must be initialized. + */ + inline TVSStillImageDataProviderParams( const TInitialize aInitialize ); + + /** + * Constructor. iInitialize is set to EInitializeFromFile. + * @param aFileName Name of the file from which this instance will + * be initialized. + */ + inline TVSStillImageDataProviderParams( const TFileName& aFileName ); + + public: + // Initialization type + TInitialize iInitialize; + + // Filename for EInitializeFromFile + TFileName iFileName; + }; + +typedef TPckgBuf< TVSStillImageDataProviderParams > TVSStillImageDataProviderParamsBuf; + +/** +* An interface to access free MMF buffers. +* +* @lib videosource.lib +*/ +class MVSBufferPool + { + public: + + /** + * Pure virtual function to get next free buffer from free buffer pool. + * @param "aRemove" Boolean flag. If ETrue buffer will be removed from + * the pool. + * @exception Can leave with one of the system wide error codes. + * @return Returns pointer to next available buffer in free buffers + * queue or NULL if no buffers in queue are available. + */ + virtual CVSMMFDataBuffer* GetBufferL( TBool aRemove ) = 0; + + /** + * Frees buffer that was previously got using GetBufferL(). + * @param "aBuffer" Buffer to be freed. + * @exception Can leave with one of the system wide error codes. + */ + virtual void FreeBufferL( CVSMMFDataBuffer* aBuffer ) = 0; + }; + +/** +* An interface to a controller callback functions. +* +* @lib videosource.lib +*/ +class MVSControllerObserver + { + public: + + /** + * Called when provider count has been changed. + * @param "aAttached" ETrue if provider attached, else EFalse. + */ + virtual void vsProvidersChanged( TBool aAttached ) = 0; + }; + +/** +* Controller interface. +* +* @lib videosource.lib +*/ +class CVSController : public CBase + { + public: // Constructor and destructor + + /** + * Static factory function to create instance of this class. + * @param "aObserver" Pointer to controller observer. + * @exception Can leave with one of the system wide error codes. + * @return Pointer to new instance. + */ + IMPORT_C static CVSController* NewL( MVSControllerObserver* aObserver ); + + /** + * Pure virtual function to create data source instance. + * @param "aObserver" Pointer to data source observer. + * @exception Can leave with one of the system wide error codes. + * @return Pointer to new data source instance. + */ + virtual CVSDataSource* CreateDataSourceL( + MVSDataSourceObserver* aObserver ) = 0; + + public: // New functions + + /** + * Pure virtual function to return provider count and provider index. + * @return Number of providers available. Count also acts as zero based + * provider index. + */ + virtual TInt ProvidersAvailable() = 0; + + /** + * Pure virtual function to return provider information. + * @param "aProviderIndex" Index of the provider to return information + * for. + * @param "aInfo" Reference to the variable where the provider + * information is copied. + * @exception Can leave with one of the system wide error codes. + */ + virtual void ProviderInfoL( + TInt aProviderIndex, + TVSDataProviderInfo& aInfo ) = 0; + + /** + * Pure virtual function to create provider instance. + * @param "aProviderIndex" Index of the provider to be created. + * @param "aObserver" Pointer to provider observer. + * @param "aPool" Pointer to data MVSBufferPool that gives buffer to + * data provider. + * @exception Can leave with one of the system wide error codes. + * @return Pointer to new provider instance. + */ + virtual CVSDataProvider* CreateDataProviderL( + TInt aProviderIndex, + MVSDataProviderObserver* aObserver, + MVSBufferPool* aPool ) = 0; + + public: // Constructor and destructor + + public: // Functions from base classes + + protected: // New functions + + /** + * C++ default constructor. + */ + CVSController(); + + /** + * Inliner to return reference to the controller observer. + * @return Reference to the controller observer. + */ + inline MVSControllerObserver& Observer() const; + + protected: // Constructor and destructor + + /** + * 2nd phase constructor. + * @param "aObserver" Pointer to controller observer + * @exception Can leave with one of the system wide error codes. + */ + virtual void ConstructL( MVSControllerObserver* aObserver ) = 0; + + protected: // Functions from base classes + + public: // Data + + protected: // Data + + // Pointer to controller observer + MVSControllerObserver* iObserver; + + private: // Data + + }; + +/** +* An interface to a provider callback functions. +* +* @lib videosource.lib +*/ +class MVSDataProviderObserver + { + public: + + /** + * Called when an error occurred in provider. + * @param "aError" of the system wide error codes. + */ + virtual void vsProviderError( TInt aError ) = 0; + + /** + * Called when provider is initalized. + */ + virtual void vsProviderReady() = 0; + + /** + * Called when provider has view finder bitmap ready. + * @param "aFrame" Reference to the view finder bitmap. + */ + virtual void vsViewFinderFrameReady( CFbsBitmap& aFrame ) = 0; + }; + +/** +* Extension to standard ECam TCameraInfo class. +* +* @lib videosource.lib +*/ +class TVSDataProviderInfo : public TCameraInfo + { + public: // Data + + // ETrue if the Freeze() is supported. + TBool iFreezeSupported; + + // Pointer to extension information. + TAny* iExtension; + + // A bitfield of suported colortones + TUint32 iSupportedColorTones; + }; + +/** +* Provider interface. +* +* @lib videosource.lib +*/ +class CVSDataProvider : public CBase + { + public: // Constructor and destructor + + /** + * Static factory function to create instance of this class. + * @param "aProviderIndex" Index of the provider to be created. + * @param "aObserver" Pointer to data provider observer. + * @param "aPool" Pointer to data MVSBufferPool that gives buffer to + * data provider. + * @exception Can leave with one of the system wide error codes. + * @return Pointer to new instance. + */ + static CVSDataProvider* NewL( + TInt aProviderIndex, + MVSDataProviderObserver* aObserver, + MVSBufferPool* aPool ); + + /** + * Destructor. + */ + ~CVSDataProvider(); + + public: // New functions + + /** + * Static function get provider count and provider index. + * @return Number of providers available. Count also acts as zero based + * provider index. + */ + static TInt ProvidersAvailable(); + + /** + * Static function to return provider information. + * @param "aProviderIndex" Index of the provider to return information + * for. + * @param "aInfo" Reference to the variable to where the provider + * information is copied. + * @exception Can leave with one of the system wide error codes. + */ + static void ProviderInfoL( + TInt aProviderIndex, + TVSDataProviderInfo& aInfo ); + + /** + * Pure virtual function to initialize provider. + * @param "aInitParams" Reference to the initialization parameters. + * @exception Can leave with one of the system wide error codes. + */ + virtual void InitializeL( const TDesC8& aInitParams ) = 0; + + /** + * Pure virtual function to cancel initialization of provider. + */ + virtual void CancelInitializing() = 0; + + /** + * Pure virtual function to return digital zoom factor. + * @return Digital zoom factor. + */ + virtual TInt DigitalZoomFactor() const = 0; + + /** + * Pure virtual function to set digital zoom factor. + * @param "aDigitalZoomFactor" Digital zoom factor. + * @exception Can leave with one of the system wide error codes. + */ + virtual void SetDigitalZoomFactorL( TInt aDigitalZoomFactor = 0 ) = 0; + + /** + * Pure virtual function to start view finder bitmaps. + * @param "aSize" Size of the returned view finder bitmap. + * @exception Can leave with one of the system wide error codes. + */ + virtual void StartViewFinderBitmapsL( TSize& aSize ) = 0; + + /** + * Pure virtual function to start view finder bitmaps. + * @param "aSize" Size of the returned view finder bitmap. + * @param "aClipRect" Required clip rectangle. + * @exception Can leave with one of the system wide error codes. + */ + virtual void StartViewFinderBitmapsL( + TSize& aSize, + TRect& aClipRect ) = 0; + + /** + * Pure virtual function to start view finder bitmaps using direct + * screen access. + * @param "aWs" Window server session. + * @param "aScreenDevice" Screen device. + * @param "aWindow" Displayable window. + * @param "aScreenRect" Portion of the screen to which view finder data + * is to be transferred. + * @exception Can leave with one of the system wide error codes. + */ + virtual void StartViewFinderDirectL( + RWsSession& aWs, + CWsScreenDevice& aScreenDevice, + RWindowBase& aWindow, + TRect& aScreenRect ) = 0; + + /** + * Pure virtual function to start view finder bitmaps using direct + * screen access. + * @param "aWs" Window server session. + * @param "aScreenDevice" Screen device. + * @param "aWindow" Displayable window. + * @param "aScreenRect" Portion of the screen to which view finder data + * is to be transferred. + * @param "aClipRect" The rectangle to which the screen will be clipped. + * @exception Can leave with one of the system wide error codes. + */ + virtual void StartViewFinderDirectL( + RWsSession& aWs, + CWsScreenDevice& aScreenDevice, + RWindowBase& aWindow, + TRect& aScreenRect, + TRect& aClipRect ) = 0; + + /** + * Pure virtual function to test if view finder is active. + * @return ETrue if view finder active. + */ + virtual TBool ViewFinderActive() const = 0; + + /** + * Pure virtual function to stop view finder bitmaps. + */ + virtual void StopViewFinder() = 0; + + /** + * Pure virtual function to return provider information. + * @param "aInfo" Reference to the variable to where the provider + * information is copied. + */ + virtual void ProviderInfo( TVSDataProviderInfo& aInfo ) = 0; + + /** + * Used to switch between what the camera sees and what you would see + * if the device were a mirror. + * @param "aMirror" ETrue to set mirroring on, EFalse to set mirroring off. + * @exception May leave with KErrNotSupported. + */ + virtual void SetViewFinderMirrorL( TBool aMirror ) = 0; + + /** + * Gets whether view finder mirroring is active. + * @return ETrue if mirroring is set, EFalse if mirroring is not set. + */ + virtual TBool ViewFinderMirror() const = 0; + + /** + * Freezes video (i.e. starts sending the last frame until provider is + * unfrozen). + * @exception May leave with KErrNotSupported if freezing is not supported + * by the provider. + */ + virtual void FreezeL() = 0; + + /** + * Unfreezes video (i.e. starts sending actual frames). + * @exception May leave with KErrNotSupported if freezing + * is not supported + * by the provider. + */ + virtual void UnfreezeL()= 0; + + /** + * Gets whether freeze is active. + * @return ETrue if video is frozen, EFalse otherwise. + */ + virtual TBool IsFrozen() const = 0; + + /** + * Sets the contrast adjustment of the device. + * This must be in the range of -100 to +100 or EContrastAuto. + * May leave with KErrNotSupported if the specified contrast value + * is out of range. + * @since S60 v3.2 + * @param aContrast + */ + virtual void SetContrastL( TInt aContrast ) = 0; + + /** + * Gets the currently set contrast value. + * @since S60 v3.2 + * @param aContrast The currently set contrast value. + * @return indication if method succeed or not. + */ + virtual TInt GetContrast( TInt& aContrast ) const = 0; + + /** + * Sets the brightness adjustment of the device. + * This must be in the range of -100 to +100 or EBrightnessAuto. + * May leave with KErrNotSupported if the brightness adjustment + * is out of range. + * @since S60 v3.2 + * @param aBrightness The required brightness adjustment. + */ + virtual void SetBrightnessL( TInt aBrightness ) = 0; + + /** + * Gets the currently set brightness adjustment value. + * @since S60 v3.2 + * @param aBrightness The currently set brightness adjustment value. + * @return indication if method succeed or not. + */ + virtual TInt GetBrightness( TInt& aBrightness ) const = 0; + + /** + * Sets the white balance adjustment of the device. + * No effect if this is not supported, see + * TCameraInfo::iWhiteBalanceModesSupported. + * @since S60 v3.2 + * @param aWhiteBalance The required white balance adjustment. + * @leave KErrNotSupported if the specified white balance adjustment + * is invalid. + */ + virtual void SetWhiteBalanceL( + CCamera::TWhiteBalance aWhiteBalance = CCamera::EWBAuto) = 0; + + /** + * Gets the currently set white balance adjustment value. + * @since S60 v3.2 + * @param aWhiteBalance The currently set white balance adjustment value. + * @return indication if method succeed or not. + */ + virtual TInt GetWhiteBalance( + CCamera::TWhiteBalance& aWhiteBalance ) const = 0; + + /** + * Gives the current color tone setting value + * @since S60 v3.2 + * @param aColorTone The currently set color tone adjustment value. + * @return indication if method succeed or not. + */ + virtual TInt GetColorTone( + CCamera::CCameraImageProcessing::TEffect& aColorTone ) const = 0; + + /** + * Sets color tone + * @since S60 v3.2 + * @param aValue new color tone + */ + virtual void SetColorToneL( + CCamera::CCameraImageProcessing::TEffect aValue ) = 0; + + public: // Functions from base classes + + protected: // New functions + + protected: // Functions from base classes + + private: // New functions + + /** + * See MDataSource for description. + */ + virtual void FillBufferL( + CMMFBuffer* aBuffer, + MVTVideoSink* aConsumer, + TMediaId aMediaId ) = 0; + + /** + * See MDataSource for description. + */ + virtual TInt SourceThreadLogon( MAsyncEventHandler& aEventHandler ) = 0; + + /** + * See MDataSource for description. + */ + virtual void SourceThreadLogoff() = 0; + + /** + * See MDataSource for description. + */ + virtual void SourcePrimeL() = 0; + + /** + * See MDataSource for description. + */ + virtual void SourcePlayL() = 0; + + /** + * See MDataSource for description. + */ + virtual void SourcePauseL() = 0; + + /** + * See MDataSource for description. + */ + virtual void SourceStopL() = 0; + + private: // New functions + + /** + * See MVTVideoInput for description. + */ + virtual void SetFormatL( const TDesC8& aFormat ) = 0; + + /** + * See MVTVideoInput for description. + */ + virtual void SetFrameRateL( TReal32 aFrameRate ) = 0; + + /** + * See MVTVideoInput for description. + */ + virtual void SetVideoFrameSizeL( const TSize& aSize ) = 0; + + /** + * See MVTVideoInput for description. + */ + virtual void GetVideoFrameSizeL( TSize& aSize ) const = 0; + + private: // Functions from base classes + + protected: // New functions + + /** + * This version of prime method will be called when a provider + * is being switched. + * @exception Can leave with one of the system wide error codes. + */ + virtual void PrimeL() = 0; + + /** + * Inliner to test if FillBufferL call is active. + * @return ETrue if FillBufferL call is ongoing, else EFalse. + */ + inline TBool FillBufferActive() const; + + /** + * Inliner to return the sink that will empty the buffer. + * @return Pointer to sink. + */ + inline MVTVideoSink* Consumer() const; + + /** + * Inliner to return sink media ID that is used. + * @return Media ID identifiyng the stream that is used. + */ + inline TMediaId MediaId() const; + + /** + * Inliner to return reference to the provider observer. + * @return Reference to the provider observer. + */ + inline MVSDataProviderObserver& Observer() const; + + /** + * Saves input parameters given in FillBufferL call. + * @param "aConsumer" Pointer to sink that will empty the filled buffer. + * @param "aMediaId" Media ID for source/provider stream that is used. + */ + virtual void SetFillBufferParams( + MVTVideoSink* aConsumer, + TMediaId aMediaId ); + + /** + * Notify observer about provider error. + * @param "aError" Error code + */ + void NotifyError( TInt aError ); + + /** + * Inliner to return reference to the buffer pool. + * @return Reference to the buffer pool. + */ + inline MVSBufferPool& BufferPool() const; + + protected: // Constructor and destructor + + /** + * C++ default constructor. + */ + CVSDataProvider(); + + /** + * Constructor. + * @param "aObserver" Pointer to provider observer. + */ + CVSDataProvider( + MVSDataProviderObserver* aObserver, + MVSBufferPool* aPool ); + + /** + * 2nd phase constructor. + * @exception Can leave with one of the system wide error codes. + */ + void ConstructL(); + + /** + * Returns microseconds from the first SourcePlayL() call. + */ + const TTimeIntervalMicroSeconds& TimeToPlay(); + + /** + * Resets start time (the time when SourcePlayL() was called). + * iStartTime is set to TTime::HomeTime(). + */ + void ResetStartTime(); + + private: // New functions + + /** + * + */ + static TInt CamerasAvailable(); + + /** + * Sets timestamp for first SourcePlayL() call. This method + * is called by the CVSDataSource when data provider is switched. + */ + void SwitchFrom( const CVSDataProvider& anOldProvider ); + + /** + * Enumerate all providers and create a set of formats that is supported + * by all of them. + */ + static void EnumerateVideoFrameFormatsL( + CDesC8Array* aSupportedFormats ); + + /** + * Enumerate all providers and create a set of video frame sizes that + * is supported by all of them. + */ + static void EnumerateVideoFrameSizesL( + RArray& aSupportedSizes, + const TDesC8& aFormat ); + + /** + * Enumerate all providers and create a set of video frame rates that + * is supported by all of them. + */ + static void EnumerateVideoFrameRatesL( + RArray& aSupportedRates, + const TDesC8& aFormat, + const TSize& aSize ); + + protected: // New functions + + /** + * Get video frame size. Implemented in each provider. + */ + virtual void GetVideoFrameSize( + TSize& aSize, + TInt aSizeIndex, + const TDesC8& aFormat ) = 0; + + /** + * Get video frame rate. Implemented in each provider. + */ + virtual void GetVideoFrameRate( + TReal32& aRate, + TInt aRateIndex, + const TDesC8& aFormat, + const TSize& aSize ) = 0; + + public: // Data + + protected: // Data + + // Boolean that is ETrue when FillBufferL call is active. + TBool iFillBufferActive; + + // Sink that empties the buffer filled with video frame. Not owned. + MVTVideoSink* iConsumer; + + // Provider's media ID identifying media stream used. + TMediaId iMediaId; + + private: // Data + + // Pointer to provider observer. + MVSDataProviderObserver* iObserver; + + // Pointer to AO that reports provider errors to provider observer, + // used through NotifyError call. + CProviderErrorNotifierAO* iErrorNotifier; + + // Pointer to buffer pool + MVSBufferPool* iPool; + + // Previous TimeToPlay interval + TTimeIntervalMicroSeconds iPreviousTimeToPlay; + + // Start time (time when SourcePlayL() was called) + TTime iStartTime; + + private: // Data + + // Source is friend because it's MDataSource and MVTVideoInput derived + // calls are forwarded to provider. + friend class CVSDataSource; + + // Source is friend because it's MDataSource and MVTVideoInput derived + // calls are forwarded to provider. + friend class CVSDataSourceImp; + }; + +/** +* An interface to a data source callback functions. +* +* @lib videosource.lib +*/ +class MVSDataSourceObserver + { + public: + + /** + * Called when provider switch completed. + * @param "aOldProvider" Pointer provider that was previously active. + */ + virtual void vsProviderSwitchDone( CVSDataProvider* aOldProvider ) = 0; + }; + +/** +* Data source interface. +* +* @lib videosource.lib +*/ +class CVSDataSource : + public CBase, + public MVTVideoSource, + public MVSBufferPool + { + public: // Constructor and destructor + + /** + * Static factory function to create data source instance. + * @param "aObserver" Pointer to data source observer. + * @exception Can leave with one of the system wide error codes. + * @return Pointer to data source instance. + */ + static CVSDataSource* NewSourceL( MVSDataSourceObserver* aObserver ); + + public: // New functions + + /** + * Pure virtual function to switch active provider for source. + * @param "aNewProvider" Pointer to provider instance. + * @exception Can leave with one of the system wide error codes. + */ + virtual void SwitchDataProviderL( CVSDataProvider* aNewProvider ) = 0; + + /** + * Temporarily pause video sending. Used during initialization. + */ + virtual void PauseSending() = 0; + + /** + * Resume video sending. Used during initialization. + */ + virtual void ResumeSending() = 0; + + public: // Functions from base classes + + protected: // New functions + + /** + * Inliner to return reference to the data source observer. + * @return Reference to the data source observer. + */ + inline MVSDataSourceObserver& Observer() const; + + /** + * Inliner to return reference to the provider that is active. + * @return Reference to the provider. + */ + inline CVSDataProvider& DataProvider() const; + + /** + * Inliner to update member variable holding pointer to provider with + * new provider pointer. + * @param "aNewProvider" Pointer to (new) provider. + * @return Pointer to (old) provider. + */ + inline CVSDataProvider* SwitchProvider( CVSDataProvider* aNewProvider ); + + protected: // Constructor and destructor + + /** + * Constructor. + */ + CVSDataSource(); + + private: // Constructor and destructor + + /** + * 2nd phase consturctor. + * @param "aObserver" Pointer to data source observer. + * @exception Can leave with one of the system wide error codes. + */ + void ConstructL( MVSDataSourceObserver* aObserver ); + + private: // New functions + + private: // Functions from base classes + + public: // Data + + protected: // Data + + private: // Data + + // Pointer to data source observer. + MVSDataSourceObserver* iObserver; + + // Pointer to active provider. + CVSDataProvider* iProvider; + }; + +#include "capivideosource.inl" + +#endif // CAPIVIDEOSOURCE_H diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/inc/CVSCameraDataProvider.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/inc/CVSCameraDataProvider.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,517 @@ +/* +* 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. +* +*/ + + +#ifndef CVSCAMERADATAPROVIDER_H +#define CVSCAMERADATAPROVIDER_H + +// INCLUDE FILES + +#include "CApiVideoSource.h" + +#include +#include +// CLASS FORWARDS + +class CVsFrameBuffer; + +// CLASS DECLARATION + +/** +* Internal MFrameBuffer API. +* +* @lib videosource.lib +* @since 5.0 +*/ +class MVsFrameBuffer + { + +public: + + /** + * Copies properties from the given frame buffer. + * @param "aSource" Source frame buffer from which propreties will + * be copied. + */ + virtual void CopyProperties( MFrameBuffer* aSource ) = 0; + + /** + * Copies properties from the given camera buffer. + * @param "aSource" Source camera buffer from which propreties will + * be copied. + */ + virtual void CopyProperties( MCameraBuffer* aSource ) = 0; + + /** + * Copies frame data and properties from the given frame buffer. + * @param "aSource" Source frame buffer from which propreties and + * frame data will be copied. + */ + virtual void CopyFrameL( MFrameBuffer* aSource ) = 0; + + /** + * Copies frame data and properties from the given camera buffer. + * @param "aSource" Source camera buffer from which propreties and + * frame data will be copied. + */ + virtual void CopyFrameL( MCameraBuffer* aSource ) = 0; + + }; + +/** +* Internal MFrameBuffer implementation. +* +* @lib videosource.lib +*/ +class CVsFrameBuffer : public CBase, public MVsFrameBuffer, + public MFrameBuffer, public MCameraBuffer + { + public: + + /** + * Constructor. + * @param "sSize" Size of stored frame in bytes. + * @exception Can leave with one of the system wide error codes. + */ + IMPORT_C static CVsFrameBuffer* NewL( TInt aSize ); + + /** + * Destructor. + */ + IMPORT_C ~CVsFrameBuffer(); + + public: // from MVsFrameBuffer + + /** + * @see MVsFrameBuffer::CopyProperties + */ + virtual void CopyProperties( MFrameBuffer* aSource ); + + /** + * @see MVsFrameBuffer::CopyProperties + */ + virtual void CopyProperties( MCameraBuffer* aSource ); + + /** + * @see MVsFrameBuffer::CopyFrameL + */ + virtual void CopyFrameL( MFrameBuffer* aSource ); + + /** + * @see MVsFrameBuffer::CopyFrameL + */ + virtual void CopyFrameL( MCameraBuffer* aSource ); + + public: // from MFrameBuffer + + /** + * @see MFrameBuffer::DataL or MCameraBuffer::DataL + */ + TDesC8* DataL( TInt aIndex ); + + /** + * @see MFrameBuffer::FrameL or MCameraBuffer::FrameL + */ + CFbsBitmap* FrameL( TInt aIndex ); + + /** + * @see MFrameBuffer::Release or MCameraBuffer::Release + */ + void Release(); + + /** + * @see MCameraBuffer::FrameSize + */ + TInt FrameSize(TInt aFrameIndex); + + /** + * @see MCameraBuffer::ChunkOffsetL + */ + TInt ChunkOffsetL(TInt aFrameIndex); + + /** + * @see MCameraBuffer::ChunkL + */ + RChunk& ChunkL(); + + /** + * @see MCameraBuffer::BitmapL + */ + CFbsBitmap& BitmapL(TInt aFrameIndex); + + /** + * @see MCameraBuffer::NumFrames + */ + TInt NumFrames(); + + private: + + /** + * Constructor. + */ + CVsFrameBuffer(); + + /** + * Second phase constructor. + * @param "aSize" Size of the frame in bytes. + */ + void ConstructL( TInt aSize ); + + private: + + HBufC8* iBuffer; + + TPtr8 iPtr; + + }; + +/** +* Internal implementation of onboard camera data provider base class. This +* class is inherited from public provider interface. +* +* @lib videosource.lib +*/ +class CVSCameraDataProvider : public CVSDataProvider, public MCameraObserver, public MVtImageScalerObserver, public MCameraObserver2 + { + public: // Constructor and destructor + + /** + * Factory function to create instance of onboard camera data provider. + * @param "aObserver" Pointer to provider observer. + * @param "aProviderIndex" Index of the provider to be created. + * @param "aPool" Pointer to data MVSBufferPool that gives buffer to + * data provider. + * @exception Can leave with one of the system wide error codes. + * @return Pointer to new provider instance. + */ + static CVSCameraDataProvider* NewL( + MVSDataProviderObserver* aObserver, + TInt aProviderIndex, + MVSBufferPool* aPool ); + + /** + * Destructor. + */ + ~CVSCameraDataProvider(); + + public: // New functions + + public: // Functions from base classes + + /** + * Initialize provider. + * @param "aInitParams" Initialization parameters. + * @exception Can leave with one of the system wide error codes. + */ + void InitializeL( const TDesC8& aInitParams ); + + /** + * Cancel initialization of camera provider. + */ + void CancelInitializing(); + + /** + * Return digital zoom factor. + * @return Digital zoom factor. + */ + virtual TInt DigitalZoomFactor() const; + + /** + * Set digital zoom factor. + * @param "aDigitalZoomFactor" Digital zoom factor. + * @exception Can leave with one of the system wide error codes. + */ + virtual void SetDigitalZoomFactorL( TInt aDigitalZoomFactor = 0 ); + + /** + * Start view finder bitmaps. + * @param "aSize" Size of the returned view finder bitmap. + * @exception Can leave with one of the system wide error codes. + */ + virtual void StartViewFinderBitmapsL( TSize& aSize ); + + /** + * Start view finder bitmaps. + * @param "aSize" Size of the returned view finder bitmap. + * @param "aClipRect" Required clip rectangle. + * @exception Can leave with one of the system wide error codes. + */ + virtual void StartViewFinderBitmapsL( TSize& aSize,TRect& aClipRect ); + + /** + * Stop view finder bitmaps. + */ + virtual void StopViewFinder(); + + /** + * Test if view finder is active. + * @return ETrue if view finder active. + */ + virtual TBool ViewFinderActive() const; + + /** + * Start view finder bitmaps using direct screen access. + * @param "aWs" Window server session. + * @param "aScreenDevice" Screen device. + * @param "aWindow" Displayable window. + * @param "aScreenRect" Portion of the screen to which view finder data + * is to be transferred. + * @exception Can leave with one of the system wide error codes. + */ + virtual void StartViewFinderDirectL( + RWsSession& aWs, + CWsScreenDevice& aScreenDevice, + RWindowBase& aWindow, + TRect& aScreenRect ); + + /** + * Start view finder bitmaps using direct screen access. + * @param "aWs" Window server session. + * @param "aScreenDevice" Screen device. + * @param "aWindow" Displayable window. + * @param "aScreenRect" Portion of the screen to which view finder data + * is to be transferred. + * @param "aClipRect" The rectangle to which the screen will be clipped. + * @exception Can leave with one of the system wide error codes. + */ + virtual void StartViewFinderDirectL( + RWsSession& aWs, + CWsScreenDevice& aScreenDevice, + RWindowBase& aWindow, + TRect& aScreenRect, + TRect& aClipRect ); + + /** + * Return provider information. + * @param @param "aInfo" Reference to variable to where the provider + * information is copied. + */ + virtual void ProviderInfo( TVSDataProviderInfo& aInfo ); + + /** + * See CVSDataProvider for description. + */ + virtual void SetViewFinderMirrorL( TBool aMirror ); + + /** + * See CVSDataProvider for description. + */ + virtual TBool ViewFinderMirror() const; + + /** + * See CVSDataProvider for description. + */ + virtual void FreezeL(); + + /** + * See CVSDataProvider for description. + */ + virtual void UnfreezeL(); + + /** + * See CVSDataProvider for description. + */ + virtual TBool IsFrozen() const; + + /** + * @see CVSDataProvider::SetContrastL for description. + */ + virtual void SetContrastL( TInt aContrast ); + + /** + * @see CVSDataProvider::GetContrast + */ + virtual TInt GetContrast( TInt& aContrast ) const; + + /** + * @see CVSDataProvider::SetBrightnessL for description. + */ + virtual void SetBrightnessL( TInt aBrightness ); + + /** + * @see CVSDataProvider::GetBrightness for description. + */ + virtual TInt GetBrightness( TInt& aBrightness ) const; + + /** + * @see CVSDataProvider::SetWhiteBalanceL for description. + */ + virtual void SetWhiteBalanceL( + CCamera::TWhiteBalance aWhiteBalance = CCamera::EWBAuto ); + + /** + * @see CVSDataProvider::GetWhiteBalance for description. + */ + virtual TInt GetWhiteBalance( + CCamera::TWhiteBalance& aWhiteBalance ) const; + + /** + * @see CVSDataProvider::GetColorTone for description. + */ + virtual TInt GetColorTone( + CCamera::CCameraImageProcessing::TEffect& aColorTone ) const; + + /** + * @see CVSDataProvider::SetColorToneL for description. + */ + virtual void SetColorToneL( + CCamera::CCameraImageProcessing::TEffect aValue ); + + protected: // from MCameraObserver + + /** + * @see MCameraObserver::ImageReady + */ + virtual void ImageReady( CFbsBitmap* aBitmap, HBufC8* aData, + TInt aError ); + + /** + * @see MCameraObserver::PowerOnComplete + */ + virtual void PowerOnComplete( TInt aError ); + + /** + * @see MCameraObserver::ViewFinderFrameReady + */ + virtual void ViewFinderFrameReady( CFbsBitmap& aFrame ); + + protected: // from MVtImageScalerObserver + + /** + * @see MVtImageScalerObserver::ScalingFinished( TInt aError ) + */ + virtual void ScalingFinished( TInt aError ); + + protected: // from MCameraObserver2 + + /** + * @see MCameraObserver2::ImageBufferReady + */ + virtual void ImageBufferReady( MCameraBuffer& aCameraBuffer, + TInt aError ); + + protected: // New functions + + /** + * Inliner to return reference to the onboard camera handle. + * @return Reference to the onboard camera handle. + */ + inline CCamera& Camera() const; + + protected: // Constructors and destructor + + /** + * Constructor. + * @param "aObserver" Pointer to provider observer. + */ + CVSCameraDataProvider( + MVSDataProviderObserver* aObserver, + MVSBufferPool* aPool ); + + private: // Constructors and destructors + + /** + * 2nd phase constructor. + * @param "aProviderIndex" Index of the provider to be created. + * @exception Can leave with one of the system wide error codes. + */ + void ConstructL( TInt aProviderIndex ); + + void FreezeViewFinderFrame( CFbsBitmap& aFrame ); + + void ScaleFrozenBitmapL( TSize& aSize ); + + private: // New functions + + /** + * Return provider information. + */ + void ProviderInfoExL( TVSDataProviderInfo& aInfo ); + + private: // Functions from base classes + + public: // Data + + protected: // Data + + enum TFreezePendingFlags + { + EViewFinderFreezePending = ( 1 << 0 ), + EVideoFrameFreezePending = ( 1 << 1 ) + }; + + // Camera handle number. + TInt iCameraHandle; + + // ETrue after ReserveComplete for iCamera + TBool iReserverComplete; + + // ETrue after PowerOnComplete for iCamera + TBool iPowerOnComplete; + + // ETrue after Freeze + TBool iFrozen; + + // Contains pending freeze flags after Freeze + TUint iFreezePendingFlags; + + // has frozen viewfinder frame copy + TBool iHasFrozenVFFrameCopyCreated; + + CVsFrameBuffer* iFrozenFrame; + + RCriticalSection iFreezeCS; + + private: // Data + + // Camera handle. + CCamera* iCamera; + + // owned: Copy of frozen VF frame + CFbsBitmap* iFrozenVFFrameCopy; + + // + CVtImageBitmap* iSource; + + // owned: Scaled version of frozen VF frame (this is sent) + CFbsBitmap* iFrozenVFFrameToBeSent; + + // + CVtImageBitmap* iTarget; + + // owned: Scaler instance + CVtImageScaler* iScaler; + + // ETrue when frozen VF frame is ready to be sent EFalse otherwise + TBool iFrozenVfFrameReady; + + // Camera image processing + CCamera::CCameraImageProcessing* iCamImgProc; + + private: // friends + + // Stif test module must be set as friend to be able to call protected + // and private methods + friend class CstiffVideoSourceAPICases; + + }; + +#include "CVSCameraDataProvider.inl" + +#endif // CVSCAMERADATAPROVIDER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/inc/CVSCameraDataProvider.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/inc/CVSCameraDataProvider.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,28 @@ +/* +* 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. +* +*/ + + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::Camera +// ----------------------------------------------------------------------------- +// +inline CCamera& CVSCameraDataProvider::Camera() const + { + return *iCamera; + } + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/inc/CVSControllerImp.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/inc/CVSControllerImp.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,120 @@ +/* +* 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. +* +*/ + + +#ifndef CVSCONTROLLERIMP_H +#define CVSCONTROLLERIMP_H + +// INCLUDE FILES +#include "CApiVideoSource.h" + +// CLASS DECLARATIONS + +/** +* Internal implementation of controller. This class is inherited from +* public controller interface. +* +* @lib videosource.lib +*/ +class CVSControllerImp : public CVSController + { + public: // Constructors and destructor + + /** + * Static factory function to create controller instance. + * @exception Can leave with one of the system wide error codes. + * @return Pointer to new controller instance. + */ + static CVSControllerImp* NewL(); + + /** + * Destructor. + */ + ~CVSControllerImp(); + + public: // New functions + + public: // Functions from base classes + + /** + * Create data source instance. + * @param "aObserver" Pointer to data source observer. + * @exception Can leave with one of the system wide error codes. + * @return Pointer to new data source instance. + */ + virtual CVSDataSource* CreateDataSourceL( + MVSDataSourceObserver* aObserver ); + + /** + * Return provider count and provider index. + * @return Number of providers available. Count also acts as zero + * based provider index. + */ + virtual TInt ProvidersAvailable(); + + /** + * Return provider information. + * @param "aProviderIndex" Index of the provider to return information + * for. + * @param "aInfo" Reference to the variable where the provider + * information is copied. + * @exception Can leave with one of the system wide error codes. + */ + virtual void ProviderInfoL( + TInt aProviderIndex, + TVSDataProviderInfo& aInfo ); + + /** + * Create provider instance. + * @param "aProviderIndex" Index of the provider to be created. + * @param "aObserver" Pointer to provider observer. + * @exception Can leave with one of the system wide error codes. + * @return Pointer to new provider instance. + */ + virtual CVSDataProvider* CreateDataProviderL( + TInt aProviderIndex, + MVSDataProviderObserver* aObserver, + MVSBufferPool* aPool ); + + protected: // New functions + + protected: // Functions from base classes + + private: // Constructors and destructor + + /** + * 2nd phase constructor. + * @param "aObserver" Pointer to controller observer + * @exception Can leave with one of the system wide error codes. + */ + void ConstructL( MVSControllerObserver* aObserver ); + + private: // New functions + + private: // Functions from base classes + + public: // Data + + protected: // Data + + private: // Data + + }; + +#endif // CVSCONTROLLERIMP_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/inc/CVSDataSourceImp.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/inc/CVSDataSourceImp.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,577 @@ +/* +* 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. +* +*/ + + +#ifndef CVSDATASOURCEIMP_H +#define CVSDATASOURCEIMP_H + +// INCLUDE FILES + +#include "CApiVideoSource.h" + +// FORWARD DECLARATIONS + +class CVSDataSourceImp; +class CVSMMFDataBuffer; + +// CLASS DECLARATION + +/** +* Active Object that handles switch of active provider for data source. +* +* @lib videosource.lib +*/ +class CVSProviderSwitchAO : public CActive + { + public: // Constructors and destructor + + /** + * Leave safe static constructor. + * @param "aDataSourceImp" Pointer to VSDataSourceImp instance. + */ + static CVSProviderSwitchAO* NewL( CVSDataSourceImp* aDataSourceImp ); + + /** + * Destructor. + */ + ~CVSProviderSwitchAO(); + + public: // New functions + + /** + * Adds this instance to calling thread's active scheduler. + * @param "aEventHandler" Reference to asynchronous event handler. This + * will be given to provider that will be switched as active provider + * in SourceThreadLogon() call. + * @return Possible error code. + */ + TInt ThreadLogon( MAsyncEventHandler& aEventHandler ); + + /** + * Removes this instance from calling thread's active scheduler. + */ + void ThreadLogoff(); + + /** + * Initializes provider switch. + * @param "aNewProvider" Pointer to CVSDataProvider instance that will + * be set as active provider. + */ + void InitiateProviderSwitch( CVSDataProvider* aNewProvider ); + + /** + * Return reference to event handler. + */ + inline MAsyncEventHandler& EventHandler() { return *iEventHandler; } + + /** + * Return pointer to new provider. + */ + inline CVSDataProvider*& NewDataProvider() { return iNewProvider; } + + public: // Functions from base classes + + protected: // New functions + + protected: // Functions from base classes + + private: // New functions + + /** + * Constructor. + * @param "aDataSourceImp" Pointer to VSDataSourceImp instance. + */ + CVSProviderSwitchAO( CVSDataSourceImp* aDataSourceImp ); + + /** + * Leave safe construtor + */ + void ConstructL(); + + private: // Functions from base classes + + /** + * From CActive. See CActive for description. + */ + void RunL(); + + /** + * From CActive. See CActive for description. + */ + void DoCancel(); + + private: // New functions + + /** + * Signals this active object with given error code. + * @param "aError" Error code with which active object will be signalled. + */ + void Signal( TInt aError ); + + public: // Data + + protected: // Data + + private: // Data + + // Pointer to data source implementation. + CVSDataSourceImp* iDataSourceImp; // not owned + + // Pointer to data provider that will be switched. + CVSDataProvider* iNewProvider; // not owned + + // Id of thread whose active scheduler this instance is added into. + TThreadId iThreadId; + + // Pointer to async handler that will be given to the new provider in + // SourceThreadLogon() call. + MAsyncEventHandler* iEventHandler; // not owned + + // Critical section for switch handling + RCriticalSection iSwitchCs; + + }; + +/** +* Data source observer active object. This AO is needed because we want to +* call vsProviderSwitchDone() callback +* in correct thread context. +* +* @lib videosource.lib +*/ +class CVSDataSourceObserverAO : public CActive + { + public: // Constructors and destructor + + /** + * Constructor. + */ + CVSDataSourceObserverAO(); + + /** + * Destructor. + */ + ~CVSDataSourceObserverAO(); + + public: // New functions + + /** + * This method is called when CVSProviderSwitchAO has completed provider + * switching. + * @param "aObserver" Observer that will signalled when RunL() is called. + * @param "aOldProvider" Pointer to provider that was active before the + * provider switch was done. + */ + void vsProviderSwitchDone( + MVSDataSourceObserver& aObserver, + CVSDataProvider* aOldProvider ); + + public: // Functions from base classes + + protected: // New functions + + protected: // Functions from base classes + + private: // New functions + + private: // Functions from base classes + + /** + * From CActive. See CActive for description. + */ + void RunL(); + + /** + * From CActive. See CActive for description. + */ + void DoCancel(); + + private: // New functions + + /** + * Signals this active object with given error code. + * @param "aError" Error code with which active object will be signalled. + */ + void Signal( TInt aError ); + + public: // Data + + protected: // Data + + private: // Data + + // Data source observer pointer + MVSDataSourceObserver* iObserver; // not owned + + // Previous active provider + CVSDataProvider* iOldProvider; // not owned + + // Thread Id whose active scheduler this instance is added into + TThreadId iThreadId; + }; + + + +/** +* Internal implementation of data source. This class is inherited from +* public data source interface. Some of the implemented MVTVideoSource, +* MVTVideoInput calls are forwarded to active data provider, +* some are processed here. +* +* @lib videosource.lib +*/ +class CVSDataSourceImp : public CVSDataSource + { + public: // Constructors and destructor + + /** + * Static factory function to create instance of this class. + * @exception Can leave with one of the system wide error codes. + * @return Pointer to new instance. + */ + static CVSDataSourceImp* NewSourceL(); + + public: // New functions + + public: // Functions from base classes + + /** + * Switch active provider for source. + * @param "aNewProvider" Pointer to provider instance. + * @exception Can leave with one of the system wide error codes. + */ + void SwitchDataProviderL( CVSDataProvider* aNewProvider ); + + /** + * @see CVSDataSource::PauseSending + */ + void PauseSending(); + + /** + * @see CVSDataSource::ResumeSending + */ + void ResumeSending(); + + public: // Constructors and destructor + + /** + * Destructor. + */ + ~CVSDataSourceImp(); + + public: // Functions from base classes + + /** + * From MVTVideoSource / MDataSource. See MDataSource for description. + */ + virtual void FillBufferL( + CMMFBuffer* aBuffer, + MVTVideoSink* aConsumer, + TMediaId aMediaId ); + + /** + * From MVTVideoSource / MDataSource. See MDataSource for description. + */ + void BufferEmptiedL( CMMFBuffer* aBuffer ); + + /** + * From MVTVideoSource / MDataSource. See MDataSource for description. + */ + virtual TBool CanCreateSourceBuffer(); + + /** + * From MVTVideoSource / MDataSource. See MDataSource for description. + */ + virtual CMMFBuffer* CreateSourceBufferL( + TMediaId aMediaId, + TBool &aReference ); + + /** + * From MVTVideoSource / MDataSource. See MDataSource for description. + */ + virtual CMMFBuffer* CreateSourceBufferL( + TMediaId aMediaId, + CMMFBuffer& aSinkBuffer, + TBool &aReference ); + + /** + * From MVTVideoSource / MDataSource. See MDataSource for description. + */ + virtual TInt SourceThreadLogon( MAsyncEventHandler& aEventHandler ); + + /** + * From MVTVideoSource / MDataSource. See MDataSource for description. + */ + virtual void SourceThreadLogoff(); + + /** + * From MVTVideoSource / MDataSource. See MDataSource for description. + */ + virtual TInt SourcePrimeL(); + + /** + * From MVTVideoSource / MDataSource. See MDataSource for description. + */ + virtual TInt SourcePlayL(); + + /** + * From MVTVideoSource / MDataSource. See MDataSource for description. + */ + virtual TInt SourcePauseL(); + + /** + * From MVTVideoSource / MDataSource. See MDataSource for description. + */ + virtual TInt SourceStopL(); + + protected: // New functions + + protected: // Functions from base classes + + /** + * From MDataSource. See MDataSource for description. + */ + virtual void ConstructSourceL(const TDesC8& aInitData); + + public: // Functions from base classes + + + virtual const RArray& GetMultimediaTypesL() const; + + + + public: // Functions from base classes + + /** + * From MVTVideoInput. See MVTVideoInput for description. + */ + virtual void SetFormatL( const TDesC8& aFormat ); + + /** + * From MVTVideoInput. See MVTVideoInput for description. + */ + virtual void SetFrameRateL( TReal32 aFrameRate ); + + /** + * From MVTVideoInput. See MVTVideoInput for description. + */ + virtual void SetVideoFrameSizeL( const TSize& aSize ); + + /** + * From MVTVideoInput. See MVTVideoInput for description. + */ + virtual void GetVideoFrameSizeL( TSize& aSize ) const; + + private: // New functions + + /** + * Starts provider switching. Switching must be done in correct thread + * context. + * @param "aNewProvider" Pointer to provider that will be switched as + * active. + * @param "aEventHandler" Reference to asynchronous event handler. + * @exception Can leave with one of the system wide error codes. + */ + void DoProviderSwitchL( + CVSDataProvider* aNewProvider, + MAsyncEventHandler& aEventHandler ); + + /** + * Test if provider switch operation is ongoing. + * @return ETrue if provider switch operation was suspended because + * buffers were not free. + */ + inline TBool SwitchPending() { return iSwitchPending; }; + + /** + * Notifies provider observer about error occurred in provider switch. + * @param "aError" Standard Symbian error code + */ + void ProviderSwitchError( TInt aError ); + + private: // Constructors and destructor + + /** + * Constructor. + */ + CVSDataSourceImp(); + + private: // Functions from base classes + + /** + * From MVSBufferPool. See MVSBufferPool for description. + */ + virtual CVSMMFDataBuffer* GetBufferL( TBool aRemove ); + + /** + * From MVSBufferPool. See MVSBufferPool for description. + */ + virtual void FreeBufferL( CVSMMFDataBuffer* aBuffer ); + + private: // New functions + + /** + * Add buffer to free buffer pool without locking queue cs. + * @return One of the system wide error codes or KErrNone if no error + * happens. + * @param "aBuffer" A pointer to buffer to add to free buffer pool. + * If buffer pointer is found from active buffer pool it is first + * removed from there. + */ + TInt FreeBufferNoWait( CVSMMFDataBuffer* aBuffer ); + + public: // Data + + protected: // Data + + private: // Data + + // Data source state + enum TDataSourceState + { + EStopped, + EPrimed, + EPlaying + }; + + // Data source method call flags + enum TCallFlags + { + // SetVideoFrameSizeL() was called + ESetSizeCalled = ( 1 << 0 ), + + // SetFrameRateL() was called + ESetFrameRateCalled = ( 1 << 1 ), + + // SetFormatL() was called + ESetFormatCalled = ( 1 << 2 ) + }; + + // Data source state + TDataSourceState iDSState; + + // Call flags + TUint32 iCallFlags; + + + // Provider switch AO pointer + CVSProviderSwitchAO* iProviderSwitchAO; + + // Data source observer AO pointer + CVSDataSourceObserverAO* iDataSourceObserverAO; // owned + + // Format heap descriptor pointer + HBufC8* iFormat; // owned + + // Frame rate + TReal32 iFrameRate; + + // Frame size + TSize iSize; + + // SourceThreadLogon() called flag + TBool iThreadLogonCalled; + + // Array to return in response to GetMultimediaTypesL call + // (supported video frame formats). + RArray iProtoMimeTypes; + + // Video frame formats supported by all providers. + CDesC8Array* iSupportedVideoFormats; + + // Video frame sizes for each format supported by all providers + class TVSFrameSize + { + public: + TPtrC8 iFormat; // Primary key, 1st field + TSize iSize; + }; + RArray iSupportedVideoSizes; + + // Video frame rates for each format and frame size supported by all + // providers. + class TVSFrameRate + { + public: + TPtrC8 iFormat; // Primary key, 1st field + TSize iSize; // Primary key, 2nd field + TReal32 iRate; + }; + + RArray iSupportedFrameRates; + + private: // Data + + // Needs to be friend + friend class CVSProviderSwitchAO; + + // MIME type holder + TBuf8<128> iYuv420PlanarDesc; + + private: // Data + + // Critical section for queue handling + RCriticalSection iQueueCs; + + // Critical section for queue handling + RCriticalSection iPauseCs; + + // Queue for buffers that are free for use + RPointerArray iFreeQueue; + + // Queue for buffers that are being used by the Protocol + RPointerArray iActiveQueue; + + // All buffers allocated by CreateSourceBufferL() + RPointerArray iAllocatedBuffers; + + // Number of buffer requests by CreateSourceBufferL() + TInt iRequestedBufferCount; + + // Set to ETrue when protocol is initializing (From + // SourceThreadLogon to SourcePlayL) + TBool iProtoInitOngoing; + + // Set to ETrue if provider switch operation was suspended because + // protocol was initializing + TBool iProviderSwitchRequestDuringProtoInit; + + // Temporary save pointer, not owned + CVSDataProvider* iNewProvider; + + // Critical section for synchronizing access to + // iProviderSwitchRequestDuringProtoInit and iProtoInitOngoing + RCriticalSection iProtoInitCS; + + // Set to ETrue during DoProviderSwitchL + TBool iSwitchOngoing; + + // Set to ETrue when DoProviderSwitchL is needed + TBool iSwitchPending; + + // Set to ETrue when video sending is paused to Protocol + // Guarded by: iPauseCs + TBool iSendingPaused; + + // If true then FBS was started during SourceThreadLogon() and + // thus should be stopped in SourceThreadLogoff() + TBool iFbsStarted; + }; + +#endif // CVSDATASOURCEIMP_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/inc/CVSMMFDataBuffer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/inc/CVSMMFDataBuffer.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,239 @@ +/* +* 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. +* +*/ + + +#ifndef CVSMMFDATABUFFER_H +#define CVSMMFDATABUFFER_H + +// INCLUDE FILES + +#include + +// FORWARD DECLARATIONS + +class MFrameBuffer; +class MCameraBuffer; + +/** +* API of data buffer that allows provider's buffer contents to +* be given to consumer without copying. +* +* @lib videosource.lib +* @since 5.0 +*/ +class MVSMMFDataBuffer + { + +public: + + /** + * Sets the ECAM frame buffer. + * @param "aFrameBuffer" MFrameBuffer pointer. + */ + virtual void SetFrameBufferL( MFrameBuffer* aFrameBuffer ) = 0; + + /** + * Sets the ECAM camera buffer. + * @param "aFrameBuffer" MFrameBuffer pointer. + */ + virtual void SetFrameBufferL( MCameraBuffer* aCameraBuffer ) = 0; + + /** + * Calls Release() for MFrameBuffer and sets aFrameBuffer to NULL. + */ + virtual void ReleaseL() = 0; + + /** + * Sets start offset and length of internal iPtr variable (when + * pointing to iData). + */ + virtual void SetBufferOffset( TInt aOffset ) = 0; + + /** + * Reallocates the max size in bytes. + * @param "aMaxBufferSize" New size in bytes. + * @exception Can leave with one of the system wide error codes. + */ + virtual void ReAllocBufferL( TInt aMaxBufferSize ) = 0; + + /** + * Checks whether buffer needs reset or not. + * @return ETrue if buffer needs reset, EFalse otherwise. + */ + virtual TBool NeedsReset() const = 0; + + /** + * Sets needs reset state. + * @param aNeedsReset New reset state. + */ + virtual void SetNeedsReset( TBool aNeedsReset ) = 0; + + /** + * Resets buffer (i.e. clears data). + */ + virtual void Reset() = 0; + + }; + +/** +* Implementation of data buffer that allows provider's buffer contents to +* be given to consumer without copying. +* +* @lib videosource.lib +*/ +class CVSMMFDataBuffer : public CMMFDataBuffer, public MVSMMFDataBuffer + { + public: // new methods + + /** + * Static factory function to create instance of this class. + * @exception Can leave with one of the system wide error codes. + * @return Pointer to new instance. + */ + IMPORT_C static CVSMMFDataBuffer* NewL(); + + /** + * Static factory function to create instance of this class. + * @param "aMaxBufferSize" Buffer size + * @exception Can leave with one of the system wide error codes. + * @return Pointer to new instance. + */ + IMPORT_C static CVSMMFDataBuffer* NewL( TInt aMaxBufferSize ); + + /** + * Destructor. + */ + IMPORT_C ~CVSMMFDataBuffer(); + + public: // from CMMFDataBuffer + + /** + * @see CMMFDataBuffer::Data + */ + virtual TDes8& Data(); + + /** + * @see CMMFDataBuffer::Data + */ + virtual const TDesC8& Data() const; + + /** + * @see CMMFDataBuffer::SetStatus + */ + virtual void SetStatus( TBufferStatus aStatus ); + + /** + * @see CMMFDataBuffer::SetRequestSizeL + */ + virtual void SetRequestSizeL( TInt aSize ); + + /** + * @see CMMFDataBuffer::BufferSize + */ + virtual TUint BufferSize() const; + + /** + * @see CMMFDataBuffer::SetPosition + */ + virtual void SetPosition( TUint aPosition ); + + public: // from MVSMMFDataBuffer + + /** + * @see MVSMMFDataBuffer::SetFrameBufferL + */ + void SetFrameBufferL( MFrameBuffer* aFrameBuffer ); + + /** + * @see MVSMMFDataBuffer::SetFrameBufferL + */ + void SetFrameBufferL( MCameraBuffer* aCameraBuffer ); + + /** + * @see MVSMMFDataBuffer::ReleaseL + */ + void ReleaseL(); + + /** + * @see MVSMMFDataBuffer::SetBufferOffset + */ + void SetBufferOffset( TInt aOffset ); + + /** + * @see MVSMMFDataBuffer::ReAllocBufferL + */ + void ReAllocBufferL( TInt aMaxBufferSize ); + + /** + * @see MVSMMFDataBuffer::NeedsReset + */ + TBool NeedsReset() const; + + /** + * @see MVSMMFDataBuffer::SetNeedsReset + */ + void SetNeedsReset( TBool aNeedsReset ); + + /** + * @see MVSMMFDataBuffer::Reset + */ + void Reset(); + + + private: // Constructors and destructor + + /** + * Constructor. + */ + CVSMMFDataBuffer(); + + /** + * 2nd phase constructor. + * @param "aMaxBufferSize" Buffer size in bytes. + */ + void ConstructL( TInt aMaxBufferSize ); + + public: // Data + + protected: // Data + + private: // Data + + // Pointer to ECAM buffer + MFrameBuffer* iFrameBuffer; + + // Pointer to ECAM buffer + MCameraBuffer* iCameraBuffer; + + // Pointer to data buffer ( n/a for ECAM ) + TUint8* iData; + + // TPtr8 pointing to iData or ECAM buffer data content + TPtr8 iPtr; + + // Max buffer size ( n/a for ECAM ) + TInt iMaxBufferSize; + + // ETrue if buffers needs reset, EFalse otherwise + TBool iNeedsReset; + + // ETrue if buffer is set, EFalse otherwise + TBool iIsBufferSet; + + }; + +#endif // CVSMMFDATABUFFER_H diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/inc/CVSOnboardCameraDataProvider.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/inc/CVSOnboardCameraDataProvider.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,387 @@ +/* +* 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. +* +*/ + + +#ifndef CVSONBOARDCAMERADATAPROVIDER_H +#define CVSONBOARDCAMERADATAPROVIDER_H + +// INCLUDE FILES + +#include "CVSCameraDataProvider.h" + +// CLASS DECLARATION + +/** +* Handles provider error notification using interface to provider callback +* functions. Provider errors can occur in two threads and this class provides +* error notification in the same thread context that the provider was created. +* +* @lib videosource.lib +*/ +class CProviderErrorNotifierAO : public CActive + { + public: // New functions + + public: // Functions from base classes + + protected: // New functions + + protected: // Functions from base classes + + private: // Constructors and destructor + + /** + * Static factory function to create instance of this class. + * @exception Can leave with one of the system wide error codes. + * @return Pointer to new instance. + */ + static CProviderErrorNotifierAO* NewL(); + + /** + * Destructor. + */ + ~CProviderErrorNotifierAO(); + + private: // New functions + + /** + * Notify provider observer about error. + * @param "aObserver" Pointer to provider observer to notify. + * @param "aError" Error code. + */ + void NotifyError( MVSDataProviderObserver* aObserver, TInt aError ); + + private: // Constructors and destructor + + /** + * Constructor. + */ + CProviderErrorNotifierAO(); + + /** + * 2nd phase constructor. + * @exception Can leave with one of the system wide error codes. + */ + void ConstructL(); + + private: // Functions from base classes + + /** + * From CActive. See CActive for description. + */ + void DoCancel(); + + /** + * From CActive. See CActive for description. + */ + void RunL(); + + public: // Data + + protected: // Data + + private: // Data + + // Pointer to provider observer that will receive the error + // notification. + MVSDataProviderObserver* iObserver; + + // Error code. + TInt iError; + + // Critical section to synchronize access to this object. + RCriticalSection iCS; + + // Thread id of the thread in which this object was created. + TThreadId iThreadId; + + private: // Data + + // This class is private to CVSDataProvider. + friend class CVSDataProvider; + }; + +/** +* Makes onboard camera Reserve and PowerOn function calls synchronous. +* +* @lib videosource.lib +*/ +class CSyncCameraReserve : public CActive + { + public: // Constructors and destructor + + /** + * Static factory function to create instance of this class. + * @exception Can leave with one of the system wide error codes. + * @return Pointer to new instance. + */ + static CSyncCameraReserve* NewL(); + + public: // New functions + + /** + * Starts waiting and returns when RunL is called. + * @exception Can leave with one of the system wide error codes. + */ + void StartL(); + + private: // Constructors and destructor + + /** + * Constructor. + */ + CSyncCameraReserve(); + + private: // Functions from base classes + + /** + * From CActive. See CActive for description. + */ + void DoCancel(); + + /** + * From CActive. See CActive for description. + */ + void RunL(); + + private: // Data + + // Active scheduler loop owner. See CActiveSchedulerWait for + // description. + CActiveSchedulerWait iWait; + }; + +/** +* Internal implementation of onboard camera data provider. This +* class is inherited from onboard camera data provider base class. +* +* @lib videosource.lib +*/ +class CVSOnboardCameraDataProvider : public CVSCameraDataProvider + { + public: // Constructors and destructor + + /** + * Constructor. + * @param "aObserver" Pointer to provider observer. + * @param "aPool" Pointer to data MVSBufferPool that gives buffer to + * data provider. + */ + CVSOnboardCameraDataProvider( + MVSDataProviderObserver* aObserver, + MVSBufferPool* aPool ); + + /** + * Destructor. + */ + ~CVSOnboardCameraDataProvider(); + + public: // New functions + + public: // Functions from base classes + + protected: // New functions + + protected: // Functions from base classes + + private: // New functions + + /** + * See CVSDataProvider for description. + */ + void PrimeL(); + + private: // Functions from base classes + + /** + * See MDataSource for description. + */ + virtual void FillBufferL( + CMMFBuffer* aBuffer, + MVTVideoSink* aConsumer, + TMediaId aMediaId ); + + /** + * See MDataSource for description. + */ + virtual void BufferEmptiedL( CMMFBuffer* aBuffer ); + + /** + * See MDataSource for description. + */ + virtual TInt SourceThreadLogon( MAsyncEventHandler& aEventHandler ); + + /** + * See MDataSource for description. + */ + virtual void SourceThreadLogoff(); + + /** + * See MDataSource for description. + */ + virtual void SourcePrimeL(); + + /** + * See MDataSource for description. + */ + virtual void SourcePlayL(); + + /** + * See MDataSource for description. + */ + virtual void SourcePauseL(); + + /** + * See MDataSource for description. + */ + virtual void SourceStopL(); + + private: // Functions from base classes + + /** + * See MVTVideoInput for description. + */ + virtual void SetFormatL( const TDesC8& aFormat ); + + /** + * See MVTVideoInput for description. + */ + virtual void SetFrameRateL( TReal32 aFrameRate ); + + /** + * See MVTVideoInput for description. + */ + virtual void SetVideoFrameSizeL( const TSize& aSize ); + + /** + * See MVTVideoInput for description. + */ + virtual void GetVideoFrameSizeL( TSize& aSize ) const; + + private: // from MCameraObserver + + /** + * @see MCameraObserver::ReserveComplete + */ + virtual void ReserveComplete( TInt aError ); + + /** + * @see MCameraObserver::FrameBufferReady + */ + virtual void FrameBufferReady( MFrameBuffer* aFrameBuffer, + TInt aError ); + + private: // from MCameraObserver2 + + /** + * @see MCameraObserver2::HandleEvent + */ + virtual void HandleEvent(const TECAMEvent& aEvent); + + /** + * @see MCameraObserver2::ViewFinderReady + */ + virtual void ViewFinderReady(MCameraBuffer& aCameraBuffer,TInt aError); + + /** + * @see MCameraObserver2::VideoBufferReady + */ + virtual void VideoBufferReady(MCameraBuffer& aCameraBuffer,TInt aError); + + private: // Functions from base classes + + /** + * Get video frame size. + */ + virtual void GetVideoFrameSize( + TSize& aSize, + TInt aSizeIndex, + const TDesC8& aFormat ); + + /** + * Get video frame rate. + */ + virtual void GetVideoFrameRate( + TReal32& aRate, + TInt aRateIndex, + const TDesC8& aFormat, + const TSize& aSize ); + + void FreezeFrame( MFrameBuffer* aFrameBuffer ); + + void FreezeFrame( MCameraBuffer* aCameraBuffer ); + + public: // Data + + protected: // Data + + private: // Data + + // Onboard camera dublicate for the second thread. Owned. + CCamera* iCameraDuplicate; + + // MMF controller framwork mixin for event handling + MAsyncEventHandler* iEventHandler; + + // Enumerated values for possible states this class can have. + enum TState + { + EStopped, + EPrimed, + EPlaying + }; + + // One of the enumerated states. + TState iState; + + // ECAM frame rate index. + TInt iFrameRateIndex; + + // ECAM frame size index. + TInt iFrameSizeIndex; + + // Frame size. + TSize iFrameSize; + + // ECAM Video frame format. + CCamera::TFormat iFormat; + + // Pointer to AO that makes iCameraDuplicate.Reserve() and PowerOn() + // synchronous. Owned. These are called in SourcePrimeL and because + // it is synchronous, reserve & poweron must be too. + CSyncCameraReserve* iSyncReserve; + + // + TBool iAsynchronousReserveIssued; + + // Pointer to dublicated camera bitmap + CFbsBitmap* iDublicatedBitmap; + + // Camera lost by force indicator + TBool iCameraLost; + + private: // friends + + // Stif test module must be set as friend to be able to call protected + // and private methods + friend class CstiffVideoSourceAPICases; + + }; + +#endif // CVSONBOARDCAMERADATAPROVIDER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/inc/CVSStillImageDataProvider.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/inc/CVSStillImageDataProvider.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,532 @@ +/* +* 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. +* +*/ + + +#ifndef CVSSTILLIMTAGEDATAPROVIDER_H +#define CVSSTILLIMTAGEDATAPROVIDER_H + +// INCLUDE FILES + +#include +#include "CApiVideoSource.h" +#include "cvtimagescaler.h" +#include + +#include "cactivewait.h" +#include "mmultiframeprovider.h" + +// FORWARD DECLARATIONS + +class CImageDecoder; +class CVSStillImageDataProvider; +class CVSFrameRateTimer; +class CVtImageBitmap; +class CMultiframeProvider; + + +// CLASS DECLARATION + +/** +* Internal implementation of still image data provider. This +* class is inherited from from public provider interface. +* +* @lib videosource.lib +*/ +class CVSStillImageDataProvider : public CVSDataProvider, MMultiframeprovider + { + public: // Constructors and destructor + + /** + * Static factory function create instance of this class. + * @param "aObserver" Pointer to provider observer. + * @param "aPool" Pointer to data MVSBufferPool that gives buffer to + * data provider. + * @exception Can leave with one of the system wide error codes. + * @return Pointer to new instance. + */ + static CVSStillImageDataProvider* NewL( + MVSDataProviderObserver* aObserver, + MVSBufferPool* aPool ); + + /** + * Destructor. + */ + ~CVSStillImageDataProvider(); + + public: // New functions + + public: // Functions from base classes + + /** + * Initialize provider. + * @param "aInitParams" Reference to the initialization parameters. + * @exception Can leave with one of the system wide error codes. + */ + void InitializeL( const TDesC8& aInitParams ); + + /** + * Cancel initialization of still image provider. + */ + void CancelInitializing(); + + /** + * Return digital zoom factor. + * @return Digital zoom factor. + */ + virtual TInt DigitalZoomFactor() const; + + /** + * Set digital zoom factor. + * @param "aDigitalZoomFactor" Digital zoom factor. + * @exception Can leave with one of the system wide error codes. + */ + virtual void SetDigitalZoomFactorL( TInt aDigitalZoomFactor = 0 ); + + /** + * Start view finder bitmaps. + * @param "aSize" Size of the returned view finder bitmap. + * @exception Can leave with one of the system wide error codes. + */ + virtual void StartViewFinderBitmapsL( TSize& aSize ); + + /** + * Start view finder bitmaps. + * @param "aSize" Size of the returned view finder bitmap. + * @param "aClipRect" Required clip rectangle. + * @exception Can leave with one of the system wide error codes. + */ + virtual void StartViewFinderBitmapsL( TSize& aSize,TRect& aClipRect ); + + /** + * Stop view finder bitmaps. + */ + virtual void StopViewFinder(); + + /** + * Test if view finder is active. + * @return ETrue if view finder active. + */ + virtual TBool ViewFinderActive() const; + + /** + * Start view finder bitmaps using direct screen access. + * @param "aWs" Window server session. + * @param "aScreenDevice" Screen device. + * @param "aWindow" Displayable window. + * @param "aScreenRect" Portion of the screen to which view finder data + * is to be transferred. + * @exception Can leave with one of the system wide error codes. + */ + virtual void StartViewFinderDirectL( + RWsSession& aWs, + CWsScreenDevice& aScreenDevice, + RWindowBase& aWindow, + TRect& aScreenRect ); + + /** + * Start view finder bitmaps using direct screen access. + * @param "aWs" Window server session. + * @param "aScreenDevice" Screen device. + * @param "aWindow" Displayable window. + * @param "aScreenRect" Portion of the screen to which view finder data + * is to be transferred. + * @param "aClipRect" The rectangle to which the screen will be clipped. + * @exception Can leave with one of the system wide error codes. + */ + virtual void StartViewFinderDirectL( + RWsSession& aWs, + CWsScreenDevice& aScreenDevice, + RWindowBase& aWindow, + TRect& aScreenRect, + TRect& aClipRect ); + + /** + * Return provider information. + * @param @param "aInfo" Reference to variable to where the provider + * information is copied. + */ + virtual void ProviderInfo( TVSDataProviderInfo& aInfo ); + + /** + * See CVSDataProvider for description. + */ + virtual void SetViewFinderMirrorL( TBool aMirror ); + + /** + * See CVSDataProvider for description. + */ + virtual TBool ViewFinderMirror() const; + + /** + * See CVSDataProvider for description. + */ + virtual void FreezeL(); + + /** + * See CVSDataProvider for description. + */ + virtual void UnfreezeL(); + + /** + * See CVSDataProvider for description. + */ + virtual TBool IsFrozen() const; + + /** + * @See CVSDataProvider::SetContrastL for description. + */ + virtual void SetContrastL( TInt aContrast ); + + /** + * @See CVSDataProvider::GetContrast for description. + */ + virtual TInt GetContrast( TInt& aContrast ) const; + + /** + * @See CVSDataProvider::SetBrightnessL for description. + */ + virtual void SetBrightnessL( TInt aBrightness ); + + /** + * @See CVSDataProvider::GetBrightness for description. + */ + virtual TInt GetBrightness( TInt& aBrightness ) const; + + /** + * @See CVSDataProvider::SetWhiteBalanceL for description. + */ + virtual void SetWhiteBalanceL( + CCamera::TWhiteBalance aWhiteBalance = CCamera::EWBAuto); + + /** + * @See CVSDataProvider::GetWhiteBalance for description. + */ + virtual TInt GetWhiteBalance( + CCamera::TWhiteBalance& aWhiteBalance ) const; + + /** + * @See CVSDataProvider::GetColorTone for description. + */ + virtual TInt GetColorTone( + CCamera::CCameraImageProcessing::TEffect& aColorTone) const; + + /** + * @See CVSDataProvider::SetColorToneL for description. + */ + virtual void SetColorToneL( + CCamera::CCameraImageProcessing::TEffect aValue ); + + protected: // New functions + + protected: // Functions from base classes + + private: // New functions + + /** + * See CVSDataProvider for description. + */ + void PrimeL(); + + private: + + private: // Functions from base classes + + /** + * See MDataSource for description. + */ + virtual void FillBufferL( + CMMFBuffer* aBuffer, + MVTVideoSink* aConsumer, + TMediaId aMediaId ); + + private: + + /** + * See MDataSource for description. + */ + virtual void BufferEmptiedL( CMMFBuffer* aBuffer ); + + /** + * See MDataSource for description. + */ + virtual TInt SourceThreadLogon( MAsyncEventHandler& aEventHandler ); + + /** + * See MDataSource for description. + */ + virtual void SourceThreadLogoff(); + + /** + * See MDataSource for description. + */ + virtual void SourcePrimeL(); + + /** + * See MDataSource for description. + */ + virtual void SourcePlayL(); + + /** + * See MDataSource for description. + */ + virtual void SourcePauseL(); + + /** + * See MDataSource for description. + */ + virtual void SourceStopL(); + + private: // Functions from base classes + + /** + * See MVTVideoInput for description. + */ + virtual void SetFormatL( const TDesC8& aFormat ); + + /** + * See MVTVideoInput for description. + */ + virtual void SetFrameRateL( TReal32 aFrameRate ); + + /** + * See MVTVideoInput for description. + */ + virtual void SetVideoFrameSizeL( const TSize& aSize ); + + /** + * See MVTVideoInput for description. + */ + virtual void GetVideoFrameSizeL( TSize& aSize ) const; + + private: // New functions + + /** + * Common initialization of the provider (initializes features + * that are always needed by the provider). + * @exception Can leave with one of the system wide error codes. + */ + void CommonInitializeL(); + + /** + * Undo common initialization of still image data provider. + */ + void UndoCommonInitialized(); + + /** + * Loads image that was set in General Settings application. + * @param aType Type of of the general settings image. + * @exception Can leave with one of the system wide error codes. + */ + void GeneralSettingsInitializeL( const TGeneralSettingsImageType aType ); + + /** + * Initializes this instance as blank image instance. + * @exception Can leave with one of the system wide error codes. + */ + void BlankImageInitializeL(); + + /** + * Initializes this instance from image file. + * @param aFileName Name of the file from which this intance will be + * initialized. + * @exception Can leave with one of the system wide error codes. + */ + void FileImageInitializeL( const TFileName& aFileName ); + + /** + * View finder timer callback. This method is called when view finder + * needs updating. + */ + void VFTimer(); + + /** + * protocol timer callback. This method is called when new frame + * will be sent to consumer. + */ + void ProtoTimer(); + + /** + * Method for creating timer for protocol. This method is called + * in Proto thread context. + * @exception Can leave with one of the system wide error codes. + */ + void CreateProtoTimerL(); + + /** + * Releases protocol timer. This method is called in Protocol thread + * context. + */ + void ReleaseProtoTimer(); + + /** + * Creates YUV buffer from still image. This method is called in Protocol + * thread context. + * @exception Can leave with one of the system wide error codes. + */ + void CreateYUVDataL(); + + /** + * Release YUV buffer. This method is called in Protocol thread context. + */ + void ReleaseYUVData(); + + private: // Constructors and destructor + + /** + * Constructor. + * @param "aObserver" Pointer to provider observer. + */ + CVSStillImageDataProvider( + MVSDataProviderObserver* aObserver, + MVSBufferPool* aPool ); + + /** + * 2nd phase constructor. + * @exception Can leave with one of the system wide error codes. + */ + void ConstructL(); + + private: // Functions from base classes + + /** + * Get video frame size. + */ + virtual void GetVideoFrameSize( + TSize& aSize, + TInt aSizeIndex, + const TDesC8& aFormat ); + + /** + * Get video frame rate. + */ + virtual void GetVideoFrameRate( + TReal32& aRate, + TInt aRateIndex, + const TDesC8& aFormat, + const TSize& aSize ); + + /** + * Returns current screen display mode. + */ + TDisplayMode DisplayMode() const; + + private: + + // from MMultiframeprovider + /** + * @See MMultiframeprovider for description. + */ + virtual void InitializeReady(); + + /** + * @See MMultiframeprovider for description. + */ + virtual void RefreshYUVData( TImageShareDataBuffer& aYUVBitMap ); + + /** + * @See MMultiframeprovider for description. + */ + virtual void RefreshViewFinder( TImageShareDataBuffer& aVFBitMap ); + + /** + * @See MMultiframeprovider for description. + */ + virtual void NotifyImageHandlingError( TInt aError ); + + public: // Data + + protected: // Data + RCriticalSection iFreezeCS; + private: // Data + + // Provider state + enum TProviderState + { + EPSUninitialized, // Provider is uninitialized + EPSStopped, // Provider is initialized and stopped + EPSPrimed, // Provider is initialized and ready for playing + EPSPlaying, // Provider is playing + EPSInitializing, // Provider is initializing + EPSUndoInitializing // Provider is undoinitializing + }; + + // Provider state + TProviderState iPSState; + + // View finder state + enum TViewFinderState + { + EVFStopped, // View finder is not started + EVFPlaying // View finder started + }; + + // View finder state + TViewFinderState iVFState; + + // Source bitmap's name + TFileName iBitmapFileName; + + // Pointer to view finder timer instance + CVSFrameRateTimer* iVFTimer; // owned + + // Pointer to protocol timer instance + CVSFrameRateTimer* iProtoTimer; // owned, created in Proto thread context! + + // Target image for CVtImageScaler + CVtImageBitmap* iScaled; + CVtImageBitmap* iYUVBitMap; + + // Pointer to selected view finder image + CVtImageBitmap* iVFCurrent; + CVtImageBitmap* iVFBitmap; + + // Pointer to active waiter instance + CVSActiveWait< CVSStillImageDataProvider >* iActiveWait; // owned + + // Heap descriptor pointer that contains image as YUV + HBufC8* iYUVBuffer; // owned, created in Protocol thread context! + + // Frame counter + TUint32 iFrameCount; + + // protocol timer update rate + TInt iProtoUpdateRate; + + // Rescaling recuirement flag + TBool iVFRescalingRequired; + + // FireServer session instance + RFs iFs; + + // Current display mode + TDisplayMode iDisplayMode; + + // Viewer instance + CMultiframeProvider* iViewer; //owned + + // Traget VF size + TSize iTargetSize; + + //Record TVSStillImageDataProviderParams::iInitialize in InitializeL(), + //used in CancelInitializing call + TVSStillImageDataProviderParams::TInitialize iInitType; + + }; + +#endif // CVSSTILLIMTAGEDATAPROVIDER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/inc/VSPanic.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/inc/VSPanic.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,44 @@ +/* +* 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: Panic definitions for videosource module. +* +*/ + + +#ifndef VSPANIC_H +#define VSPANIC_H + +// INCLUDES +#include + +// CONSTANTS +_LIT( KVSPanicCategory, "VideoSource" ); + +// DATA TYPES +enum TVSPanic + { + EVSPanicSwitchAlreadyPending, // 0 + EVSPanicProviderNotSet, // 1 + EVSPanicProviderAlreadyInitialized, // 2 + EVSPanicProviderNotReady, // 3 + EVSPanicOperationNotSupported, // 4 + EVSPanicThreadOpenFailure // 5 + }; + +// FUNCTION PROTOTYPES +extern void Panic( TVSPanic aPanicCode ); + +#endif // VSPANIC_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/inc/VideoSourceUids.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/inc/VideoSourceUids.hrh Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,26 @@ +/* +* Copyright (c) 2004 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: Uid definition file for Video Source subsystem +* +*/ + + + +#ifndef __VIDEOSOURCEUIDS_HRH__ +#define __VIDEOSOURCEUIDS_HRH__ + +#define KSharedLibraryUidDefine 0x1000008D +#define KUidVideoSourceLibrary 0x101F8692 + +#endif \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/inc/cactivewait.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/inc/cactivewait.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,95 @@ +/* +* Copyright (c) 2008 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. +* +*/ + + +#ifndef C_ACTIVEWAIT_H +#define C_ACTIVEWAIT_H + +// INCLUDE FILES +#include +#include +/** +* Active waiter class for waiting any active request. When asynchronous +* request has been completed a given callback method will be called. +* +* @lib videosource.lib +*/ +template < class R > class CVSActiveWait: public CActive + { + private : + + typedef void ( R::*TVSActiveWaitCallback) ( TInt ); + + public : // Constructors and destructor + + /** + * Constructor. + * @param "aRequester" ?description + */ + inline CVSActiveWait( R* aRequester ); + + /** + * Destructor. + */ + inline ~CVSActiveWait(); + + /** + * Initializes the waiter class. + * @param "aCallback" Pointer to callback method that will be called + * when asynchronous request has been completed. + */ + inline void InitializeWaiter( TVSActiveWaitCallback aCallback ); + + /** + * Returns pointer to this active object's TRequestStatus member + * (iStatus). + * @return Pointer to this classes TRequestStatus member (iStatus). + */ + inline TRequestStatus* RequestStatus(); + + /** + * Signals waiter with given error code. + * @param aError Integer error code. + */ + inline void Signal( TInt aError ); + + private : // Functions from base classes + + /** + * From CActive. See CActive for description. + */ + inline void RunL(); + + /** + * From CActive. See CActive for description. + */ + inline void DoCancel(); + + private : // Data + + // Pointer to requester. Callback method call will be made in this + // context. + R* iRequester; // not owned + + // Pointer to callback method. + TVSActiveWaitCallback iCallback; + }; + +#include "cactivewait.inl" + +#endif // C_ACTIVEWAIT_H + \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/inc/cactivewait.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/inc/cactivewait.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,127 @@ +/* +* Copyright (c) 2008 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. +* +*/ + + +// MACROS + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// ============================ CVSActiveWait =============================== + +// ----------------------------------------------------------------------------- +// CVSActiveWait::~CVSActiveWait() +// ----------------------------------------------------------------------------- +// +template +CVSActiveWait< R >::~CVSActiveWait() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::~CVSActiveWait() >>"), RThread().Id().operator TUint())); + Cancel(); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::~CVSActiveWait() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSActiveWait::RequestStatus() +// ----------------------------------------------------------------------------- +// +template +TRequestStatus* CVSActiveWait< R >::RequestStatus() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::RequestStatus() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::RequestStatus() <<"), RThread().Id().operator TUint())); + return &iStatus; + } + +// ----------------------------------------------------------------------------- +// CVSActiveWait::Signal( TInt aError ) +// ----------------------------------------------------------------------------- +// +template +void CVSActiveWait< R >::Signal( TInt aError ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::Signal() >>"), RThread().Id().operator TUint())); + if( IsActive() ) + { + TRequestStatus* status = &iStatus; + User::RequestComplete( status, aError ); + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::Signal() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSActiveWait::RunL() +// ----------------------------------------------------------------------------- +// +template +void CVSActiveWait< R >::RunL() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::RunL() >>"), RThread().Id().operator TUint())); + (iRequester->*iCallback)( iStatus.Int() ); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::RunL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSActiveWait::DoCancel() +// ----------------------------------------------------------------------------- +// +template +void CVSActiveWait< R >::DoCancel() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::DoCancel() >>"), RThread().Id().operator TUint())); + if ( iStatus == KRequestPending ) + { + TRequestStatus* pStatus = &iStatus; + User::RequestComplete( pStatus, KErrCancel ); + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::DoCancel() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSActiveWait::CVSActiveWait( CAnimatedImageViewer* aRequester ) +// ----------------------------------------------------------------------------- +// +template < class R > +CVSActiveWait< R >::CVSActiveWait( R* aRequester ) +: CActive( EPriorityHigh ), iRequester( aRequester ) + { + __IF_DEBUG(Print(_L("CVSActiveWait::CVSActiveWait() >>"))); + CActiveScheduler::Add( this ); + __IF_DEBUG(Print(_L("CVSActiveWait::CVSActiveWait() <<"))); + } +// ----------------------------------------------------------------------------- +// CVSActiveWait::InitializeWaiter( TVSActiveWaitCallback aCallback ) +// ----------------------------------------------------------------------------- +// +template < class R > +void CVSActiveWait< R >::InitializeWaiter( TVSActiveWaitCallback aCallback ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::InitializeWaiter() >>"), RThread().Id().operator TUint())); + if ( !IsActive() ) + { + iStatus = KRequestPending; + iCallback = aCallback; + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::InitializeWaiter() SetActive"), RThread().Id().operator TUint())); + SetActive(); + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::InitializeWaiter() <<"), RThread().Id().operator TUint())); + } + + \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/inc/capivideosource.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/inc/capivideosource.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,146 @@ +/* +* 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. +* +*/ + + +/* + * CVSController +*/ + +// ----------------------------------------------------------------------------- +// CVSController::Observer +// ----------------------------------------------------------------------------- +// +inline MVSControllerObserver& CVSController::Observer() const + { + return *iObserver; + } + +/* + * CVSDataProvider +*/ + +// ----------------------------------------------------------------------------- +// CVSDataProvider::Observer +// ----------------------------------------------------------------------------- +// +inline MVSDataProviderObserver& CVSDataProvider::Observer() const + { + return *iObserver; + } + +// ----------------------------------------------------------------------------- +// CVSDataProvider::BufferPool +// ----------------------------------------------------------------------------- +// +inline MVSBufferPool& CVSDataProvider::BufferPool() const + { + return *iPool; + } + +// ----------------------------------------------------------------------------- +// CVSDataProvider::FillBufferActive +// ----------------------------------------------------------------------------- +// +inline TBool CVSDataProvider::FillBufferActive() const + { + return iFillBufferActive; + } + +// ----------------------------------------------------------------------------- +// CVSDataProvider::Consumer +// ----------------------------------------------------------------------------- +// +inline MVTVideoSink* CVSDataProvider::Consumer() const + { + return iConsumer; + } + +// ----------------------------------------------------------------------------- +// CVSDataProvider::MediaId +// ----------------------------------------------------------------------------- +// +inline TMediaId CVSDataProvider::MediaId() const + { + return iMediaId; + } + +/* + * CVSDataSource +*/ + +// ----------------------------------------------------------------------------- +// CVSDataSource::Observer +// ----------------------------------------------------------------------------- +// +inline MVSDataSourceObserver& CVSDataSource::Observer() const + { + return *iObserver; + } + +// ----------------------------------------------------------------------------- +// CVSDataSource::DataProvider +// ----------------------------------------------------------------------------- +// +inline CVSDataProvider& CVSDataSource::DataProvider() const + { + return *iProvider; + } + +// ----------------------------------------------------------------------------- +// CVSDataSource::SwitchProvider +// ----------------------------------------------------------------------------- +// +inline CVSDataProvider* CVSDataSource::SwitchProvider( + CVSDataProvider* aNewProvider ) + { + CVSDataProvider* oldProvider = iProvider; + iProvider = aNewProvider; + return oldProvider; + } + +/* + * TVSStillImageDataProviderParams + */ + +// ----------------------------------------------------------------------------- +// TVSStillImageDataProviderParams::TVSStillImageDataProviderParams +// ----------------------------------------------------------------------------- +// +TVSStillImageDataProviderParams::TVSStillImageDataProviderParams() + : iInitialize( EInitializeAsBlankImage ), iFileName( TPtrC() ) + { + } + +// ----------------------------------------------------------------------------- +// TVSStillImageDataProviderParams::TVSStillImageDataProviderParams +// ----------------------------------------------------------------------------- +// +TVSStillImageDataProviderParams::TVSStillImageDataProviderParams( + const TInitialize aInitialize ) + : iInitialize( aInitialize ), iFileName( TPtrC() ) + { + } + +// ----------------------------------------------------------------------------- +// TVSStillImageDataProviderParams::TVSStillImageDataProviderParams +// ----------------------------------------------------------------------------- +// +TVSStillImageDataProviderParams::TVSStillImageDataProviderParams( + const TFileName& aFileName ) + : iInitialize( EInitializeFromFile ), iFileName( aFileName ) + { + } diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/inc/cmultiframedataao.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/inc/cmultiframedataao.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,128 @@ +/* +* Copyright (c) 2008 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. +* +*/ + +#ifndef C_MULTIFRAMEDATAAO_H +#define C_MULTIFRAMEDATAAO_H + +// INCLUDE FILES +#include +#include "mmultiframeprovider.h" +// FORWARD DECLARATIONS +class CMultiframeProvider; + +// MACROS + +/** +* @lib videosource.lib +*/ +// ============================ CMultiframeDataAO =============================== +NONSHARABLE_CLASS( CMultiframeDataAO ) : public CTimer + { + public: // Constructors and destructor + + /** + * Constructor. + * @param "aRequester" instance to requester + */ + CMultiframeDataAO( CMultiframeProvider* aRequester ); + + /** + * Destructor. + */ + ~CMultiframeDataAO(); + + public: // New functions + + /** + * Sets observer. + * @param "aObserever" instance to observer + */ + void SetObserver( MMultiframeprovider* aObserver ); + + /** + * Activates CTimer + * @param "aUpdateTime" expiration time + */ + void Activate( TTimeIntervalMicroSeconds aUpdateTime, TBool aInit, TBool aVFUpdate ); + + /** + * Updates local buffer. + * @param "aLocalBuffer" local buffer + */ + void LocalBuffer( CVtImageBitmap* aLocalBuffer ); + + /** + * Updates remote buffer. + * @param "aRemoteBuffer" remote buffer + */ + void RemoteBuffer ( CVtImageBitmap* aRemoteBuffer ); + + /** + * Cancels looping and completes request in correct thread. + */ + void CancelTimeLoop(); + + private: // Functions from base classes + + /** + * From CActive. See CActive for description. + */ + void RunL(); + + private: // Data + + // Pointer to observer. + MMultiframeprovider* iObserver; // not owned + + // Pointer to requester + CMultiframeProvider* iRequester; + + // For updating ViewFinder buffer + TImageShareDataBuffer iLocalBuffer; + // For updating remote buffer + TImageShareDataBuffer iRemoteBuffer; + + // For updating remote buffer if activated when active + TImageShareDataBuffer iRemoteSecondBuffer; + + // For updating ViewFinder buffer if activated when active + TImageShareDataBuffer iLocalSecondBuffer; + + // Initialization flag + TBool iInit; + + // Delta calc ref point + TTimeIntervalMicroSeconds iTime; + + // VF update flag + TBool iVFUpdate; + + // Id of thread whose active scheduler this instance is added into. + TThreadId iThreadId; + + // A flag to indecate loop ao must be stopped + TBool iRequireStopping; + }; + +#endif //C_MULTIFRAMEDATAAO_H + +// End of File + + + + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/inc/cmultiframeloopao.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/inc/cmultiframeloopao.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,113 @@ +/* +* Copyright (c) 2008 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. +* +*/ + + +#ifndef C_MULTIFRAMELOOPAO_H +#define C_MULTIFRAMELOOPAO_H + +// INCLUDE FILES +#include + +// FORWARD DECLARATIONS +class CMultiframeProvider; + +// MACROS + +/** +* @lib videosource.lib +* Handles data looping in multi frame sharing case. +*/ +NONSHARABLE_CLASS( CMultiframeloopAO ) : public CActive + { + public: // Constructors and destructor + + /** + * Constructor. + * @param "aRequester" instance to requester + */ + CMultiframeloopAO( CMultiframeProvider* aRequester ); + + /** + * Destructor. + */ + ~CMultiframeloopAO(); + + /** + * Decreases number of free bitmaps + * @param "aCount" count how many bitmaps to be removed + */ + void RemoveFreeBitmaps( TInt aCount ); + + /** + * Increases number of free bitmaps + * @param "aCount" count how many bitmaps to be increased + */ + void SetFreeBitmaps( TInt aCount ); + + /** + * Cancels looping and completes request in correct thread. + */ + void CancelDataLoop(); + + public: // New functions + + /** + * Activates looping and completes request in correct thread. + */ + void Signal( ); + + /** + * Sets frame count. + * @param "aCount" frame count + */ + void SetFrameCount( TInt aCount ); + + private: // Functions from base classes + + /** + * From CActive. See CActive for description. + */ + void RunL(); + + /** + * From CActive. See CActive for description. + */ + void DoCancel(); + + private: // Data + + // Pointer to requester. + CMultiframeProvider* iRequester; // not owned + + // Index of frame to be handled + TInt iIndex; + + // Total nuber of frames + TInt iFramecount; + + // Number of free bitmaps + TInt iFreeBMCount; + + // Id of thread whose active scheduler this instance is added into. + TThreadId iThreadId; + + // A flag to indecate loop ao must be stopped + TBool iRequireStopping; + }; +#endif //C_MULTIFRAMELOOPAO_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/inc/cmultiframeprovider.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/inc/cmultiframeprovider.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,395 @@ +/* +* Copyright (c) 2008 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. +* +*/ + + +#ifndef C_MULTIFRAMEPROVIDER_H +#define C_MULTIFRAMEPROVIDER_H + +// INCLUDE FILES +#include +#include +#include "cactivewait.h" +#include "cvtimagescaler.h" +#include "mmultiframeprovider.h" + +// FORWARD DECLARATIONS + +class CVtImageBitmap; +class CImageDecoder; +class CMultiframeloopAO; +class TScalingMediator; +class CMultiframeProvider; +class CMultiframeDataAO; + +const TInt KFirstFrameIndx = 0; + +// CLASS DECLARATION +// ============================ TScalingMediator =============================== +/** +* Internal implementation of still scaling mediator +* @lib videosource.lib +*/ + +NONSHARABLE_CLASS( TScalingMediator) : public MVtImageScalerObserver + { + public : + TScalingMediator(); + public : + /** + * @see MVtImageScalerObserver::ScalingFinished( TInt aError ) + */ + void ScalingFinished( TInt aError ); + + /** + * Sets waiter observer + */ + void SetWaiter( CVSActiveWait< CMultiframeProvider >* aWait ); + private : + CVSActiveWait< CMultiframeProvider >* iWait; + }; + + +// ============================ CMultiframeProvider =============================== +/** +* Internal implementation of multiframe provider +* @lib videosource.lib +*/ +NONSHARABLE_CLASS( CMultiframeProvider ) : public CBase + { + + public : // Constructors and destructor + + /** + * Static factory function create instance of this class. + * @param "aObserver" Pointer to data provider observer. + * @param aDisplayMode current display mode + * @exception Can leave with one of the system wide error codes. + * @return Pointer to new instance. + */ + static CMultiframeProvider* NewL( MMultiframeprovider* aObserver, TDisplayMode aDisplayMode ); + + /** + * Destructor. + */ + ~CMultiframeProvider(); + + + public : // Functions from base classes + + /** + * Initializes this instance from image or multiframe file. + * @param aFileName Name of the file from which this intance will be + * initialized. + * @exception Can leave with one of the system wide error codes. + */ + void InitializeL( const TFileName* aFileName ); + + /** + * Cancel initialization of multiframe provider. + * @return ETrue if don't need to wait a error message. + */ + TBool CancelInitializing(); + + /** + * Initializes this instance for blank image bitmap. + */ + void IniatializeBlankL(); + + /** + * Initializes this instance for Generalsettings image bitmap. + */ + void IniatializeGSL( const TGeneralSettingsImageType aType ); + /** + * Sets ViewFinder size + * @param aSize size of target bitmap (view finder) + */ + void SetVFScalingTargetSize( TSize aSize ); + + /** + * Decodes and scales initialized image or multiframe file + * @param aFrameindex index of frame to be decoded and scaled + */ + void ConvertAndScaleL( TInt aFrameIndex ); + + /** + * Scales and copies decoded frame for view finder display + * @param aSize size of target bitmap ( view fiender ) + */ + void ScaleCopy( TSize& aSize, TBool aVFUpdate = EFalse ); + + /** + * Signals looping AO to proceed to next frame + */ + void NextFrame(); + + /** + * Clears ViewFinder size + */ + void ClearVFScalingTargetSize(); + + /** + * Increases number of data consumers by one + */ + void IncreaseDataConsumer(); + + /** + * Decreases number of data consumers by one + * and if number is less than one it cancels data looping + * mechanism + */ + void DecreaseDataConsumer(); + + /** + * Adds used bitmap to free queue + */ + void AddBitmapToFreeQueue(); + + /** + * Indicates that second VF buffer needs to be used + */ + void UseSecondVfBuffer(); + + /** + * Indicates that VF has been stopped + */ + TBool IsVFStopped(); + + /** + * Set ViewFinder of Multiframe provider to stop + */ + void SetVFStop(); + + /** + * Wait for converting function exit + */ + void WaitForConverting(); + + /** + * Release converting flag + */ + void ReleaseForConverting(); + + private : // Constructors and destructor + + /** + * Constructor. + * @param "aObserver" Pointer to data provider observer. + * @param aDisplayMode current display mode + */ + CMultiframeProvider( MMultiframeprovider* aObserver, TDisplayMode aDisplayMode ); + + /** + * 2nd phase constructor. + * @exception Can leave with one of the system wide error codes. + */ + void ConstructL(); + + /** + * Image conversion finished callback. This method is called when image + * conversion is done. + * @param "aError" Error code. KErrNone if no error happened, one of the + * system wide error codes. + * otherwise. + */ + void ConversionFinished( TInt aError ); + + /** + * Image scaling finished callback. This method is called when image + * scaling is done. + * @param "aError" Error code. KErrNone if no error happened, one of + * the system wide error codes. + */ + void BMSScalingFinished( TInt aError ); + + /** + * Scales VF to new size. + * @param "aSize" New VF size. + * the system wide error codes. + */ + void ScaleVF( const TSize& aSize ); + + /** + * When view finder frame must be rescaled (wanted view finder size is + * neither QCIF nor QQQCIF) this callback will be called when the + * rescaling has finished. + * @param "aError" Error code. KErrNone if no error happened, one of + * the system wide error codes. + */ + void VFRescalingFinished( TInt aError ); + + /** + * When view finder frames are rescaled this callback method will be + * called. + * @param "aError" Error code. KErrNone if no error happened, one of + * the system wide error codes. + */ + void VFScalingReady(); + + /** + * Creates blank bitmap with given size, color mode and color. + * @param "aBitmap" Bitmap pointer reference into which pointer to new + * isntance will be copied. + * @param "aSize" Size of the blank bitmap to be created. + * @param "aMode" Color mode for created bitmap. + * @param "aColor" Color of created bitmap. + * @exception Can leave with one of the system wide error codes. + */ + void CreateBlankBitmapL( CFbsBitmap*& aBitmap, const TSize& aSize, const TDisplayMode& aMode, const TRgb& aColor ); + + public : // Data + + TBool iAnimation; + + TBool iConvertAndScale; + + protected: // Data + + RCriticalSection iFreezeCS; + + private : //Data + + + // Source image for CVtImageScaler + CVtImageBitmap* iConverted; + + // Target image for CVtImageScaler + CVtImageBitmap* iScaled; + CVtImageBitmap* iBuffer1; + CVtImageBitmap* iBuffer2; + + // Pointer to remote image + CVtImageBitmap* iYUVBitMap; + + // Pointer to QCIF sized view finder image + CVtImageBitmap* iVFbitmap; + CVtImageBitmap* iFirstVfBuf; + CVtImageBitmap* iSecondVfBuf; + + // Boolean values of VF buffer validation + TBool iSecondVFBuffer; + TBool iFirstVFBuffer; + + // Pointer to bitmap loaded from GS + CVtImageBitmap* iGSBitmap; + + // Pointer to selected view finder image + CVtImageBitmap* iVFCurrent; + + // Viewer AO instance + CMultiframeloopAO* iLoopAo;// owned + + // Initalisation scaling mediator + TScalingMediator iInitMediator; + + // ViewFinder scaling scaling mediator + TScalingMediator iScalingMediator; + + // Waiter instance for initialisation + CVSActiveWait< CMultiframeProvider >* iActiveWaitInit;// owned + + // Waiter instance for scaling + CVSActiveWait< CMultiframeProvider >* iActiveWaitScale;// owned + + // Waiter instance for scaling + CVSActiveWait< CMultiframeProvider >* iActiveWaitInitScale; // owned + + // VT image scaler instance for initialisation + CVtImageScaler* iVtImageScalerInit; // owned + + // VT image scaler instance for scaling + CVtImageScaler* iVtImageScalerScale; // owned + + // Image decoder instance + CImageDecoder* iImageDecoder; // owned + + // Wanted view finder size + TSize iWantedVFSize; + + // FireServer session instance + RFs iFs; + + // Current display mode + TDisplayMode iDisplayMode; + + // Rescaling recuirement flag + TBool iVFRescalingRequired; + + // Multiframe observer instance + MMultiframeprovider* iObserver; + + // VF bitmap size + TSize iTargetSize; + + // Is blank image share + TBool iBlank; + + // Is GS image share + TBool iGSImage; + + // Is second bitmap in use + TBool iOldBM; + + // Pointer to old bitmap + CVtImageBitmap* iOldBitmap; + + // Frame count + TInt iCount; + + // Is initialization ongoing flag + TBool iInitialization; + + // Frame delay + TTimeIntervalMicroSeconds iDelay; + + // Start time for image conversion + TTime iStartTime; + + // Data timer expiration / Frame update time + TTimeIntervalMicroSeconds iFrameUpdateTime; + + // Pointer to data timer AO + CMultiframeDataAO* iDataTimer; + + // Number of data consumers + TInt iNumOfConsumers; + + // Queue for bitmaps that are free for use + RPointerArray iFreeQueue; + + // Pointer to bitmap mask + CFbsBitmap* iMask; + + // Pointer to temporary bitmap + CVtImageBitmap* iTempBM; + + TSize iVFSize; + + // Boolean value of VF buffer update + TBool iVFUpdate; + + // file handle to default VT image + RFile iDefaultImageFile; + // Boolean value of VF buffer stopping + TBool iIsVfStopped; + + // Boolean value of VF buffer stopping + TBool iWaitForConverting; + }; + +#endif // C_MULTIFRAMEPROVIDER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/inc/mmultiframeprovider.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/inc/mmultiframeprovider.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,82 @@ +/* +* Copyright (c) 2008 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. +* +*/ + + +#ifndef M_MULTIFRAMEPROVIDER_H +#define M_MULTIFRAMEPROVIDER_H + +// INCLUDE FILES +#include + +// FORWARD DECLARATIONS +class CVtImageBitmap; + +// ============================ TImageShareDataBuffer =============================== +/** +* Share buffer class +* @lib videosource.lib +*/ +NONSHARABLE_CLASS( TImageShareDataBuffer) + { + public : + CVtImageBitmap* iBitmap; + TBool iIsBitmapFree; + }; + + // General Settings image type + enum TGeneralSettingsImageType + { + EGSStillImage, + EGSDefaultStillImage + }; + +// ============================ MMultiframeprovider =============================== +/** +* Multiframe observer API +* Interface for receiving data and acknowledgements from multiframe provider. +* @lib videosource.lib +*/ +class MMultiframeprovider + { + public: + /** + * Indicates when initialization of multiframeprovider has finished + */ + virtual void InitializeReady() = 0; + + /** + * Refresh YUV data + * @param "aYUVBitMap" reference new YUV data. + */ + virtual void RefreshYUVData( TImageShareDataBuffer& aYUVBitMap ) = 0; + + /** + * Refresh VF data + * @param "aVFBitMap" reference new VF data. + */ + virtual void RefreshViewFinder( TImageShareDataBuffer& aVFBitMap ) = 0; + + /** + * Notifies if error occures in multiframeprovider + * @param "aError" symbian wide error code. + */ + virtual void NotifyImageHandlingError( TInt aError ) = 0; + + }; +#endif //M_MULTIFRAMEPROVIDER_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/rom/VideoSource.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/rom/VideoSource.iby Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2002 - 2007 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: +* IBY file for VideoSource +* +* +*/ + + +#ifndef __VIDEOSOURCE_IBY__ +#define __VIDEOSOURCE_IBY__ + +#ifdef __CS_VIDEO_TELEPHONY + +file=ABI_DIR\BUILD_DIR\VideoSource.dll SHARED_LIB_DIR\VideoSource.dll + +// Enabler for eclipsing ROM binary +data=ZSYSTEM\install\videosource_stub.sis system\install\videosource_stub.sis + +#endif + +#endif diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/src/CVSCameraDataProvider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/src/CVSCameraDataProvider.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,864 @@ +/* +* 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 "CVSCameraDataProvider.h" +#include "CVSOnboardCameraDataProvider.h" +#include "VSPanic.h" + +// EXTERNAL FUNCTION PROTOTYPES + +// MACROS + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// LOCAL CONSTANTS AND MACROS + +static const TInt KQcifWidth = 176; +static const TInt KQcifHeight = 144; +static const TReal32 KFrameRate = 15.0; +static const TInt KFrozenFrameBufferSize = ( KQcifWidth * KQcifHeight ) + ( KQcifWidth * KQcifHeight ) / 2; +static const TInt KCCameraPriority = 80; + +// ============================ MEMBER FUNCTIONS =============================== + +// ============================= CVsFrameBuffer ================================ + +// ----------------------------------------------------------------------------- +// CVsFrameBuffer::NewL( TInt aSize ) +// ----------------------------------------------------------------------------- +// +EXPORT_C CVsFrameBuffer* CVsFrameBuffer::NewL( TInt aSize ) + { + CVsFrameBuffer* self = new ( ELeave ) CVsFrameBuffer(); + CleanupStack::PushL( self ); + self->ConstructL( aSize ); + CleanupStack::Pop(); // self + return self; + } + +// ----------------------------------------------------------------------------- +// CVsFrameBuffer::~CVsFrameBuffer() +// ----------------------------------------------------------------------------- +// +EXPORT_C CVsFrameBuffer::~CVsFrameBuffer() + { + delete iBuffer; + } + +// ----------------------------------------------------------------------------- +// CVsFrameBuffer::CopyProperties( MFrameBuffer* aSource ) +// ----------------------------------------------------------------------------- +// +void CVsFrameBuffer::CopyProperties( MFrameBuffer* aSource ) + { + MFrameBuffer::iIndexOfFirstFrameInBuffer = aSource->iIndexOfFirstFrameInBuffer; + MFrameBuffer::iElapsedTime = aSource->iElapsedTime; + } + +// ----------------------------------------------------------------------------- +// CVsFrameBuffer::CopyProperties( MCameraBuffer* aSource ) +// ----------------------------------------------------------------------------- +// +void CVsFrameBuffer::CopyProperties( MCameraBuffer* aSource ) + { + MCameraBuffer::iIndexOfFirstFrameInBuffer = aSource->iIndexOfFirstFrameInBuffer; + MCameraBuffer::iElapsedTime = aSource->iElapsedTime; + } + +// ----------------------------------------------------------------------------- +// CVsFrameBuffer::CopyFrameL( MFrameBuffer* aSource ) +// ----------------------------------------------------------------------------- +// +void CVsFrameBuffer::CopyFrameL( MFrameBuffer* aSource ) + { + iPtr = *( aSource->DataL( 0 ) ); + CopyProperties( aSource ); + } + +// ----------------------------------------------------------------------------- +// CVsFrameBuffer::CopyFrameL( MCameraBuffer* aSource ) +// ----------------------------------------------------------------------------- +// +void CVsFrameBuffer::CopyFrameL( MCameraBuffer* aSource ) + { + iPtr = *( aSource->DataL( 0 ) ); + CopyProperties( aSource ); + } + +// ----------------------------------------------------------------------------- +// CVsFrameBuffer::DataL( TInt aIndex ) +// ----------------------------------------------------------------------------- +// +TDesC8* CVsFrameBuffer::DataL( TInt aIndex ) + { + if( aIndex != 0 ) + { + User::Leave( KErrNotSupported ); + } + + return &iPtr; + } + +// ----------------------------------------------------------------------------- +// CVsFrameBuffer::FrameL( TInt aIndex ) +// ----------------------------------------------------------------------------- +// +CFbsBitmap* CVsFrameBuffer::FrameL( TInt aIndex ) + { + ( void ) aIndex; + User::Leave( KErrNotSupported ); + return 0; + } + +// ----------------------------------------------------------------------------- +// CVsFrameBuffer::Release() +// ----------------------------------------------------------------------------- +// +void CVsFrameBuffer::Release() + { + // Nothing to do + } + +// ----------------------------------------------------------------------------- +// CVsFrameBuffer::FrameSize() +// ----------------------------------------------------------------------------- +// +TInt CVsFrameBuffer::FrameSize( TInt /*aFrameIndex*/ ) + { + return KErrNotSupported; + } +// ----------------------------------------------------------------------------- +// CVsFrameBuffer::ChunkOffsetL() +// ----------------------------------------------------------------------------- +// +TInt CVsFrameBuffer::ChunkOffsetL( TInt /*aFrameIndex*/ ) + { + User::Leave( KErrNotSupported ); + return KErrNotSupported; + } +// ----------------------------------------------------------------------------- +// CVsFrameBuffer::ChunkL() +// ----------------------------------------------------------------------------- +// +RChunk& CVsFrameBuffer::ChunkL() + { + User::Leave( KErrNotSupported ); + RChunk* help = NULL; + return *help; + } +// ----------------------------------------------------------------------------- +// CVsFrameBuffer::BitmapL() +// ----------------------------------------------------------------------------- +// +CFbsBitmap& CVsFrameBuffer::BitmapL(TInt /*aFrameIndex*/ ) + { + CFbsBitmap* helpbit = new (ELeave) CFbsBitmap; + CleanupStack::PushL( helpbit ); + User::Leave( KErrNotSupported ); + CleanupStack::Pop( helpbit ); + delete helpbit; + return *helpbit; + } + +// ----------------------------------------------------------------------------- +// CVsFrameBuffer::NumFrames() +// ----------------------------------------------------------------------------- +// +TInt CVsFrameBuffer::NumFrames() + { + return KErrNotSupported; + } +// ----------------------------------------------------------------------------- +// CVsFrameBuffer::CVsFrameBuffer() +// ----------------------------------------------------------------------------- +// +CVsFrameBuffer::CVsFrameBuffer() +: iPtr( 0, 0 ) + { + } + +// ----------------------------------------------------------------------------- +// CVsFrameBuffer::ConstructL( TInt aSize ) +// ----------------------------------------------------------------------------- +// +void CVsFrameBuffer::ConstructL( TInt aSize ) + { + iBuffer = HBufC8::NewL( aSize ); + iPtr.Set( iBuffer->Des() ); + } + +// ========================= CVSCameraDataProvider ============================= + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::NewL +// ----------------------------------------------------------------------------- +// +CVSCameraDataProvider* CVSCameraDataProvider::NewL( + MVSDataProviderObserver* aObserver, + TInt aProviderIndex, + MVSBufferPool* aPool ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::NewL() >>"), RThread().Id().operator TUint())); + CVSCameraDataProvider* self = + new (ELeave) CVSOnboardCameraDataProvider( aObserver, aPool ); + CleanupStack::PushL( self ); + self->ConstructL( aProviderIndex ); + CleanupStack::Pop( self ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::NewL() <<"), RThread().Id().operator TUint())); + return self; + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::~CVSCameraDataProvider +// ----------------------------------------------------------------------------- +// +CVSCameraDataProvider::~CVSCameraDataProvider() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::~CVSCameraDataProvider() >>"), RThread().Id().operator TUint())); + delete iFrozenFrame; + delete iFrozenVFFrameCopy; + delete iSource; + delete iFrozenVFFrameToBeSent; + delete iTarget; + delete iScaler; + delete iCamImgProc; + if ( &Camera() != NULL ) + { + Camera().Release(); + } + delete iCamera; + iFreezeCS.Close(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::~CVSCameraDataProvider() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::InitializeL +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::InitializeL( const TDesC8& /*aInitParams*/ ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::InitializeL() >>"), RThread().Id().operator TUint())); + Camera().Reserve(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::InitializeL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::DigitalZoomFactor +// ----------------------------------------------------------------------------- +// +TInt CVSCameraDataProvider::DigitalZoomFactor() const + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::DigitalZoomFactor() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::DigitalZoomFactor() <<"), RThread().Id().operator TUint())); + return Camera().DigitalZoomFactor(); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::SetDigitalZoomFactorL +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::SetDigitalZoomFactorL( TInt aDigitalZoomFactor) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetDigitalZoomFactorL() >>"), RThread().Id().operator TUint())); + Camera().SetDigitalZoomFactorL( aDigitalZoomFactor ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetDigitalZoomFactorL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::StartViewFinderBitmapsL +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::StartViewFinderBitmapsL( TSize& aSize ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::StartViewFinderBitmapsL() >>"), RThread().Id().operator TUint())); + TCameraInfo info; + Camera().CameraInfo( info ); + if ( !(info.iOptionsSupported & TCameraInfo::EViewFinderBitmapsSupported) ) + { + User::Leave( KErrNotSupported ); + } + if( IsFrozen()&& iHasFrozenVFFrameCopyCreated ) + { + ScaleFrozenBitmapL( aSize ); + } + Camera().StartViewFinderBitmapsL( aSize ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::StartViewFinderBitmapsL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::StartViewFinderBitmapsL +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::StartViewFinderBitmapsL( TSize&, TRect& ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::StartViewFinderBitmapsL() >>"), RThread().Id().operator TUint())); + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::StopViewFinder +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::StopViewFinder() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::StopViewFinder() >>"), RThread().Id().operator TUint())); + Camera().StopViewFinder(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::StopViewFinder() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::ViewFinderActive +// ----------------------------------------------------------------------------- +// +TBool CVSCameraDataProvider::ViewFinderActive() const + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ViewFinderActive() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ViewFinderActive() <<"), RThread().Id().operator TUint())); + return Camera().ViewFinderActive(); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::StartViewFinderDirectL +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::StartViewFinderDirectL( RWsSession&, + CWsScreenDevice&, RWindowBase&, TRect& ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::StartViewFinderDirectL() >>"), RThread().Id().operator TUint())); + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::StartViewFinderDirectL +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::StartViewFinderDirectL( RWsSession&, + CWsScreenDevice&, RWindowBase&, TRect&, TRect& ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::StartViewFinderDirectL() >>"), RThread().Id().operator TUint())); + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::ProviderInfo +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::ProviderInfo( TVSDataProviderInfo& aInfo ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ProviderInfo() >>"), RThread().Id().operator TUint())); + Camera().CameraInfo( static_cast< TCameraInfo& >( aInfo ) ); + aInfo.iFreezeSupported = ETrue; + TRAP_IGNORE( ProviderInfoExL( aInfo ) ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ProviderInfo() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::SetViewFinderMirrorL +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::SetViewFinderMirrorL( TBool aMirror ) + { + Camera().SetViewFinderMirrorL( aMirror ); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::ViewFinderMirror +// ----------------------------------------------------------------------------- +// +TBool CVSCameraDataProvider::ViewFinderMirror() const + { + return Camera().ViewFinderMirror(); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::FreezeL +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::FreezeL() + { + iFreezeCS.Wait(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::FreezeL() >>"), RThread().Id().operator TUint())); + if( !IsFrozen() ) + { + iFrozen = ETrue; + iFrozenVfFrameReady = EFalse; + iFreezePendingFlags = EViewFinderFreezePending | EVideoFrameFreezePending; + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::FreezeL() <<"), RThread().Id().operator TUint())); + iFreezeCS.Signal(); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::UnfreezeL +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::UnfreezeL() + { + iFreezeCS.Wait(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::UnfreezeL() >>"), RThread().Id().operator TUint())); + if( IsFrozen() ) + { + iFrozen = EFalse; + iFreezePendingFlags = 0; + iHasFrozenVFFrameCopyCreated = EFalse; + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::UnfreezeL() <<"), RThread().Id().operator TUint())); + iFreezeCS.Signal(); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::IsFrozen +// ----------------------------------------------------------------------------- +// +TBool CVSCameraDataProvider::IsFrozen() const + { + return iFrozen; + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::ImageReady +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::ImageReady( + CFbsBitmap* /*aBitmap*/, HBufC8* /*aData*/, TInt /*aError*/ ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ImageReady() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ImageReady() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::PowerOnComplete +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::PowerOnComplete( TInt aError ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::PowerOnComplete() >>"), RThread().Id().operator TUint())); + if ( !iPowerOnComplete ) + { + if ( aError == KErrNone ) + { + iPowerOnComplete = ETrue; + iCameraHandle = Camera().Handle(); + // Setup ECAM so that the returned image is ok even if view finder + // is asked before video + TCameraInfo info; + Camera().CameraInfo( info ); + if ( !(info.iOptionsSupported & + TCameraInfo::EViewFinderBitmapsSupported) ) + { + NotifyError( KErrNotSupported ); + return; // End debug print is missed + } + TInt sizeIndex, rateIndex; + sizeIndex = rateIndex = 0; + for ( + sizeIndex = 0; + sizeIndex < info.iNumVideoFrameSizesSupported; + sizeIndex++ ) + { + TSize size; + Camera().EnumerateVideoFrameSizes( + size, + sizeIndex, + CCamera::EFormatYUV420Planar ); + if ( size == TSize( KQcifWidth, KQcifHeight ) ) + { + TReal32 rate; + for ( + rateIndex = 0; + rateIndex < info.iNumVideoFrameRatesSupported; + rateIndex++ ) + { + Camera().EnumerateVideoFrameRates( + rate, + rateIndex, + CCamera::EFormatYUV420Planar, + sizeIndex ); + if ( KFrameRate == rate ) + { + TRAPD( + err, + Camera().PrepareVideoCaptureL( + CCamera::EFormatYUV420Planar, + sizeIndex, + rateIndex, + 2, + 1) ); + if ( err != KErrNone ) + { + NotifyError( err ); + return; // End debug print is missed + } + break; + } + } + break; + } + } + Observer().vsProviderReady(); + } + else + { + NotifyError( aError ); + } + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::PowerOnComplete() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::ViewFinderFrameReady +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::ViewFinderFrameReady( CFbsBitmap& aFrame ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ViewFinderFrameReady() >>"), RThread().Id().operator TUint())); + if( iFreezePendingFlags & EViewFinderFreezePending ) + { + FreezeViewFinderFrame( aFrame ); + } + if( IsFrozen() && !( iFreezePendingFlags & EViewFinderFreezePending ) && iFrozenVfFrameReady ) + { + Observer().vsViewFinderFrameReady( *iFrozenVFFrameToBeSent ); + } + else if( !IsFrozen() ) + { + Observer().vsViewFinderFrameReady( aFrame ); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ViewFinderFrameReady() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::ImageBufferReady +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::ImageBufferReady(MCameraBuffer& /*aCameraBuffer*/,TInt /*aError*/) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ImageBufferReady() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ImageBufferReady() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::ScalingFinished +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::ScalingFinished( TInt aError ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ScalingFinished() >>"), RThread().Id().operator TUint())); + if( aError == KErrNone ) + { + iFrozenVfFrameReady = ETrue; + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ScalingFinished() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::CVSCameraDataProvider +// ----------------------------------------------------------------------------- +// +CVSCameraDataProvider::CVSCameraDataProvider( + MVSDataProviderObserver* aObserver, + MVSBufferPool* aPool ) : + CVSDataProvider( aObserver, aPool ) + { + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::ConstructL +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::ConstructL( TInt aProviderIndex ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ConstructL() >>"), RThread().Id().operator TUint())); + CVSDataProvider::ConstructL(); + // New CCamera API imp + // Check which API is suported + TRAPD( error, iCamera = + CCamera::New2L( *this, aProviderIndex, KCCameraPriority ) ); + // try to create using API + if ( error ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ConstructL() New2L failed, using NewL instead"), RThread().Id().operator TUint())); + iCamera = CCamera::NewL( *this, aProviderIndex ); + } + iFrozenVFFrameCopy = new ( ELeave ) CFbsBitmap(); + iFrozenVFFrameToBeSent = new ( ELeave ) CFbsBitmap(); + iScaler = CVtImageScaler::NewL( *this ); + iFrozenFrame = CVsFrameBuffer::NewL( KFrozenFrameBufferSize ); + + iHasFrozenVFFrameCopyCreated = EFalse; + + // Camera image processing + TRAP( error, iCamImgProc = + CCamera::CCameraImageProcessing::NewL( *iCamera ) ); + User::LeaveIfError( iFreezeCS.CreateLocal() ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ConstructL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::FreezeViewFinderFrame +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::FreezeViewFinderFrame( CFbsBitmap& aFrame ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::FreezeViewFinderFrame() >>"), RThread().Id().operator TUint())); + + TSize frameSize( aFrame.SizeInPixels() ); + + TUint scanlineLength( CFbsBitmap::ScanLineLength( frameSize.iWidth, aFrame.DisplayMode() ) ); + + TInt result = iFrozenVFFrameCopy->Create( frameSize, aFrame.DisplayMode() ); + + if( result != KErrNone ) + { + Observer().vsProviderError( result ); + return; + } + + iFrozenVFFrameCopy->LockHeap(); + const TUint8* source = reinterpret_cast< TUint8* >( aFrame.DataAddress() ); + TUint8* dest = reinterpret_cast< TUint8* >( iFrozenVFFrameCopy->DataAddress() ); + for( TInt y = frameSize.iHeight - 1; y >= 0; y-- ) + { + Mem::Copy( dest, source, scanlineLength ); + dest += scanlineLength; + source += scanlineLength; + } + iFrozenVFFrameCopy->UnlockHeap(); + TRAP( result, ScaleFrozenBitmapL( frameSize ) ); + iFreezePendingFlags &= ~EViewFinderFreezePending; + iHasFrozenVFFrameCopyCreated = ETrue; + if( result != KErrNone ) + { + Observer().vsProviderError( result ); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::FreezeViewFinderFrame() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::ScaleFrozenBitmapL +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::ScaleFrozenBitmapL( TSize& aSize ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ScaleFrozenBitmapL() >>"), RThread().Id().operator TUint())); + iFrozenVfFrameReady = EFalse; + delete iSource; iSource = 0; + iSource = CVtImageBitmap::NewL( iFrozenVFFrameCopy->Handle() ); + User::LeaveIfError( iFrozenVFFrameToBeSent->Create( aSize, iFrozenVFFrameCopy->DisplayMode() ) ); + delete iTarget; iTarget = 0; + iTarget = CVtImageBitmap::NewL( iFrozenVFFrameToBeSent->Handle() ); + iScaler->Cancel(); + iScaler->ScaleL( *iSource, *iTarget ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ScaleFrozenBitmapL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::ProviderInfoExL +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::ProviderInfoExL( TVSDataProviderInfo& aInfo ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ProviderInfoExL() >>"), RThread().Id().operator TUint())); + aInfo.iSupportedColorTones = CCamera::CCameraImageProcessing::EEffectNone; + // Check if colortone is suported and set colortone values + if ( iCamImgProc ) + { + RArray< TUid > uids; + CleanupClosePushL( uids ); + iCamImgProc->GetSupportedTransformationsL( uids ); + if ( uids.Find( KUidECamEventImageProcessingEffect ) != KErrNotFound ) + { + TValueInfo type; + RArray< TInt > values; + CleanupClosePushL( values ); + iCamImgProc->GetTransformationSupportedValuesL( + KUidECamEventImageProcessingEffect, values, type ); + if ( ( type == EBitField ) && ( values.Count() > 0 ) ) + { + aInfo.iSupportedColorTones = values[ 0 ]; + } + else + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ProviderInfoExL() valueType is NOT bitfield, fix me"), RThread().Id().operator TUint())); + } + CleanupStack::PopAndDestroy(); // values.Close() + } + else + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ProviderInfoExL() camera image processing not supported"), RThread().Id().operator TUint())); + } + CleanupStack::PopAndDestroy(); // uids.Close() + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ProviderInfoExL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::SetContrastL +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::SetContrastL( TInt aContrast ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetContrastL() >>"), RThread().Id().operator TUint())); + Camera().SetContrastL(aContrast); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetContrastL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::GetContrast +// ----------------------------------------------------------------------------- +// +TInt CVSCameraDataProvider::GetContrast( TInt& aContrast ) const + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetContrast() >>"), RThread().Id().operator TUint())); + TInt result( KErrNotSupported ); + TCameraInfo info; + Camera().CameraInfo( info ); + if ( info.iOptionsSupported & TCameraInfo::EContrastSupported ) + { + aContrast = Camera().Contrast(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetContrast() %d"), RThread().Id().operator TUint(), aContrast)); + result = KErrNone; + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetContrast() <<"), RThread().Id().operator TUint())); + return result; + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::SetBrightnessL +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::SetBrightnessL( TInt aBrightness ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetBrightnessL() >>"), RThread().Id().operator TUint())); + Camera().SetBrightnessL( aBrightness ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetBrightnessL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::GetBrightness +// ----------------------------------------------------------------------------- +// +TInt CVSCameraDataProvider::GetBrightness( TInt& aBrightness ) const + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetBrightness() >>"), RThread().Id().operator TUint())); + TInt result( KErrNotSupported ); + TCameraInfo info; + Camera().CameraInfo( info ); + if ( info.iOptionsSupported & TCameraInfo::EBrightnessSupported ) + { + aBrightness = Camera().Brightness(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetBrightness() %d"), aBrightness)); + result = KErrNone; + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetBrightness() <<"), RThread().Id().operator TUint())); + return result; + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::SetWhiteBalanceL +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::SetWhiteBalanceL( CCamera::TWhiteBalance + aWhiteBalance ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetWhiteBalanceL() >>"), RThread().Id().operator TUint())); + Camera().SetWhiteBalanceL( aWhiteBalance ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetWhiteBalanceL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::GetWhiteBalance +// ----------------------------------------------------------------------------- +// +TInt CVSCameraDataProvider::GetWhiteBalance( CCamera::TWhiteBalance& + aWhiteBalance) const + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetWhiteBalance() >>"),RThread().Id().operator TUint() ) ); + aWhiteBalance = Camera().WhiteBalance(); + __IF_DEBUG(Print(_L("WhiteBalance[%d]: CVSCameraDataProvider::GetWhiteBalance() %d"), aWhiteBalance ) ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetWhiteBalance() <<"), RThread().Id().operator TUint() ) ); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::SetColorToneL +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::SetColorToneL( + CCamera::CCameraImageProcessing::TEffect aValue ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetColorToneL() >>"), RThread().Id().operator TUint())); + if ( iCamImgProc ) + { + iCamImgProc->SetTransformationValue( KUidECamEventImageProcessingEffect, aValue ); + } + else + { + //Set colortone that is not suported -> Leave + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetColorToneL() LEAVE"), RThread().Id().operator TUint())); + User::Leave( KErrNotSupported ); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetColorToneL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::GetColorTone +// ----------------------------------------------------------------------------- +// +TInt CVSCameraDataProvider::GetColorTone( + CCamera::CCameraImageProcessing::TEffect& aColorTone ) const + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetColorTone() >>"), RThread().Id().operator TUint())); + TInt result( KErrNotSupported ); + if ( iCamImgProc ) + { + aColorTone = + static_cast< CCamera::CCameraImageProcessing::TEffect >( + iCamImgProc->TransformationValue( + KUidECamEventImageProcessingEffect ) ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetColorTone() %d"), RThread().Id().operator TUint(), aColorTone)); + result = KErrNone; + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetColorTone() <<"), RThread().Id().operator TUint())); + return result; + } + +// ----------------------------------------------------------------------------- +// CVSCameraDataProvider::CancelInitializing +// ----------------------------------------------------------------------------- +// +void CVSCameraDataProvider::CancelInitializing() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::CancelInitializing() >>"), RThread().Id().operator TUint())); + //There is a blank implemention. + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::CancelInitializing() <<"), RThread().Id().operator TUint())); + return; + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/src/CVSController.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/src/CVSController.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,34 @@ +/* +* 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 "CApiVideoSource.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVSController::CVSController() +// ----------------------------------------------------------------------------- +// +CVSController::CVSController() + { + } + +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/src/CVSControllerImp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/src/CVSControllerImp.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,168 @@ +/* +* 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 "CVSControllerImp.h" +#include "VSPanic.h" + +// MACROS + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// FORWARD DECLARATIONS + +// ============================= LOCAL FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// Panics current thread. +// ----------------------------------------------------------------------------- +// +void Panic( TVSPanic aPanicCode ) + { + User::Panic( KVSPanicCategory(), aPanicCode ); + } + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVSController::NewL +// ----------------------------------------------------------------------------- +// +EXPORT_C CVSController* CVSController::NewL( MVSControllerObserver* aObserver ) + { + __IF_DEBUG(Print(_L("VideoSource: CVSController::NewL() entering"))); + if ( aObserver == NULL ) + { + User::Leave( KErrArgument ); + } + CVSController* self = CVSControllerImp::NewL(); + CleanupStack::PushL( self ); + self->ConstructL( aObserver ); + CleanupStack::Pop( self ); + __IF_DEBUG(Print(_L("VideoSource: CVSController::NewL() returning"))); + return self; + } + +// ----------------------------------------------------------------------------- +// CVSControllerImp::ConstructL +// ----------------------------------------------------------------------------- +// +void CVSControllerImp::ConstructL( MVSControllerObserver* aObserver ) + { + __IF_DEBUG(Print(_L("VideoSource: CVSControllerImp::ConstructL() entering"))); + iObserver = aObserver; + __IF_DEBUG(Print(_L("VideoSource: CVSControllerImp::ConstructL() returning"))); + } + +// ----------------------------------------------------------------------------- +// CVSControllerImp::NewL +// ----------------------------------------------------------------------------- +// +CVSControllerImp* CVSControllerImp::NewL() + { + __IF_DEBUG(Print(_L("VideoSource: CVSControllerImp::NewL() entering"))); + CVSControllerImp* self = new (ELeave) CVSControllerImp; + __IF_DEBUG(Print(_L("VideoSource: CVSControllerImp::NewL() returning"))); + return self; + } + +// ----------------------------------------------------------------------------- +// CVSControllerImp::~CVSControllerImp +// ----------------------------------------------------------------------------- +// +CVSControllerImp::~CVSControllerImp() + { + __IF_DEBUG(Print(_L("VideoSource: CVSControllerImp::~CVSControllerImp() entering"))); + __IF_DEBUG(Print(_L("VideoSource: CVSControllerImp::~CVSControllerImp() returning"))); + } + +// ----------------------------------------------------------------------------- +// CVSControllerImp::CreateDataSourceL +// ----------------------------------------------------------------------------- +// +CVSDataSource* CVSControllerImp::CreateDataSourceL( MVSDataSourceObserver* aObserver ) + { + __IF_DEBUG(Print(_L("VideoSource: CVSControllerImp::CreateDataSourceL() entering"))); + CVSDataSource* p = CVSDataSource::NewSourceL( aObserver ); + __IF_DEBUG(Print(_L("VideoSource: CVSControllerImp::CreateDataSourceL() returning"))); + return p; + } + +// ----------------------------------------------------------------------------- +// CVSControllerImp::ProvidersAvailable +// ----------------------------------------------------------------------------- +// +TInt CVSControllerImp::ProvidersAvailable() + { + __IF_DEBUG(Print(_L("VideoSource: CVSControllerImp::ProvidersAvailable() entering"))); + TInt count = CVSDataProvider::ProvidersAvailable(); + __IF_DEBUG(Print(_L("VideoSource: CVSControllerImp::ProvidersAvailable() returning"))); + return count; + } + +// ----------------------------------------------------------------------------- +// CVSControllerImp::ProviderInfoL +// ----------------------------------------------------------------------------- +// +void CVSControllerImp::ProviderInfoL( + TInt aProviderIndex, + TVSDataProviderInfo& aInfo ) + { + __IF_DEBUG(Print(_L("VideoSource: CVSControllerImp::ProviderInfo() entering"))); + if (aProviderIndex >= ProvidersAvailable() || aProviderIndex < 0) + { + User::Leave( KErrNotSupported ); + } + CVSDataProvider::ProviderInfoL( aProviderIndex, aInfo ); + __IF_DEBUG(Print(_L("VideoSource: CVSControllerImp::ProviderInfo() returning"))); + } + +// ----------------------------------------------------------------------------- +// CVSControllerImp::CreateDataProviderL +// ----------------------------------------------------------------------------- +// +CVSDataProvider* CVSControllerImp::CreateDataProviderL( + TInt aProviderIndex, + MVSDataProviderObserver* aObserver, + MVSBufferPool* aPool ) + { + __IF_DEBUG(Print(_L("VideoSource: CVSControllerImp::CreateDataProviderL() entering"))); + if (aProviderIndex >= ProvidersAvailable() || aProviderIndex < 0) + { + User::Leave( KErrArgument ); + } + if ( aObserver == NULL ) + { + User::Leave( KErrArgument ); + } + CVSDataProvider* p = + CVSDataProvider::NewL( aProviderIndex, aObserver, aPool ); + __IF_DEBUG(Print(_L("VideoSource: CVSControllerImp::CreateDataProviderL() returning"))); + return p; + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/src/CVSDataProvider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/src/CVSDataProvider.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,547 @@ +/* +* 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())); + CleanupClosePushL( aSupportedSizes ); + 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 + CleanupStack::Pop(); // aSupportedSizes + __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())); + CleanupClosePushL( aSupportedRates ); + 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 + CleanupStack::Pop(); // aSupportedRates + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::EnumerateVideoFrameRates() <<"), RThread().Id().operator TUint())); + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/src/CVSDataSourceImp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/src/CVSDataSourceImp.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,1315 @@ +/* +* 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 + +#include "CVSMMFDataBuffer.h" +#include "CVSDataSourceImp.h" +#include "VSPanic.h" + +// EXTERNAL FUNCTION PROTOTYPES + +// MACROS + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// LOCAL CONSTANTS AND MACROS + +static const TInt KQcifWidth = 176; +static const TInt KQcifHeight = 144; + + // 4:2:0 planar and 32 bytes extra + static const TInt KSourceBufferSize = + ( KQcifWidth * KQcifHeight ) + ( ( KQcifWidth * KQcifHeight ) / 2 ) + 12; + +// Granularity for video frame format array +static const TInt KNoOfSupportedFormats = 4; + +// How many sequential FillBufferL calls is supported +static const TInt KNoOfSupportedBuffers = 2; + +// ============================ MEMBER FUNCTIONS =============================== + +// ============================ CVSProviderSwitchAO ============================ + +// ----------------------------------------------------------------------------- +// CVSProviderSwitchAO::NewL +// ----------------------------------------------------------------------------- +// +CVSProviderSwitchAO* CVSProviderSwitchAO::NewL( + CVSDataSourceImp* aDataSourceImp ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSProviderSwitchAO::NewL() >>"), RThread().Id().operator TUint())); + CVSProviderSwitchAO* self = + new ( ELeave ) CVSProviderSwitchAO( aDataSourceImp ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); // self + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSProviderSwitchAO::NewL() <<"), RThread().Id().operator TUint())); + return self; + } + +// ----------------------------------------------------------------------------- +// CVSProviderSwitchAO::ConstructL +// ----------------------------------------------------------------------------- +// +void CVSProviderSwitchAO::ConstructL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSProviderSwitchAO::ConstructL() >>"), RThread().Id().operator TUint())); + User::LeaveIfError( iSwitchCs.CreateLocal() ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSProviderSwitchAO::ConstructL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSProviderSwitchAO::CVSProviderSwitchAO +// ----------------------------------------------------------------------------- +// +CVSProviderSwitchAO::CVSProviderSwitchAO( CVSDataSourceImp* aDataSourceImp ) +: CActive( EPriorityStandard ), iDataSourceImp( aDataSourceImp ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSProviderSwitchAO::CVSProviderSwitchAO() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSProviderSwitchAO::CVSProviderSwitchAO() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSProviderSwitchAO::~CVSProviderSwitchAO +// ----------------------------------------------------------------------------- +// +CVSProviderSwitchAO::~CVSProviderSwitchAO() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSProviderSwitchAO::~CVSProviderSwitchAO() >>"), RThread().Id().operator TUint())); + iSwitchCs.Close(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSProviderSwitchAO::~CVSProviderSwitchAO() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSProviderSwitchAO::ThreadLogon +// ----------------------------------------------------------------------------- +// +TInt CVSProviderSwitchAO::ThreadLogon( MAsyncEventHandler& aEventHandler ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSProviderSwitchAO::ThreadLogon() >>"), RThread().Id().operator TUint())); + iEventHandler = &aEventHandler; + RThread me; + iThreadId = me.Id(); + CActiveScheduler::Add( this ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSProviderSwitchAO::ThreadLogon() <<"), RThread().Id().operator TUint())); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVSProviderSwitchAO::ThreadLogoff +// ----------------------------------------------------------------------------- +// +void CVSProviderSwitchAO::ThreadLogoff() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSProviderSwitchAO::ThreadLogoff() >>"), RThread().Id().operator TUint())); + if( RThread().Id().operator TUint() == iThreadId ) + { + Deque(); + iThreadId = 0; + iNewProvider = NULL; + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSProviderSwitchAO::ThreadLogoff() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSProviderSwitchAO::InitiateProviderSwitch +// ----------------------------------------------------------------------------- +// +void CVSProviderSwitchAO::InitiateProviderSwitch( + CVSDataProvider* aNewProvider ) + { + iSwitchCs.Wait(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSProviderSwitchAO::InitiateProviderSwitch() >>"), RThread().Id().operator TUint())); + iNewProvider = aNewProvider; + iStatus = KRequestPending; + SetActive(); + Signal( KErrNone ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSProviderSwitchAO::InitiateProviderSwitch() <<"), RThread().Id().operator TUint())); + iSwitchCs.Signal(); + } + +// ----------------------------------------------------------------------------- +// CVSProviderSwitchAO::RunL +// ----------------------------------------------------------------------------- +// +void CVSProviderSwitchAO::RunL() + { + iSwitchCs.Wait(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSProviderSwitchAO::RunL() >>"), RThread().Id().operator TUint())); + if( iStatus.Int() == KErrNone ) + { + if ( iDataSourceImp->SwitchPending() ) + { + Panic( EVSPanicSwitchAlreadyPending ); + } + TRAPD( + leaveCode, + iDataSourceImp->DoProviderSwitchL( iNewProvider, *iEventHandler ) ); + if ( leaveCode != KErrNone ) + { + iDataSourceImp->ProviderSwitchError( leaveCode ); + } + } + else + { + iNewProvider = NULL; + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSProviderSwitchAO::RunL() <<"), RThread().Id().operator TUint())); + iSwitchCs.Signal(); + } + +// ----------------------------------------------------------------------------- +// CVSProviderSwitchAO::DoCancel +// ----------------------------------------------------------------------------- +// +void CVSProviderSwitchAO::DoCancel() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSProviderSwitchAO::DoCancel() >>"), RThread().Id().operator TUint())); + // Nothing to do here. This AO is always signalled when it's activated. + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSProviderSwitchAO::DoCancel() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSProviderSwitchAO::Signal +// ----------------------------------------------------------------------------- +// +void CVSProviderSwitchAO::Signal( TInt aError ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSProviderSwitchAO::Signal() >>"), RThread().Id().operator TUint())); + if( IsActive() ) + { + TRequestStatus* pStatus = &iStatus; + RThread me; + if( me.Id() == iThreadId ) + { + User::RequestComplete( pStatus, aError ); + } + else + { + if( me.Open( iThreadId ) == KErrNone ) + { + *pStatus = KRequestPending; + me.RequestComplete( pStatus, aError ); + me.Close(); + } + else + { + Panic( EVSPanicThreadOpenFailure ); + } + } + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSProviderSwitchAO::Signal() <<"), RThread().Id().operator TUint())); + } + +// ============================ CVSDataSourceObserverAO ======================== + +// ----------------------------------------------------------------------------- +// CVSDataSourceObserverAO::CVSDataSourceObserverAO +// ----------------------------------------------------------------------------- +// +CVSDataSourceObserverAO::CVSDataSourceObserverAO() +: CActive( EPriorityStandard ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceObserverAO::CVSDataSourceObserverAO() >>"), RThread().Id().operator TUint())); + RThread me; + iThreadId = me.Id(); + CActiveScheduler::Add( this ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceObserverAO::CVSDataSourceObserverAO() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceObserverAO::~CVSDataSourceObserverA +// ----------------------------------------------------------------------------- +// +CVSDataSourceObserverAO::~CVSDataSourceObserverAO() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceObserverAO::~CVSDataSourceObserverAO() >>"), RThread().Id().operator TUint())); + Cancel(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceObserverAO::~CVSDataSourceObserverAO() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceObserverAO::vsProviderSwitchDone +// ----------------------------------------------------------------------------- +// +void CVSDataSourceObserverAO::vsProviderSwitchDone( + MVSDataSourceObserver& aObserver, + CVSDataProvider* aOldProvider ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceObserverAO::vsProviderSwitchDone() >>"), RThread().Id().operator TUint())); + iObserver = &aObserver; + iOldProvider = aOldProvider; + iStatus = KRequestPending; + SetActive(); + Signal( KErrNone ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceObserverAO::vsProviderSwitchDone() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceObserverAO::RunL +// ----------------------------------------------------------------------------- +// +void CVSDataSourceObserverAO::RunL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceObserverAO::RunL() >>"), RThread().Id().operator TUint())); + if( iStatus.Int() == KErrNone ) + { + iObserver->vsProviderSwitchDone( iOldProvider ); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceObserverAO::RunL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceObserverAO::DoCancel +// ----------------------------------------------------------------------------- +// +void CVSDataSourceObserverAO::DoCancel() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceObserverAO::DoCancel() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceObserverAO::DoCancel() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceObserverAO::Signal +// ----------------------------------------------------------------------------- +// +void CVSDataSourceObserverAO::Signal( TInt aError ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceObserverAO::Signal() >>"), RThread().Id().operator TUint())); + TRequestStatus* pStatus = &iStatus; + RThread me; + if( me.Id() == iThreadId ) + { + User::RequestComplete( pStatus, aError ); + } + else + { + if( me.Open( iThreadId ) == KErrNone ) + { + *pStatus = KRequestPending; + me.RequestComplete( pStatus, aError ); + me.Close(); + } + else + { + Panic( EVSPanicThreadOpenFailure ); + } + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceObserverAO::Signal() <<"), RThread().Id().operator TUint())); + } + + + +// =============================== CVSDataSource =============================== + +// ----------------------------------------------------------------------------- +// CVSDataSource::NewSourceL +// ----------------------------------------------------------------------------- +// +CVSDataSource* CVSDataSource::NewSourceL( MVSDataSourceObserver* aObserver ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSource::NewSourceL() >>"), RThread().Id().operator TUint())); + if ( aObserver == NULL ) + { + User::Leave( KErrArgument ); + } + CVSDataSource* self = CVSDataSourceImp::NewSourceL(); + CleanupStack::PushL( self ); + self->ConstructL( aObserver ); + CleanupStack::Pop( self ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSource::NewSourceL() <<"), RThread().Id().operator TUint())); + return self; + } + +// ----------------------------------------------------------------------------- +// CVSDataSource::CVSDataSource +// ----------------------------------------------------------------------------- +// +CVSDataSource::CVSDataSource() : MVTVideoSource( KNullUid ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSource::CVSDataSource() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSource::CVSDataSource() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSDataSource::ConstructL +// ----------------------------------------------------------------------------- +// +void CVSDataSource::ConstructL( MVSDataSourceObserver* aObserver ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSource::ConstructL() >>"), RThread().Id().operator TUint())); + iObserver = aObserver; + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSource::ConstructL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::NewSourceL +// ----------------------------------------------------------------------------- +// +CVSDataSourceImp* CVSDataSourceImp::NewSourceL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::NewSourceL() >>"), RThread().Id().operator TUint())); + CVSDataSourceImp* self = new (ELeave) CVSDataSourceImp; + CleanupStack::PushL( self ); + self->ConstructSourceL( KNullDesC8 ); + CleanupStack::Pop( self ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::NewSourceL() <<"), RThread().Id().operator TUint())); + return self; + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::SwitchDataProviderL +// ----------------------------------------------------------------------------- +// +void CVSDataSourceImp::SwitchDataProviderL( + CVSDataProvider* aNewProvider ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SwitchDataProviderL() >>"), RThread().Id().operator TUint())); + if ( aNewProvider == NULL ) + { + __IF_DEBUG(Print(_L("SwitchDataProviderL(): NULL argument, leaving."))); + User::Leave( KErrArgument ); + } + // Is new provider same as old, then no need to change provider + if ( aNewProvider == &DataProvider() ) + { + __IF_DEBUG(Print(_L("SwitchDataProviderL(): New provider same as old: 0x%x"), aNewProvider)); + Observer().vsProviderSwitchDone( aNewProvider ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SwitchDataProvider() <<"), RThread().Id().operator TUint())); + return; + } + // If Protocol is in the currently initializing itself then complete this switch + // request when Protocol ready (from SourcePlayL). No need to protect + // iProtoInitOngoing test with CS. + if ( iProtoInitOngoing ) + { + __IF_DEBUG(Print(_L("PROTOCOL INIT ONGOING, PENDING SWITCH FOR A WHILE"))); + iProtoInitCS.Wait(); + iProviderSwitchRequestDuringProtoInit = ETrue; + iNewProvider = aNewProvider; + iProtoInitCS.Signal(); + return; + } + // Switch provider + if ( iThreadLogonCalled ) + { + iProviderSwitchAO->InitiateProviderSwitch( aNewProvider ); + } + else + { + CVSDataProvider* oldProvider = SwitchProvider( aNewProvider ); + Observer().vsProviderSwitchDone( oldProvider ); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SwitchDataProviderL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::PauseSending +// ----------------------------------------------------------------------------- +// +void CVSDataSourceImp::PauseSending() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::PauseSending() >>"), RThread().Id().operator TUint())); + iPauseCs.Wait(); + iSendingPaused = ETrue; + iPauseCs.Signal(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::PauseSending() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::ResumeSending +// ----------------------------------------------------------------------------- +// +void CVSDataSourceImp::ResumeSending() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::ResumeSending() >>"), RThread().Id().operator TUint())); + iPauseCs.Wait(); + iSendingPaused = EFalse; + iPauseCs.Signal(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::ResumeSending() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::~CVSDataSourceImp +// ----------------------------------------------------------------------------- +// +CVSDataSourceImp::~CVSDataSourceImp() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::~CVSDataSourceImp() >>"), RThread().Id().operator TUint())); + delete iDataSourceObserverAO; + delete iProviderSwitchAO; + iProtoMimeTypes.Close(); + delete iSupportedVideoFormats; + iSupportedVideoSizes.Close(); + iSupportedFrameRates.Close(); + // Assuming no need to use critical section here + iFreeQueue.Close(); + iActiveQueue.Close(); + iAllocatedBuffers.ResetAndDestroy(); + iQueueCs.Close(); + iPauseCs.Close(); + iProtoInitCS.Close(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::~CVSDataSourceImp() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::FillBufferL +// ----------------------------------------------------------------------------- +// +void CVSDataSourceImp::FillBufferL( + CMMFBuffer* aBuffer, + MVTVideoSink* aConsumer, + TMediaId aMediaId ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::FillBufferL() >>"), RThread().Id().operator TUint())); + + if ( aBuffer == NULL || aConsumer == NULL ) + { + User::Leave( KErrArgument ); + } + + if ( aBuffer->Type() != KUidMmfDataBuffer ) + { + User::Leave( KErrArgument ); + } + + DataProvider().SetFillBufferParams( aConsumer, aMediaId ); + + iPauseCs.Wait(); + const TBool sendingPaused( iSendingPaused ); + iPauseCs.Signal(); + + if( iSwitchOngoing ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::FillBufferL(): Switch ongoing"), RThread().Id().operator TUint())); + // queues are locked by us -> it's safe to modify queues without + // locking + User::LeaveIfError( + FreeBufferNoWait( static_cast( aBuffer ) ) ); + } + else if( iSwitchPending ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::FillBufferL(): Switch pending"), RThread().Id().operator TUint())); + FreeBufferL( static_cast( aBuffer ) ); + TRAPD( + err, + DoProviderSwitchL( + iProviderSwitchAO->NewDataProvider(), + iProviderSwitchAO->EventHandler() ) ); + if( err != KErrNone ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::FillBufferL(): Error in switch = %d"), RThread().Id().operator TUint(), err)); + // Not leaving from here (it was provider switch related error), + // let VT take care of the rest + ProviderSwitchError( err ); + } + } + else if( sendingPaused ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::FillBufferL(): Sending Paused"), RThread().Id().operator TUint())); + // queues are locked by us -> it's safe to modify queues without + // locking + User::LeaveIfError( + FreeBufferNoWait( static_cast( aBuffer ) ) ); + } + else + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::FillBufferL(): No switch -> normal FillBufferL()"), RThread().Id().operator TUint())); + FreeBufferL( static_cast( aBuffer ) ); + DataProvider().FillBufferL( aBuffer, aConsumer, aMediaId ); + } + + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::FillBufferL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::BufferEmptiedL +// ----------------------------------------------------------------------------- +// +void CVSDataSourceImp::BufferEmptiedL( CMMFBuffer* /*aBuffer*/ ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::BufferEmptiedL() >>"), RThread().Id().operator TUint())); + User::Leave( KErrNotSupported ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::BufferEmptiedL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::CanCreateSourceBuffer +// ----------------------------------------------------------------------------- +// +TBool CVSDataSourceImp::CanCreateSourceBuffer() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::CanCreateSourceBuffer() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::CanCreateSourceBuffer) <<"), RThread().Id().operator TUint())); + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::CreateSourceBufferL +// ----------------------------------------------------------------------------- +// +CMMFBuffer* CVSDataSourceImp::CreateSourceBufferL( + TMediaId /*aMediaId*/, + TBool &aReference ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::CreateSourceBufferL() >>"), RThread().Id().operator TUint())); + if ( iRequestedBufferCount >= KNoOfSupportedBuffers ) + { + User::Leave( KErrOverflow ); + } + aReference = ETrue; + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::CreateSourceBufferL(): Returning buffer: %d [0x%08x]"), RThread().Id().operator TUint(), iRequestedBufferCount + 1, iAllocatedBuffers[ iRequestedBufferCount ])); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::CreateSourceBufferL() <<"), RThread().Id().operator TUint())); + return iAllocatedBuffers[ iRequestedBufferCount++ ]; + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::CreateSourceBufferL +// ----------------------------------------------------------------------------- +// +CMMFBuffer* CVSDataSourceImp::CreateSourceBufferL( + TMediaId /*aMediaId*/, + CMMFBuffer& /*aSinkBuffer*/, + TBool &aReference ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::CreateSourceBufferL() >>"), RThread().Id().operator TUint())); + if ( iRequestedBufferCount >= KNoOfSupportedBuffers ) + { + User::Leave( KErrOverflow ); + } + aReference = ETrue; + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::CreateSourceBufferL(): Returning buffer: %d [0x%08x]"), RThread().Id().operator TUint(), iRequestedBufferCount + 1, iAllocatedBuffers[ iRequestedBufferCount ])); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::CreateSourceBufferL() <<"), RThread().Id().operator TUint())); + return iAllocatedBuffers[ iRequestedBufferCount++ ]; + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::SourceThreadLogon +// ----------------------------------------------------------------------------- +// +TInt CVSDataSourceImp::SourceThreadLogon( MAsyncEventHandler& aEventHandler ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SourceThreadLogon() >>"), RThread().Id().operator TUint())); + __ASSERT_DEBUG( (&DataProvider()) != NULL, + Panic( EVSPanicProviderNotSet ) ); + TInt err( KErrNone ); + if( !iFbsStarted ) + { + // Caller does not start the FBS server when compiled on proxy mode + // so we have to take care of that by ourself. + err = FbsStartup(); + if( err == KErrNone ) + { + err = RFbsSession::Connect(); + if( err == KErrNone ) + { + iFbsStarted = ETrue; + } + } + } + if( !iThreadLogonCalled && ( err == KErrNone ) ) + { + err = DataProvider().SourceThreadLogon( aEventHandler ); + if (err != KErrNone) + { + return err; + } + iProviderSwitchAO->ThreadLogon( aEventHandler ); + iThreadLogonCalled = ETrue; + iProtoInitOngoing = ETrue; + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SourceThreadLogon() <<"), RThread().Id().operator TUint())); + return err; + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::SourceThreadLogoff +// ----------------------------------------------------------------------------- +// +void CVSDataSourceImp::SourceThreadLogoff() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SourceThreadLogoff() >>"), RThread().Id().operator TUint())); + + iThreadLogonCalled = EFalse; + + if ( iProviderSwitchRequestDuringProtoInit ) + { + __IF_DEBUG(Print(_L("PROTOCOL INIT FAILED, NOW COMPLETING THE SWITCH REQUEST WITH ERROR"))); + iProviderSwitchRequestDuringProtoInit = EFalse; + ProviderSwitchError( KErrAbort ); + } + + if( &DataProvider() ) + { + DataProvider().SourceThreadLogoff(); + } + + iSwitchOngoing = iSwitchPending = EFalse; + + iProtoInitOngoing = EFalse; + + // If provider switch ongoing complete it + if ( iProviderSwitchAO->NewDataProvider() != NULL ) + { + CVSDataProvider* oldProvider = + SwitchProvider( iProviderSwitchAO->NewDataProvider() ); + Observer().vsProviderSwitchDone( oldProvider ); + } + + iProviderSwitchAO->ThreadLogoff(); + + delete iFormat; iFormat = 0; + + iCallFlags = 0; + + // Clear iFreeQueue + while( iFreeQueue.Count() ) + { + iFreeQueue.Remove( 0 ); + } + + // Clear iActiveQueue + while( iActiveQueue.Count() ) + { + iActiveQueue.Remove( 0 ); + } + + // Set frame buffer to NULL for all buffers + for( TInt i = 0; i < iRequestedBufferCount; i++ ) + { + TInt err = KErrNone; + // Does not leave when framebuffer is set to NULL + // Both type of buffers needs to be nulled + TRAP( err, iAllocatedBuffers[i]->SetFrameBufferL( ( MCameraBuffer* )NULL )); + TRAP( err, iAllocatedBuffers[i]->SetFrameBufferL( ( MFrameBuffer* )NULL )); } + + // All pre-created buffers are free again + iRequestedBufferCount = 0; + + if( iFbsStarted ) + { + RFbsSession::Disconnect(); + iFbsStarted = EFalse; + } + + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SourceThreadLogoff() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::SourcePrimeL +// ----------------------------------------------------------------------------- +// +TInt CVSDataSourceImp::SourcePrimeL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SourcePrimeL() >>"), RThread().Id().operator TUint())); + TRAPD( result, DataProvider().SourcePrimeL() ); + if( ( result == KErrNone ) || ( result == KRequestPending ) ) + { + iDSState = CVSDataSourceImp::EPrimed; + } + else + { + User::Leave( result ); + } + iProtoInitOngoing = EFalse; + // If provider switch was requested when Proto was initializing itself then + // fill switch request now + iProtoInitCS.Wait(); + if ( iProviderSwitchRequestDuringProtoInit ) + { + __IF_DEBUG(Print(_L("PROTOCOL INIT READY, NOW COMPLETING THE SWITCH REQUEST"))); + iProviderSwitchRequestDuringProtoInit = EFalse; + iProviderSwitchAO->InitiateProviderSwitch( iNewProvider ); + iNewProvider = NULL; + } + iProtoInitCS.Signal(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SourcePrimeL() <<"), RThread().Id().operator TUint())); + return result; + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::SourcePlayL +// ----------------------------------------------------------------------------- +// +TInt CVSDataSourceImp::SourcePlayL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SourcePlayL() >>"), RThread().Id().operator TUint())); + if( !iSwitchOngoing ) + { + DataProvider().SourcePlayL(); + } + else + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SourcePlayL(): Switch ongoing -> updating state only, play will be called after switch"), RThread().Id().operator TUint())); + } + iDSState = CVSDataSourceImp::EPlaying; + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SourcePlayL() <<"), RThread().Id().operator TUint())); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::SourcePauseL +// ----------------------------------------------------------------------------- +// +TInt CVSDataSourceImp::SourcePauseL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SourcePauseL() >>"), RThread().Id().operator TUint())); + if( !iSwitchOngoing ) + { + DataProvider().SourcePauseL(); + } + else + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SourcePlayL(): Switch ongoing -> updating state only"), RThread().Id().operator TUint())); + } + iDSState = CVSDataSourceImp::EPrimed; + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SourcePauseL() <<"), RThread().Id().operator TUint())); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::SourceStopL +// ----------------------------------------------------------------------------- +// +TInt CVSDataSourceImp::SourceStopL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SourceStopL() >>"), RThread().Id().operator TUint())); + if( !iSwitchOngoing ) + { + DataProvider().SourceStopL(); + } + else + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SourcePlayL(): Switch ongoing -> updating state only"), RThread().Id().operator TUint())); + } + iDSState = CVSDataSourceImp::EStopped; + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SourceStopL() <<"), RThread().Id().operator TUint())); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::ConstructSourceL +// ----------------------------------------------------------------------------- +// +void CVSDataSourceImp::ConstructSourceL( const TDesC8& /*aInitData*/ ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::ConstructSourceL() >>"), RThread().Id().operator TUint())); + iYuv420PlanarDesc.Zero(); + iYuv420PlanarDesc.Append( KVtVideoMIMETypeYUV420 ); + User::LeaveIfError( iProtoMimeTypes.Append( &iYuv420PlanarDesc ) ); + iProviderSwitchAO = CVSProviderSwitchAO::NewL( this ); + iDataSourceObserverAO = new (ELeave) CVSDataSourceObserverAO(); + iSupportedVideoFormats = + new (ELeave) CDesC8ArrayFlat( KNoOfSupportedFormats ); + // Get formats supported by all providers + CVSDataProvider::EnumerateVideoFrameFormatsL( iSupportedVideoFormats ); + // Get video frame sizes for specified format supported by all providers + TInt i, j; + i = j = 0; + for ( i = 0; i < iSupportedVideoFormats->Count(); i++ ) + { + TPtrC8 format = iSupportedVideoFormats->MdcaPoint( i ); + RArray sizeArray; + CleanupClosePushL( sizeArray ); + CVSDataProvider::EnumerateVideoFrameSizesL( sizeArray, format ); + for ( j = 0; j < sizeArray.Count(); j++ ) + { + TVSFrameSize sizePerFormat; + sizePerFormat.iFormat.Set( format ); + sizePerFormat.iSize = sizeArray[j]; + User::LeaveIfError( iSupportedVideoSizes.Append( sizePerFormat ) ); + } + CleanupStack::PopAndDestroy(); // sizeArray + } + // Get video frame rates for specified frame format and size supported + // by all providers + for ( i = 0; i < iSupportedVideoSizes.Count(); i++ ) + { + RArray rateArray; + CleanupClosePushL( rateArray ); + CVSDataProvider::EnumerateVideoFrameRatesL( + rateArray, + iSupportedVideoSizes[i].iFormat, + iSupportedVideoSizes[i].iSize ); + for ( j = 0; j < rateArray.Count(); j++ ) + { + TVSFrameRate framePerSizeAndFormat; + framePerSizeAndFormat.iFormat.Set( + iSupportedVideoSizes[i].iFormat ); + framePerSizeAndFormat.iSize = iSupportedVideoSizes[i].iSize; + framePerSizeAndFormat.iRate = rateArray[j]; + User::LeaveIfError( iSupportedFrameRates.Append( + framePerSizeAndFormat ) ); + } + CleanupStack::PopAndDestroy(); // rateArray + } + // Create queue criticalsection + User::LeaveIfError( iQueueCs.CreateLocal() ); + // Create VTEng-Protocol guard + User::LeaveIfError( iPauseCs.CreateLocal() ); + // Pre-create buffers + for( i = 0; i < KNoOfSupportedBuffers; i++ ) + { + User::LeaveIfError( iFreeQueue.Append( 0 ) ); + User::LeaveIfError( iActiveQueue.Append( 0 ) ); + CVSMMFDataBuffer* buffer = CVSMMFDataBuffer::NewL( KSourceBufferSize ); + CleanupStack::PushL( buffer ); + User::LeaveIfError( iAllocatedBuffers.Append( buffer ) ); + CleanupStack::Pop(); // buffer + } + for( i = 0; i < KNoOfSupportedBuffers; i++ ) + { + iFreeQueue.Remove( 0 ); + iActiveQueue.Remove( 0 ); + } + // Init critical sections + User::LeaveIfError( iProtoInitCS.CreateLocal() ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::ConstructSourceL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::GetMultimediaTypesL +// ----------------------------------------------------------------------------- +// +const RArray& CVSDataSourceImp::GetMultimediaTypesL() const + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::GetMultimediaTypeL() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::GetMultimediaTypeL() <<"), RThread().Id().operator TUint())); + return iProtoMimeTypes; + } + + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::SetFormatL +// ----------------------------------------------------------------------------- +// +void CVSDataSourceImp::SetFormatL( const TDesC8& aFormat ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SetFormatL() >>"), RThread().Id().operator TUint())); + if ( &DataProvider() == NULL ) + { + User::Leave( KErrBadHandle ); + } + TBool supported = EFalse; + for ( TInt i = 0; i < iSupportedVideoFormats->Count(); i++ ) + { + TPtrC8 format = iSupportedVideoFormats->MdcaPoint( i ); + if ( aFormat == format ) + { + supported = ETrue; + break; + } + } + if ( !supported ) + { + User::Leave( KErrNotSupported ); + } + DataProvider().SetFormatL( aFormat ); + delete iFormat; iFormat = 0; + iFormat = aFormat.AllocL(); + iCallFlags |= ESetFormatCalled; + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SetFormatL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::SetFrameRateL +// ----------------------------------------------------------------------------- +// +void CVSDataSourceImp::SetFrameRateL( TReal32 aFrameRate ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SetFrameRateL() >>"), RThread().Id().operator TUint())); + if ( &DataProvider() == NULL ) + { + User::Leave( KErrBadHandle ); + } + TBool supported = EFalse; + for ( TInt i = 0; i < iSupportedFrameRates.Count(); i++ ) + { + TVSFrameRate rate = iSupportedFrameRates[i]; + if ( rate.iFormat == iFormat->Des() && rate.iSize == iSize) + { + if ( aFrameRate == rate.iRate ) + { + supported = ETrue; + break; + } + } + } + if ( !supported ) + { + User::Leave( KErrNotSupported ); + } + DataProvider().SetFrameRateL( aFrameRate ); + iFrameRate = aFrameRate; + iCallFlags |= ESetFrameRateCalled; + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SetFrameRateL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::SetVideoFrameSizeL +// ----------------------------------------------------------------------------- +// +void CVSDataSourceImp::SetVideoFrameSizeL( const TSize& aSize ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SetVideoFrameSizeL() >>"), RThread().Id().operator TUint())); + if ( &DataProvider() == NULL ) + { + User::Leave( KErrBadHandle ); + } + TBool supported = EFalse; + for ( TInt i = 0; i < iSupportedVideoSizes.Count(); i++ ) + { + TVSFrameSize size = iSupportedVideoSizes[i]; + if ( size.iFormat == iFormat->Des() ) + { + if ( aSize == size.iSize ) + { + supported = ETrue; + break; + } + } + } + if ( !supported ) + { + User::Leave( KErrNotSupported ); + } + DataProvider().SetVideoFrameSizeL( aSize ); + iSize = aSize; + iCallFlags |= ESetSizeCalled; + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::SetVideoFrameSizeL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::GetVideoFrameSizeL +// ----------------------------------------------------------------------------- +// +void CVSDataSourceImp::GetVideoFrameSizeL( TSize& aSize ) const + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::GetVideoFrameSizeL() >>"), RThread().Id().operator TUint())); + if ( &DataProvider() == NULL ) + { + User::Leave( KErrBadHandle ); + } + DataProvider().GetVideoFrameSizeL( aSize ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::GetVideoFrameSizeL() <<"), RThread().Id().operator TUint())); + } + + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::DoProviderSwitchL +// ----------------------------------------------------------------------------- +// +void CVSDataSourceImp::DoProviderSwitchL( + CVSDataProvider* aNewProvider, + MAsyncEventHandler& aEventHandler ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::DoProviderSwitchL() >>"), RThread().Id().operator TUint())); + + iQueueCs.Wait(); + + // If there are entries in iActiveQueue wait until they are freed by Protocol + if ( iActiveQueue.Count() > 0 ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::DoProviderSwitchL(): activequeue count > 0, <<"), RThread().Id().operator TUint())); + iSwitchPending = ETrue; + iQueueCs.Signal(); + return; + } + else + { + iSwitchPending = EFalse; + } + + iSwitchOngoing = ETrue; + + /* + * THE FOLLOWING CALLS USE CActiveSchedulerWait WHICH MEANS SOME OTHER + * OBJECT MAY RUN IN BETWEEN THE FOLLOWING CALLS I.E. THESE CALLS ARE NOT + * SYNCHRONOUS. + */ + + User::LeaveIfError( aNewProvider->SourceThreadLogon( aEventHandler ) ); + + // Is format set by the Protocol + if ( iCallFlags & ESetFormatCalled ) + { + aNewProvider->SetFormatL( *iFormat ); + } + // Is size set by the Protocol + if ( iCallFlags & ESetSizeCalled ) + { + aNewProvider->SetVideoFrameSizeL( iSize ); + } + // Is framerate set by the Protocol + if ( iCallFlags & ESetFrameRateCalled ) + { + aNewProvider->SetFrameRateL( iFrameRate ); + } + // Stop old provider + if ( &DataProvider() != NULL ) + { + switch( iDSState ) + { + case EPlaying: + DataProvider().SourcePauseL(); + DataProvider().SourceStopL(); + break; + + case EPrimed: + DataProvider().SourceStopL(); + break; + + default: + break; + }; + DataProvider().SourceThreadLogoff(); + } + + // Set new provider state according to current state + switch ( iDSState ) + { + case EStopped: + break; + + case EPrimed: + case EPlaying: + aNewProvider->PrimeL(); + + // check if SourcePlayL() was called during prime + if( iDSState == EPlaying ) + { + aNewProvider->SourcePlayL(); + aNewProvider->SwitchFrom( DataProvider() ); + } + // or SourceStopL() + else if( iDSState == EStopped ) + { + aNewProvider->SourceStopL(); + } + break; + } + /* + * THE FOLLOWING CALLS ARE SUPPOSED TO BE SYNCHRONOUS IN THAT THEY DO NOT + * LET ACTIVE SCHEDULER RUN SOME OTHER OBJECT. + */ + + // Complete switch + CVSDataProvider* oldProvider = SwitchProvider( aNewProvider ); + + // Set consumer and media id + DataProvider().SetFillBufferParams( + oldProvider->Consumer(), + oldProvider->MediaId() ); + + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::DoProviderSwitchL(): iFreeQueue.Count() = %d, iActiveQueue.Count() = %d"), RThread().Id().operator TUint(), iFreeQueue.Count(), iActiveQueue.Count() )); + + // If old provider has pending FillBufferL() calls -> call FillBufferL() + // for new provider if it is in Playing state. + if( iDSState == EPlaying ) + { + for ( TInt i = 0; i < iFreeQueue.Count(); i++ ) + { + iFreeQueue[ i ]->Reset(); + DataProvider().FillBufferL( + iFreeQueue[i], + DataProvider().Consumer(), + DataProvider().MediaId() ); + } + } + + // Buffers that are being used by Protocol are set to be needing a reset + for ( TInt i = 0; i < iActiveQueue.Count(); i++ ) + { + iActiveQueue[ i ]->SetNeedsReset( ETrue ); + } + + iSwitchOngoing = EFalse; + + iQueueCs.Signal(); + + iDataSourceObserverAO->vsProviderSwitchDone( Observer(), oldProvider ); + iProviderSwitchAO->NewDataProvider() = NULL; + + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::DoProviderSwitchL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::CVSDataSourceImp +// ----------------------------------------------------------------------------- +// +void CVSDataSourceImp::ProviderSwitchError( TInt aError ) + { + DataProvider().NotifyError( aError ); + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::CVSDataSourceImp +// ----------------------------------------------------------------------------- +// +CVSDataSourceImp::CVSDataSourceImp() +: iFreeQueue( KNoOfSupportedBuffers ), iActiveQueue( KNoOfSupportedBuffers ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::CVSDataSourceImp() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::CVSDataSourceImp() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::GetBufferL +// ----------------------------------------------------------------------------- +// +CVSMMFDataBuffer* CVSDataSourceImp::GetBufferL( TBool aRemove ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::GetBufferL() >>"), RThread().Id().operator TUint())); + if( !iQueueCs.IsBlocked() ) + { + iPauseCs.Wait(); + const TBool sendingPaused( iSendingPaused ); + iPauseCs.Signal(); + + iQueueCs.Wait(); + + // while switch is pending, always return NULL we don't want to let + // buffer float around + if( iSwitchPending || sendingPaused ) + { + iQueueCs.Signal(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::GetBufferL(): Switch pending or sending paused -> returning NULL"), RThread().Id().operator TUint())); + return 0; + } + + // If no buffers in free (FillBufferL is called) queue -> return NULL + if( !iFreeQueue.Count() ) + { + iQueueCs.Signal(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::GetBufferL(): NO free buffers -> returning NULL"), RThread().Id().operator TUint())); + return 0; + } + // Otherwise get first buffer + CVSMMFDataBuffer* temp = iFreeQueue[ 0 ]; + // Move to active (BufferFilledL is called) queue if requested + if( aRemove ) + { + iFreeQueue.Remove( 0 ); + TInt err = iActiveQueue.Append( temp ); + if ( err != KErrNone ) + { + iQueueCs.Signal(); + User::Leave( err ); + } + } + iQueueCs.Signal(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::GetBufferL() returning [$%x]"), RThread().Id().operator TUint(), temp)); + return temp; + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::GetBufferL(): blocked, returning [$%08x]"), RThread().Id().operator TUint(), 0)); + return 0; + } + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::FreeBufferL +// ----------------------------------------------------------------------------- +// +void CVSDataSourceImp::FreeBufferL( CVSMMFDataBuffer* aBuffer ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::FreeBufferL() >>"), RThread().Id().operator TUint())); + iQueueCs.Wait(); + TInt err = FreeBufferNoWait( aBuffer ); + iQueueCs.Signal(); + User::LeaveIfError( err ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::FreeBufferL() <<"), RThread().Id().operator TUint())); + } + + +// ----------------------------------------------------------------------------- +// CVSDataSourceImp::FreeBufferNoWait( CVSMMFDataBuffer* aBuffer ) +// ----------------------------------------------------------------------------- +// +TInt CVSDataSourceImp::FreeBufferNoWait( CVSMMFDataBuffer* aBuffer ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::FreeBufferNoWait() >>"), RThread().Id().operator TUint())); + + // Append buffer into free (FillBufferL is called) queue + TInt err( KErrNone ); + + // Try finding buffer from active (BufferFilledL is called) queue + TInt actIdx = iActiveQueue.Find( aBuffer ); + + // If it is found, remove it from there + if( actIdx != KErrNotFound ) + { + iActiveQueue.Remove( actIdx ); + TRAP( err, aBuffer->ReleaseL() ); + if( err != KErrNone ) + { + return err; + } + } + + if( iFreeQueue.Find( aBuffer ) == KErrNotFound ) + { + err = iFreeQueue.Append( aBuffer ); + } + +#ifdef _DEBUG + TBuf<256> b; + TInt i; + b = _L("Active: "); + for( i = 0; i < iActiveQueue.Count(); i++ ) + { + if( i > 0 ) + { + b.Append( _L(", ") ); + } + TBuf<16> b1; + b1.Format( _L("[$%08x]"), iActiveQueue[i] ); + b.Append( b1 ); + } + RDebug::Print( b ); + + b = _L("Free : "); + for( i = 0; i < iFreeQueue.Count(); i++ ) + { + if( i > 0 ) + { + b.Append( _L(", ") ); + } + TBuf<16> b1; + b1.Format( _L("[$%08x]"), iFreeQueue[i] ); + b.Append( b1 ); + } + RDebug::Print( b ); +#endif + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataSourceImp::FreeBufferNoWait() <<"), RThread().Id().operator TUint())); + + return err; + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/src/CVSMMFDataBuffer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/src/CVSMMFDataBuffer.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,343 @@ +/* +* 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 "CVSMMFDataBuffer.h" + +// MACROS + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// ============================ CVSMMFDataBuffer =============================== + +// ----------------------------------------------------------------------------- +// CVSMMFDataBuffer::NewL +// ----------------------------------------------------------------------------- +// +EXPORT_C CVSMMFDataBuffer* CVSMMFDataBuffer::NewL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::NewL() >>"), RThread().Id().operator TUint())); + CVSMMFDataBuffer* self = new ( ELeave ) CVSMMFDataBuffer; + CleanupStack::PushL(self); + self->ConstructL( KMMFDataBufferDefaultBufferSize ); + CleanupStack::Pop(); // self + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::NewL <<"), RThread().Id().operator TUint())); + return self; + } + +// ----------------------------------------------------------------------------- +// CVSMMFDataBuffer::NewL +// ----------------------------------------------------------------------------- +// +EXPORT_C CVSMMFDataBuffer* CVSMMFDataBuffer::NewL( TInt aMaxBufferSize ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::NewL() >>"), RThread().Id().operator TUint())); + CVSMMFDataBuffer* self = new ( ELeave ) CVSMMFDataBuffer; + CleanupStack::PushL(self); + self->ConstructL( aMaxBufferSize ); + CleanupStack::Pop(); // self + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::NewL <<"), RThread().Id().operator TUint())); + return self; + } + +// ----------------------------------------------------------------------------- +// CVSMMFDataBuffer::~CVSMMFDataBuffer +// ----------------------------------------------------------------------------- +// +EXPORT_C CVSMMFDataBuffer::~CVSMMFDataBuffer() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::~CVSMMFDataBuffer() >>"), RThread().Id().operator TUint())); + delete[] iData; + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::~CVSMMFDataBuffer() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSMMFDataBuffer::ReAllocBufferL +// ----------------------------------------------------------------------------- +// +void CVSMMFDataBuffer::ReAllocBufferL( TInt aMaxBufferSize ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::ReAllocBufferL() >>"), RThread().Id().operator TUint())); + if ( !iIsBufferSet ) + { + TUint8* tmp = new (ELeave) TUint8[aMaxBufferSize]; + delete[] iData; + iData = tmp; + iPtr.Set( iData, 0, aMaxBufferSize ); + iMaxBufferSize = aMaxBufferSize; + } + else + { + User::Leave( KErrNotSupported ); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::ReAllocBufferL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSMMFDataBuffer::NeedsReset +// ----------------------------------------------------------------------------- +// +TBool CVSMMFDataBuffer::NeedsReset() const + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::NeedsReset() ><"), RThread().Id().operator TUint())); + return iNeedsReset; + } + +// ----------------------------------------------------------------------------- +// CVSMMFDataBuffer::SetNeedsReset +// ----------------------------------------------------------------------------- +// +void CVSMMFDataBuffer::SetNeedsReset( TBool aNeedsReset ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetNeedsReset() >>"), RThread().Id().operator TUint())); + iNeedsReset = aNeedsReset; + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetNeedsReset() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSMMFDataBuffer::Reset +// ----------------------------------------------------------------------------- +// +void CVSMMFDataBuffer::Reset() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::Reset() >>"), RThread().Id().operator TUint())); + iPtr.Zero(); + SetNeedsReset( EFalse ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::Reset() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSMMFDataBuffer::Data +// ----------------------------------------------------------------------------- +// +TDes8& CVSMMFDataBuffer::Data() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::Data() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::Data() <<"), RThread().Id().operator TUint())); + return iPtr; + } + +// ----------------------------------------------------------------------------- +// CVSMMFDataBuffer::Data +// ----------------------------------------------------------------------------- +// +const TDesC8& CVSMMFDataBuffer::Data() const + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::Data() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::Data() <<"), RThread().Id().operator TUint())); + return iPtr; + } + +// ----------------------------------------------------------------------------- +// CVSMMFDataBuffer::SetStatus +// ----------------------------------------------------------------------------- +// +void CVSMMFDataBuffer::SetStatus( TBufferStatus aStatus ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetStatus() >>"), RThread().Id().operator TUint())); + CMMFBuffer::SetStatus( aStatus ); + if ( iStatus == EBeingFilled ) + { + Reset(); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetStatus() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSMMFDataBuffer::SetRequestSizeL +// ----------------------------------------------------------------------------- +// +void CVSMMFDataBuffer::SetRequestSizeL( TInt aSize ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetRequestSizeL() >>"), RThread().Id().operator TUint())); + if ( aSize < 0 ) + { + User::Leave( KErrUnderflow ); + } + else if ( aSize > iPtr.MaxLength() ) + { + User::Leave( KErrOverflow ); + } + else + { + iRequestSize = aSize; + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetRequestSizeL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSMMFDataBuffer::BufferSize +// ----------------------------------------------------------------------------- +// +TUint CVSMMFDataBuffer::BufferSize() const + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::BufferSize() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::BufferSize() <<"), RThread().Id().operator TUint())); + return iPtr.Length(); + } + +// ----------------------------------------------------------------------------- +// CVSMMFDataBuffer::SetPosition +// ----------------------------------------------------------------------------- +// +void CVSMMFDataBuffer::SetPosition( TUint aPosition ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetPosition() >>"), RThread().Id().operator TUint())); + if ( aPosition <= (TUint)iPtr.Length() ) + { + iPosition = aPosition; + } + else + { + iPosition = (TUint)iPtr.Length(); // Tried to position beyond end of + // data + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetPosition() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSMMFDataBuffer::SetFrameBufferL +// ----------------------------------------------------------------------------- +// +void CVSMMFDataBuffer::SetFrameBufferL( MFrameBuffer* aFrameBuffer ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetFrameBuffer() >>"), RThread().Id().operator TUint())); + iFrameBuffer = aFrameBuffer; + //Buffer is valid + iIsBufferSet = ETrue; + if ( aFrameBuffer == NULL ) + { + iPtr.Set( iData, 0, iMaxBufferSize ); + } + else + { + Reset(); + TPtrC8 ptr( *iFrameBuffer->DataL( 0 ) ); + iPtr.Set((TUint8*)ptr.Ptr(), ptr.Size(), ptr.Size()); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetFrameBuffer() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSMMFDataBuffer::SetFrameBufferL +// ----------------------------------------------------------------------------- +// +void CVSMMFDataBuffer::SetFrameBufferL( MCameraBuffer* aCameraBuffer ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetFrameBuffer() >>"), RThread().Id().operator TUint())); + iCameraBuffer = aCameraBuffer; + //Buffer is valid + iIsBufferSet = ETrue; + if ( aCameraBuffer == NULL ) + { + iPtr.Set( iData, 0, iMaxBufferSize ); + } + else + { + Reset(); + // Take the latest frame data from buffer should be always 0, + // but if buffer contains more than 1 frame could be something else + TPtrC8 ptr( *iCameraBuffer->DataL( iCameraBuffer->NumFrames() - 1 ) ); + iPtr.Set((TUint8*)ptr.Ptr(), ptr.Size(), ptr.Size()); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetFrameBuffer() <<"), RThread().Id().operator TUint())); + } + + + +// ----------------------------------------------------------------------------- +// CVSMMFDataBuffer::ReleaseL +// ----------------------------------------------------------------------------- +// +void CVSMMFDataBuffer::ReleaseL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::Release() >>"), RThread().Id().operator TUint())); + if( iFrameBuffer ) + { + iFrameBuffer->Release(); + SetFrameBufferL( (MFrameBuffer*)NULL ); + } + else if( iCameraBuffer ) + { + iCameraBuffer->Release(); + SetFrameBufferL( (MCameraBuffer*)NULL ); + } + else + { + if ( iPtr.Ptr() != iData ) + { + iPtr.Set( iData, 0, iMaxBufferSize ); + } + if( NeedsReset() ) + { + Reset(); + } + } + + //Buffer is no longer valid + iIsBufferSet = EFalse; + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::Release() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSMMFDataBuffer::SetBufferOffset +// ----------------------------------------------------------------------------- +// +void CVSMMFDataBuffer::SetBufferOffset( TInt aOffset ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetBufferOffset() >>"), RThread().Id().operator TUint())); + if ( !iIsBufferSet ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetBufferOffset(): Length = %d, Offset = %d"), RThread().Id().operator TUint(), iPtr.Length(), aOffset)); + iPtr.Set( iData + aOffset, iPtr.Length() - aOffset, iMaxBufferSize ); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetBufferOffset() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSMMFDataBuffer::CVSMMFDataBuffer +// ----------------------------------------------------------------------------- +// +CVSMMFDataBuffer::CVSMMFDataBuffer() : + CMMFDataBuffer( KUidMmfDataBuffer ), iPtr(0,0,0), iIsBufferSet(EFalse) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::CVSMMFDataBuffer() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::CVSMMFDataBuffer() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSMMFDataBuffer::ConstructL +// ----------------------------------------------------------------------------- +// +void CVSMMFDataBuffer::ConstructL( TInt aMaxBufferSize ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::ConstructL() >>"), RThread().Id().operator TUint())); + iData = new (ELeave) TUint8[aMaxBufferSize]; + iPtr.Set( iData, 0, aMaxBufferSize ); + iMaxBufferSize = aMaxBufferSize; + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::ConstructL() <<"), RThread().Id().operator TUint())); + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/src/CVSOnboardCameraDataProvider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/src/CVSOnboardCameraDataProvider.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,1007 @@ +/* +* 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 "CVSOnboardCameraDataProvider.h" +#include "CVSDataSourceImp.h" +#include "VSPanic.h" +#include "CVSMMFDataBuffer.h" + +// EXTERNAL FUNCTION PROTOTYPES + +// CONSTANTS + +const TInt KQCIFWidth = 176; +const TInt KQCIFHeight = 144; + +// MACROS +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// ============================ MEMBER FUNCTIONS =============================== + +// ============================ CProviderErrorNotifierAO ======================= + +// ----------------------------------------------------------------------------- +// CProviderErrorNotifierAO::NewL +// ----------------------------------------------------------------------------- +// +CProviderErrorNotifierAO* CProviderErrorNotifierAO::NewL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::NewL() >>"), RThread().Id().operator TUint())); + CProviderErrorNotifierAO* self = new ( ELeave ) CProviderErrorNotifierAO(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); // self + __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::NewL() <<"), RThread().Id().operator TUint())); + return self; + } + +// ----------------------------------------------------------------------------- +// CProviderErrorNotifierAO::~CProviderErrorNotifierAO +// ----------------------------------------------------------------------------- +// +CProviderErrorNotifierAO::~CProviderErrorNotifierAO() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::~CProviderErrorNotifierAO() >>"), RThread().Id().operator TUint())); + Cancel(); + iCS.Close(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::~CProviderErrorNotifierAO() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CProviderErrorNotifierAO::NotifyError +// ----------------------------------------------------------------------------- +// +void CProviderErrorNotifierAO::NotifyError( + MVSDataProviderObserver* aObserver, + TInt aError ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::NotifyError() >>"), RThread().Id().operator TUint())); + iCS.Wait(); + iObserver = aObserver; + iError = aError; + TRequestStatus* statusP = &iStatus; + RThread thread; + if( thread.Open( iThreadId ) == KErrNone ) + { + *statusP = KRequestPending; + thread.RequestComplete( statusP, KErrNone ); + thread.Close(); + } + else + { + Panic( EVSPanicThreadOpenFailure ); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::NotifyError() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CProviderErrorNotifierAO::CProviderErrorNotifierAO +// ----------------------------------------------------------------------------- +// +CProviderErrorNotifierAO::CProviderErrorNotifierAO() : + CActive( EPriorityNormal ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::CProviderErrorNotifierAO() >>"), RThread().Id().operator TUint())); + CActiveScheduler::Add( this ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::CProviderErrorNotifierAO() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CProviderErrorNotifierAO::ConstructL +// ----------------------------------------------------------------------------- +// +void CProviderErrorNotifierAO::ConstructL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::ConstructL() >>"), RThread().Id().operator TUint())); + iCS.CreateLocal(); + iThreadId = RThread().Id(); + iStatus = KRequestPending; + SetActive(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::ConstructL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CProviderErrorNotifierAO::DoCancel +// ----------------------------------------------------------------------------- +// +void CProviderErrorNotifierAO::DoCancel() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::DoCancel() >>"), RThread().Id().operator TUint())); + if( iStatus == KRequestPending ) + { + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrCancel ); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::DoCancel() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CProviderErrorNotifierAO::RunL +// ----------------------------------------------------------------------------- +// +void CProviderErrorNotifierAO::RunL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::RunL() >>"), RThread().Id().operator TUint())); + TInt err = iStatus.Int(); + if ( err == KErrCancel ) + { + return; + } + if ( iObserver != NULL ) + { + iObserver->vsProviderError( iError ); + } + iStatus = KRequestPending; + SetActive(); + iCS.Signal(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CProviderErrorNotifierAO::RunL() <<"), RThread().Id().operator TUint())); + } + +// ============================ CSyncCameraReserve ============================= + +// ----------------------------------------------------------------------------- +// CSyncCameraReserve::CSyncCameraReserve +// ----------------------------------------------------------------------------- +// +CSyncCameraReserve::CSyncCameraReserve() : CActive( EPriorityNormal ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CSyncCameraReserve::CSyncCameraReserve() >>"), RThread().Id().operator TUint())); + CActiveScheduler::Add( this ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CSyncCameraReserve::CSyncCameraReserve() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CSyncCameraReserve::StartL +// ----------------------------------------------------------------------------- +// +void CSyncCameraReserve::StartL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CSyncCameraReserve::StartL() >>"), RThread().Id().operator TUint())); + SetActive(); + iStatus = KRequestPending; + iWait.Start(); + User::LeaveIfError( iStatus.Int() ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CSyncCameraReserve::StartL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CSyncCameraReserve::NewL +// ----------------------------------------------------------------------------- +// +CSyncCameraReserve* CSyncCameraReserve::NewL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CSyncCameraReserve::NewL() >>"), RThread().Id().operator TUint())); + CSyncCameraReserve* self = new ( ELeave ) CSyncCameraReserve(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CSyncCameraReserve::NewL() <<"), RThread().Id().operator TUint())); + return self; + } + +// ----------------------------------------------------------------------------- +// CSyncCameraReserve::DoCancel +// ----------------------------------------------------------------------------- +// +void CSyncCameraReserve::DoCancel() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CSyncCameraReserve::DoCancel() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource[%d]: CSyncCameraReserve::DoCancel() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CSyncCameraReserve::RunL +// ----------------------------------------------------------------------------- +// +void CSyncCameraReserve::RunL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CSyncCameraReserve::RunL() >>"), RThread().Id().operator TUint())); + iWait.AsyncStop(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CSyncCameraReserve::RunL() <<"), RThread().Id().operator TUint())); + } + +// ============================ CVSOnboardCameraDataProvider =================== + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::CVSOnboardCameraDataProvider +// ----------------------------------------------------------------------------- +// +CVSOnboardCameraDataProvider::CVSOnboardCameraDataProvider( + MVSDataProviderObserver* aObserver, MVSBufferPool* aPool ) : + CVSCameraDataProvider( aObserver, aPool ),iCameraLost( EFalse ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::CVSOnboardCameraDataProvider() >>"), RThread().Id().operator TUint())); + iState = EStopped; + iFormat = CCamera::EFormatYUV420Planar; + iDublicatedBitmap = new CFbsBitmap(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::CVSOnboardCameraDataProvider() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::~CVSOnboardCameraDataProvider +// ----------------------------------------------------------------------------- +// +CVSOnboardCameraDataProvider::~CVSOnboardCameraDataProvider() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::~CVSOnboardCameraDataProvider() >>"), RThread().Id().operator TUint())); + delete iDublicatedBitmap; + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::~CVSOnboardCameraDataProvider() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::PrimeL +// ----------------------------------------------------------------------------- +// +void CVSOnboardCameraDataProvider::PrimeL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::PrimeL() >>"), RThread().Id().operator TUint())); + + const TBool primeable( iCameraDuplicate && ( iState == EStopped ) ); + + if ( !primeable ) + { + User::Leave( KErrNotReady ); + } + + iAsynchronousReserveIssued = EFalse; + iCameraDuplicate->Reserve(); + iSyncReserve->StartL(); // Returns when from ReserveComplete() has been + // signalled iSyncReserve + + // Reserve ok, prepare capture next + iCameraDuplicate->PrepareVideoCaptureL( + iFormat, + iFrameSizeIndex, + iFrameRateIndex, + 2, + 1 ); + + SetVideoFrameSizeL( TSize( KQCIFWidth, KQCIFHeight ) ); + + iState = EPrimed; + + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::PrimeL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::FillBufferL +// ----------------------------------------------------------------------------- +// +void CVSOnboardCameraDataProvider::FillBufferL( + CMMFBuffer* /*aBuffer*/, + MVTVideoSink* /*aConsumer*/, + TMediaId /*aMediaId*/ ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::FillBufferL() >>"), RThread().Id().operator TUint())); + if ( iState != EPlaying ) + { + User::Leave( KErrNotReady ); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::FillBufferL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::BufferEmptiedL +// ----------------------------------------------------------------------------- +// +void CVSOnboardCameraDataProvider::BufferEmptiedL( CMMFBuffer* /*aBuffer*/ ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::BufferEmptiedL() >>"), RThread().Id().operator TUint())); + User::Leave( KErrNotSupported ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::BufferEmptiedL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::SourceThreadLogon +// ----------------------------------------------------------------------------- +// +TInt CVSOnboardCameraDataProvider::SourceThreadLogon( + MAsyncEventHandler& aEventHandler ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourceThreadLogon() >>"), RThread().Id().operator TUint())); + TInt err = KErrNone; + iEventHandler = &aEventHandler; + if ( iCameraDuplicate ) + { + Panic( EVSPanicProviderAlreadyInitialized ); + } + TRAP( err, iCameraDuplicate = + CCamera::NewDuplicate2L( (MCameraObserver2&)*this, iCameraHandle) ); + + if ( err != KErrNone ) + { + TRAP( err, iCameraDuplicate = + CCamera::NewDuplicateL( (MCameraObserver&)*this, iCameraHandle) ); + if (err != KErrNone) + { + return err; + } + } + iCameraLost = EFalse; + + TCameraInfo info; + iCameraDuplicate->CameraInfo( info ); + if ( !(info.iOptionsSupported & TCameraInfo::EVideoCaptureSupported) ) + { + delete iCameraDuplicate; + iCameraDuplicate = NULL; + return KErrNotSupported; + } + if ( iSyncReserve == NULL ) + { + TRAP( err, iSyncReserve = CSyncCameraReserve::NewL() ); + if ( err != KErrNone ) + { + delete iCameraDuplicate; + iCameraDuplicate = NULL; + } + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourceThreadLogon() <<"), RThread().Id().operator TUint())); + return err; + } + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::SourceThreadLogoff +// ----------------------------------------------------------------------------- +// +void CVSOnboardCameraDataProvider::SourceThreadLogoff() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourceThreadLogoff() >>"), RThread().Id().operator TUint())); + delete iCameraDuplicate; + iCameraDuplicate = NULL; + iState = EStopped; + delete iSyncReserve; + iSyncReserve = NULL; + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourceThreadLogoff() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::SourcePrimeL +// ----------------------------------------------------------------------------- +// +void CVSOnboardCameraDataProvider::SourcePrimeL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourcePrimeL() >>"), RThread().Id().operator TUint())); + const TBool primeable( iCameraDuplicate && ( iState == EStopped ) ); + if ( !primeable ) + { + User::Leave( KErrNotReady ); + } + iAsynchronousReserveIssued = ETrue; + iCameraDuplicate->Reserve(); + User::Leave( KRequestPending ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourcePrimeL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::SourcePlayL +// ----------------------------------------------------------------------------- +// +void CVSOnboardCameraDataProvider::SourcePlayL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourcePlayL() >>"), RThread().Id().operator TUint())); + if ( iState != EPrimed ) + { + User::Leave( KErrNotReady ); + } + ResetStartTime(); + iCameraDuplicate->StartVideoCapture(); + iState = EPlaying; + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourcePlayL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::SourcePauseL +// ----------------------------------------------------------------------------- +// +void CVSOnboardCameraDataProvider::SourcePauseL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourcePauseL() >>"), RThread().Id().operator TUint())); + if ( iState != EPlaying ) + { + return; + } + iCameraDuplicate->StopVideoCapture(); + iState = EPrimed; + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourcePauseL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::SourceStopL +// ----------------------------------------------------------------------------- +// +void CVSOnboardCameraDataProvider::SourceStopL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourceStopL() >>"), RThread().Id().operator TUint())); + if ( iState == EStopped ) + { + return; + } + SourcePauseL(); + iCameraDuplicate->Release(); + iState = EStopped; + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SourceStopL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::SetFormatL +// ----------------------------------------------------------------------------- +// +void CVSOnboardCameraDataProvider::SetFormatL( const TDesC8& aFormat ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SetFormatL() >>"), RThread().Id().operator TUint())); + if ( !iCameraDuplicate ) + { + User::Leave( KErrBadHandle ); + } + TCameraInfo info; + iCameraDuplicate->CameraInfo( info ); + if ( aFormat == KVtVideoMIMETypeYUV420 ) + { + if ( info.iVideoFrameFormatsSupported & CCamera::EFormatYUV420Planar ) + { + iFormat = CCamera::EFormatYUV420Planar; + } + else + { + User::Leave( KErrNotSupported ); + } + } + else + { + User::Leave( KErrNotSupported ); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SetFormatL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::SetFrameRateL +// ----------------------------------------------------------------------------- +// +void CVSOnboardCameraDataProvider::SetFrameRateL( TReal32 aFrameRate ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SetFrameRateL() >>"), RThread().Id().operator TUint())); + if ( !iCameraDuplicate ) + { + User::Leave( KErrBadHandle ); + } + TCameraInfo info; + iCameraDuplicate->CameraInfo( info ); + TBool found = EFalse; + for ( TInt i = 0; i < info.iNumVideoFrameRatesSupported; i++ ) + { + TReal32 rate = 0; + iCameraDuplicate->EnumerateVideoFrameRates( + rate, + i, + iFormat, + iFrameSizeIndex ); + if ( rate == aFrameRate ) + { + iFrameRateIndex = i; + found = ETrue; + break; + } + } + if ( !found ) + { + User::Leave( KErrNotSupported ); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SetFrameRateL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::SetVideoFrameSizeL +// ----------------------------------------------------------------------------- +// +void CVSOnboardCameraDataProvider::SetVideoFrameSizeL( const TSize& aSize ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SetVideoFrameSizeL() >>"), RThread().Id().operator TUint())); + if ( !iCameraDuplicate ) + { + User::Leave( KErrBadHandle ); + } + TCameraInfo info; + iCameraDuplicate->CameraInfo( info ); + TBool found = EFalse; + for ( TInt i = 0; i < info.iNumVideoFrameSizesSupported; i++ ) + { + TSize size; + iCameraDuplicate->EnumerateVideoFrameSizes( size, i, iFormat ); + if ( size == aSize ) + { + iFrameSizeIndex = i; + iFrameSize = size; + found = ETrue; + break; + } + } + if ( !found ) + { + User::Leave( KErrNotSupported ); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::SetVideoFrameSizeL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::GetVideoFrameSizeL +// ----------------------------------------------------------------------------- +// +void CVSOnboardCameraDataProvider::GetVideoFrameSizeL( TSize& aSize ) const + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::GetVideoFrameSizeL() >>"), RThread().Id().operator TUint())); + aSize = iFrameSize; + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::GetVideoFrameSizeL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::ReserveComplete +// ----------------------------------------------------------------------------- +// +void CVSOnboardCameraDataProvider::ReserveComplete( TInt aError ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::ReserveComplete() >>"), RThread().Id().operator TUint())); + if ( !iReserverComplete ) + { + if ( aError == KErrNone ) + { + iReserverComplete = ETrue; + Camera().PowerOn(); + } + else + { + NotifyError( aError ); + } + } + else + { + if( iAsynchronousReserveIssued ) + { + iAsynchronousReserveIssued = EFalse; + + if( aError == KErrNone && iCameraDuplicate ) + { + // Reserve ok, prepare capture next + TRAP( + aError, + iCameraDuplicate->PrepareVideoCaptureL( + iFormat, + iFrameSizeIndex, + iFrameRateIndex, + 2, + 1 ) ); + + if( aError == KErrNone ) + { + TRAP( aError, SetVideoFrameSizeL( TSize( KQCIFWidth, KQCIFHeight ) ) ); + + if( aError == KErrNone ) + { + // Everything ok in PrimeL() + iState = EPrimed; + } + } + } + TMMFEvent event( TUid::Uid( KVtUidDataSrcPrime ), aError ); + iEventHandler->SendEventToClient( event ); + } + else + { + TRequestStatus* statusP = &iSyncReserve->iStatus; + User::RequestComplete( statusP, aError ); + } + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::ReserveComplete() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::FrameBufferReady +// ----------------------------------------------------------------------------- +// +void CVSOnboardCameraDataProvider::FrameBufferReady( + MFrameBuffer* aFrameBuffer, + TInt aError ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::FrameBufferReady() >>"), RThread().Id().operator TUint())); + + iFreezeCS.Wait(); + + if ( aError == KErrNone ) + { + if( iFreezePendingFlags & EVideoFrameFreezePending ) + { + FreezeFrame( aFrameBuffer ); + } + + CVSMMFDataBuffer* buffer = NULL; + + TRAPD( err, buffer = BufferPool().GetBufferL( ETrue ) ); + + if( err == KErrNone ) + { + if ( buffer ) + { + MFrameBuffer* frameBufferToBeUsed = aFrameBuffer; + + if( IsFrozen() && !( iFreezePendingFlags & EVideoFrameFreezePending ) ) + { + iFrozenFrame->CopyProperties( aFrameBuffer ); + aFrameBuffer->Release(); + frameBufferToBeUsed = iFrozenFrame; + } + + TRAP( err, buffer->SetFrameBufferL( frameBufferToBeUsed ) ); + + if ( err != KErrNone ) + { + TInt leaveCode = KErrNone; + TRAP( leaveCode, BufferPool().FreeBufferL( buffer ) ); + } + else + { + buffer->SetTimeToPlay( TimeToPlay() ); + buffer->SetFrameNumber( aFrameBuffer->iIndexOfFirstFrameInBuffer ); + TRAP( err, Consumer()->BufferFilledL( buffer ) ); + if ( err != KErrNone ) + { + TInt leaveCode = KErrNone; + TRAP( leaveCode, BufferPool().FreeBufferL( buffer ) ); + } + } + } + else + { + aFrameBuffer->Release(); + } + } + + if( err != KErrNone ) + { + NotifyError( err ); + } + } + else + { + NotifyError( aError ); + } + + iFreezeCS.Signal(); + + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::FrameBufferReady() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::GetVideoFrameSize +// ----------------------------------------------------------------------------- +// +void CVSOnboardCameraDataProvider::GetVideoFrameSize( + TSize& aSize, + TInt aSizeIndex, + const TDesC8& aFormat ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::GetVideoFrameSize() >>"), RThread().Id().operator TUint())); + TCameraInfo info; + Camera().CameraInfo( info ); + if ( aFormat == KVtVideoMIMETypeYUV420 ) + { + if ( info.iVideoFrameFormatsSupported & CCamera::EFormatYUV420Planar ) + { + Camera().EnumerateVideoFrameSizes( aSize, aSizeIndex, CCamera::EFormatYUV420Planar ); + } + else + { + aSize.SetSize( 0, 0 ); + } + } + else + { + aSize.SetSize( 0, 0 ); + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::GetVideoFrameSize() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::GetVideoFrameRate +// ----------------------------------------------------------------------------- +// +void CVSOnboardCameraDataProvider::GetVideoFrameRate( + TReal32& aRate, + TInt aRateIndex, + const TDesC8& aFormat, + const TSize& aSize ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::GetVideoFrameRate() >>"), RThread().Id().operator TUint())); + TCameraInfo info; + Camera().CameraInfo( info ); + if ( aFormat == KVtVideoMIMETypeYUV420 ) + { + if ( info.iVideoFrameFormatsSupported & CCamera::EFormatYUV420Planar ) + { + TBool found = EFalse; + for ( TInt i = 0; i < info.iNumVideoFrameSizesSupported; i++ ) + { + TSize size; + Camera().EnumerateVideoFrameSizes( + size, + i, + CCamera::EFormatYUV420Planar ); + if ( size == aSize ) + { + Camera().EnumerateVideoFrameRates( + aRate, + aRateIndex, + CCamera::EFormatYUV420Planar, + i ); + found = ETrue; + break; + } + } + if ( !found ) + { + aRate = 0.0; + } + } + else + { + aRate = 0.0; + } + } + else + { + aRate = 0.0; + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::GetVideoFrameRate() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::FreezeFrame +// ----------------------------------------------------------------------------- +// +void CVSOnboardCameraDataProvider::FreezeFrame( MFrameBuffer* aFrameBuffer ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::FreezeFrame() >>"), RThread().Id().operator TUint())); + + TRAPD( error, iFrozenFrame->CopyFrameL( aFrameBuffer ) ); + + if( error != KErrNone ) + { + Observer().vsProviderError( error ); + } + else + { + iFreezePendingFlags &= ~EVideoFrameFreezePending; + } + + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::FreezeFrame() <<"), RThread().Id().operator TUint())); + } +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::FreezeFrame +// ----------------------------------------------------------------------------- +// +void CVSOnboardCameraDataProvider::FreezeFrame( MCameraBuffer* aCameraBuffer ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::FreezeFrame() >>"), RThread().Id().operator TUint())); + + TRAPD( error, iFrozenFrame->CopyFrameL( aCameraBuffer ) ); + + if( error != KErrNone ) + { + Observer().vsProviderError( error ); + } + else + { + iFreezePendingFlags &= ~EVideoFrameFreezePending; + } + + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::FreezeFrame() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::HandleEvent +// ----------------------------------------------------------------------------- +// +void CVSOnboardCameraDataProvider::HandleEvent( const TECAMEvent& aEvent ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::HandleEvent() event %d>>"), + RThread().Id().operator TUint(), aEvent.iEventType )); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::HandleEvent() iErrorCode %d>"), + RThread().Id().operator TUint(), aEvent.iErrorCode )); + //Needs to handled first + if( aEvent.iEventType == KUidECamEventCameraNoLongerReserved ) + { + iCameraLost = ETrue; + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::HandleEvent() Camera lost>>"), + RThread().Id().operator TUint())); + NotifyError( KVsErrCameraNoLongerReserved ); + } + //Do not care errors that occures if camera is lost + if ( aEvent.iErrorCode != KErrNone ) + { + if ( iCameraLost ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::HandleEvent() Camera lost error<<"), + RThread().Id().operator TUint())); + return; + } + } + // Gets called twice for both threads + if ( aEvent.iEventType == KUidECamEventReserveComplete ) + { + ReserveComplete( aEvent.iErrorCode ); + } + else if( aEvent.iEventType == KUidECamEventPowerOnComplete ) + { + PowerOnComplete( aEvent.iErrorCode ); + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSOnboardCameraDataProvider::HandleEvent() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::ViewFinderReady +// ----------------------------------------------------------------------------- +// +void CVSOnboardCameraDataProvider::ViewFinderReady( MCameraBuffer& aCameraBuffer,TInt aError ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::ViewFinderReady() error %d >>"), RThread().Id().operator TUint(), aError )); + // If error occures notify observer + if ( aError != KErrNone && !iCameraLost ) + { + NotifyError( aError ); + return; + } + // If camera has been lost do nothing + // because event to indicate cameralost has come or is coming + else if ( iCameraLost ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::ViewFinderReady() Camera lost<<"), + RThread().Id().operator TUint())); + return; + } + // If there is more than 1 frame in buffer + // something has went wrong and error (-38) has occured + if ( aCameraBuffer.NumFrames() > 1 ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::ViewFinderReady() FRAMES [%d] IN BUFFER >>"), + RThread().Id().operator TUint(), aCameraBuffer.NumFrames())); + } + + //Duplicate camera buffers the newest bitmap + //In case of error release buffer and notify observer + if ( !iDublicatedBitmap ) + { + aCameraBuffer.Release(); + NotifyError( KErrBadDescriptor ); + return; + } + iDublicatedBitmap->BeginDataAccess(); + TRAPD( err, iDublicatedBitmap->Duplicate( aCameraBuffer.BitmapL( aCameraBuffer.NumFrames() - 1 ).Handle() ) ); + iDublicatedBitmap->EndDataAccess(); + if( err != KErrNone ) + { + aCameraBuffer.Release(); + NotifyError( KErrBadDescriptor ); + return; + } + + // Send dublicated bitmap to UI + ViewFinderFrameReady( *iDublicatedBitmap ); + + //Release camera buffer for further usage + aCameraBuffer.Release(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::ViewFinderReady() <<"), + RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSOnboardCameraDataProvider::VideoBufferReady +// ----------------------------------------------------------------------------- +// +void CVSOnboardCameraDataProvider::VideoBufferReady( MCameraBuffer& aCameraBuffer,TInt aError ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::VideoBufferReady() >>"), RThread().Id().operator TUint())); + + iFreezeCS.Wait(); + + // If there is more than 1 frame in buffer + // print it out + // calculate delta which indicates how many frames are skipped + TInt delta = 0; + if ( aCameraBuffer.NumFrames() > 1 ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::VideoBufferReady() FRAMES [%d] IN BUFFER >>"), + RThread().Id().operator TUint(), aCameraBuffer.NumFrames())); + delta = aCameraBuffer.NumFrames() - 1; + } + + if ( aError == KErrNone ) + { + if( iFreezePendingFlags & EVideoFrameFreezePending ) + { + FreezeFrame( &aCameraBuffer ); + } + + CVSMMFDataBuffer* buffer = NULL; + + TRAPD( err, buffer = BufferPool().GetBufferL( ETrue ) ); + + if( err == KErrNone ) + { + if ( buffer ) + { + MCameraBuffer* cameraBufferToBeUsed = &aCameraBuffer; + + if( IsFrozen() && !( iFreezePendingFlags & EVideoFrameFreezePending ) ) + { + iFrozenFrame->CopyProperties( &aCameraBuffer ); + ( &aCameraBuffer )->Release(); + cameraBufferToBeUsed = iFrozenFrame; + } + + TRAP( err, buffer->SetFrameBufferL( cameraBufferToBeUsed ) ); + + if ( err != KErrNone ) + { + TInt leaveCode = KErrNone; + TRAP( leaveCode, BufferPool().FreeBufferL( buffer ) ); + } + else + { + buffer->SetTimeToPlay( TimeToPlay() ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::VideoBufferReady() iIndexOfFirstFrameInBuffer [%d]>>"), + RThread().Id().operator TUint(), aCameraBuffer.iIndexOfFirstFrameInBuffer + delta)); + buffer->SetFrameNumber( ( &aCameraBuffer )->iIndexOfFirstFrameInBuffer + delta ); + TRAP( err, Consumer()->BufferFilledL( buffer ) ); + if ( err != KErrNone ) + { + TInt leaveCode = KErrNone; + TRAP( leaveCode, BufferPool().FreeBufferL( buffer ) ); + } + } + } + else + { + ( &aCameraBuffer )->Release(); + } + } + else + { + NotifyError( err ); + } + } + else + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::VideoBufferReady() Camera lost"), + RThread().Id().operator TUint())); + if ( !iCameraLost ) + { + NotifyError( aError ); + } + } + iFreezeCS.Signal(); + + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSOnboardCameraDataProvider::VideoBufferReady() <<"), RThread().Id().operator TUint())); + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/src/CVSStillImageDataProvider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/src/CVSStillImageDataProvider.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,1191 @@ +/* +* 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 +#include +#include +#include + +#include "CVSStillImageDataProvider.h" +#include "CVSDataSourceImp.h" +#include "VSPanic.h" +#include "cvtimagebitmap.h" +#include "CVSMMFDataBuffer.h" + +#include "cmultiframeprovider.h" + +// EXTERNAL FUNCTION PROTOTYPES + +// MACROS + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// LOCAL CONSTANTS AND MACROS + +static const TInt KMinZoom = 0; +static const TInt KMaxZoom = 0; +static const TInt KMaxDigitalZoom = 0; +static const TReal32 KMinZoomFactor = 0.0; +static const TReal32 KMaxZoomFactor = 0.0; +static const TReal32 KMaxDigitalZoomFactor = 1.0; +static const TInt KNumVideoSizesSupported = 1; +static const TInt KNumVideoFrameSizesSupported = 1; +static const TInt KNumVideoFrameRatesSupported = 1; +static const TInt KMaxFramesPerBufferSupported = 1; +static const TInt KQcifWidth = 176; +static const TInt KQcifHeight = 144; +static const TReal32 KFrameRate = 15.0; +static const TUint32 KVSViewFinderUpdateRate = 1000000/15; // 15 times per second + +// TYPE DEFINITIONS + +// Timer expired callback + +typedef void (CVSStillImageDataProvider::*TTimerElapsed) (); + +// INTERNAL CLASSES + +/** +* Timer class that calls given callback method when timer request has been +* completed. If the timer request is cancelled then callback will not be +* called. +* +* @lib videosource.lib +*/ +class CVSFrameRateTimer : public CTimer + { + public: // Constructors and destructor + + /** + * Static factory function to create instance of this class. + * @param "aRequester" ?description + * @exception Can leave with one of the system wide error codes. + * @return Pointer to new instance. + */ + static CVSFrameRateTimer* NewL( CVSStillImageDataProvider* aRequester ); + + public: // New functions + + public: // Functions from base classes + + /** + * Starts timer request. When timer request has been completed given + * callback method will be called. + * @param "anInterval" Interval after which event is to occur, + * in microseconds. + * @param "aFunction" Callback method that will be called when timer + * request has been completed. + */ + void After( + TTimeIntervalMicroSeconds32 anInterval, + TTimerElapsed aFunction ); + + public: // Constructors and destructor + + /** + * Destructor. + */ + ~CVSFrameRateTimer(); + + protected: // New functions + + protected: // Functions from base classes + + private: // Constructors and destrcutor + + /** + * Constructor. + * @param "aRequester" ?description + */ + CVSFrameRateTimer( CVSStillImageDataProvider* aRequester ); + + private: // New functions + + private: // Functions from base classes + + /** + * From CActive. See CActive for description. + */ + void RunL(); + + public: // Data + + protected: // Data + + private: // Data + + // Pointer to requester (i.e. through which callback call will be made) + CVSStillImageDataProvider* iRequester; // not owned + + // Pointer to callback method. + TTimerElapsed iFunction; + }; + +// ============================ MEMBER FUNCTIONS =============================== + +// ============================ CVSFrameRateTimer ============================== + +// ----------------------------------------------------------------------------- +// CVSFrameRateTimer::NewL( CVSStillImageDataProvider* aRequester ) +// ----------------------------------------------------------------------------- +// +CVSFrameRateTimer* CVSFrameRateTimer::NewL( + CVSStillImageDataProvider* aRequester ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSFrameRateTimer::NewL() >>"), RThread().Id().operator TUint())); + CVSFrameRateTimer* self = new (ELeave) CVSFrameRateTimer( aRequester ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); // self + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSFrameRateTimer::NewL() <<"), RThread().Id().operator TUint())); + return self; + } + +// ----------------------------------------------------------------------------- +// CVSFrameRateTimer::CVSFrameRateTimer( CVSStillImageDataProvider* aRequester ) +// ----------------------------------------------------------------------------- +// +CVSFrameRateTimer::CVSFrameRateTimer( CVSStillImageDataProvider* aRequester ) +: CTimer( EPriorityStandard ), iRequester( aRequester ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSFrameRateTimer::CVSFrameRateTimer() >>"), RThread().Id().operator TUint())); + // Added to CActiveScheduler in CVSStillImageDataProvider::InitializeL + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSFrameRateTimer::CVSFrameRateTimer() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSFrameRateTimer::After( +// TTimeIntervalMicroSeconds32 anInterval, TTimerElapsed aFunction ) +// ----------------------------------------------------------------------------- +// +void CVSFrameRateTimer::After( + TTimeIntervalMicroSeconds32 anInterval, + TTimerElapsed aFunction ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSFrameRateTimer::After() >>"), RThread().Id().operator TUint())); + if ( iFunction == aFunction ) + { + if ( !IsActive() ) + { + iFunction = aFunction; + CTimer::After( anInterval ); + } + } + else + { + if ( !IsActive() ) + { + iFunction = aFunction; + CTimer::After( anInterval ); + } + else + { + User::Panic(_L("VideoSource"),KErrGeneral); + } + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSFrameRateTimer::After() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSFrameRateTimer::~CVSFrameRateTimer() +// ----------------------------------------------------------------------------- +// +CVSFrameRateTimer::~CVSFrameRateTimer() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSFrameRateTimer::~CVSFrameRateTimer() >>"), RThread().Id().operator TUint())); + Cancel(); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSFrameRateTimer::~CVSFrameRateTimer() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSFrameRateTimer::RunL() +// ----------------------------------------------------------------------------- +// +void CVSFrameRateTimer::RunL() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSFrameRateTimer::RunL() >>"), RThread().Id().operator TUint())); + if( iStatus.Int() == KErrNone ) + { + (iRequester->*iFunction)(); + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSFrameRateTimer::RunL() <<"), RThread().Id().operator TUint())); + } + +// ============================ CVSStillImageDataProvider =============================== + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::NewL( +// MVSDataProviderObserver* aObserver, MVSBufferPool* aPool ) +// ----------------------------------------------------------------------------- +// +CVSStillImageDataProvider* CVSStillImageDataProvider::NewL( + MVSDataProviderObserver* aObserver, + MVSBufferPool* aPool ) + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CVSStillImageDataProvider::NewL() >>"), RThread().Id().operator TUint())); + CVSStillImageDataProvider* self = + new (ELeave) CVSStillImageDataProvider( aObserver, aPool ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + __IF_DEBUG(Print(_L("VideoSource: [%d] CVSStillImageDataProvider::NewL() <<"), RThread().Id().operator TUint())); + return self; + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::~CVSStillImageDataProvider() +// ----------------------------------------------------------------------------- +// +CVSStillImageDataProvider::~CVSStillImageDataProvider() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::~CVSStillImageDataProvider() this %x >>"), RThread().Id().operator TUint(), this)); + iFs.Close(); + delete iVFTimer; + delete iActiveWait; + delete iViewer; + iFreezeCS.Close(); + delete iScaled; + ReleaseYUVData(); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::~CVSStillImageDataProvider() this %x <<"), RThread().Id().operator TUint(), this)); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::InitializeL( const TDesC8& aInitParams ) +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::InitializeL( const TDesC8& aInitParams ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::InitializeL() >>"), RThread().Id().operator TUint())); + + CommonInitializeL(); + + TPckgBuf< TVSStillImageDataProviderParams > pb; + pb.Copy( aInitParams ); + + iInitType = pb().iInitialize; + iPSState = EPSInitializing; + + switch( pb().iInitialize ) + { + /** Initialize from blank image */ + case TVSStillImageDataProviderParams::EInitializeAsBlankImage: + BlankImageInitializeL(); + break; + + /** Initialize from General Settings */ + case TVSStillImageDataProviderParams::EInitializeFromGeneralSettings: + GeneralSettingsInitializeL( EGSStillImage ); + break; + + /** Initilaize from General Settings*/ + case TVSStillImageDataProviderParams::EInitializeAsDefaultStillImage: + GeneralSettingsInitializeL( EGSDefaultStillImage ); + break; + + /** Initialize from file */ + case TVSStillImageDataProviderParams::EInitializeFromFile: + FileImageInitializeL( pb().iFileName ); + break; + } + + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::InitializeL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::CommonInitializeL() +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::CommonInitializeL() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::CommonInitializeL() >>"), RThread().Id().operator TUint())); + iVFTimer = CVSFrameRateTimer::NewL( this ); + CActiveScheduler::Add( iVFTimer ); + iActiveWait = new (ELeave) CVSActiveWait< CVSStillImageDataProvider > ( this ); + + //Create viewer + iViewer = CMultiframeProvider::NewL( this , iDisplayMode ); + User::LeaveIfError( iFreezeCS.CreateLocal() ); + + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::CommonInitializeL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::GeneralSettingsInitializeL() +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::GeneralSettingsInitializeL( const TGeneralSettingsImageType aType ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::GeneralSettingsInitializeL() >>"), RThread().Id().operator TUint())); + iViewer->IniatializeGSL( aType ); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::GeneralSettingsInitializeL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::BlankImageInitializeL() +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::BlankImageInitializeL() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::BlankImageInitializeL() %x >>"), RThread().Id().operator TUint(), this)); + iViewer->IniatializeBlankL(); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::BlankImageInitializeL() %x <<"), RThread().Id().operator TUint(), this)); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::FileImageInitializeL +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::FileImageInitializeL( const TFileName& aFileName ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::FileImageInitializeL(): %S >>"), RThread().Id().operator TUint(), &aFileName )); + iViewer->InitializeL( &aFileName ); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::FileImageInitializeL() %x <<"), RThread().Id().operator TUint(), this)); + } + + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::DigitalZoomFactor() const +// ----------------------------------------------------------------------------- +// +TInt CVSStillImageDataProvider::DigitalZoomFactor() const + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::DigitalZoomFactor() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::DigitalZoomFactor() <<"), RThread().Id().operator TUint())); + return KMaxDigitalZoom; + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::SetDigitalZoomFactorL( +// TInt /*aDigitalZoomFactor*/ ) +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::SetDigitalZoomFactorL( + TInt /*aDigitalZoomFactor*/ ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::SetDigitalZoomFactorL() >>"), RThread().Id().operator TUint())); + User::Leave( KErrNotSupported ); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::SetDigitalZoomFactorL() <<"), RThread().Id().operator TUint())); + } +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::StartViewFinderBitmapsL( TSize& aSize ) +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::StartViewFinderBitmapsL( TSize& aSize ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::StartViewFinderBitmapsL() >>"), RThread().Id().operator TUint())); + __ASSERT_DEBUG( iPSState > EPSUninitialized, + Panic( EVSPanicProviderNotReady ) ); + iVFState = EVFPlaying; + iViewer->ClearVFScalingTargetSize(); + iTargetSize = aSize; + iViewer->SetVFScalingTargetSize( aSize ); + iViewer->ScaleCopy( aSize, ETrue ); + iViewer->IncreaseDataConsumer(); + iViewer->NextFrame(); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::StartViewFinderBitmapsL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::StartViewFinderBitmapsL( +// TSize& /*aSize*/, TRect& /*aClipRect*/ ) +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::StartViewFinderBitmapsL( + TSize& /*aSize*/, + TRect& /*aClipRect*/ ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::StartViewFinderBitmapsL() >>"), RThread().Id().operator TUint())); + User::Leave( KErrNotSupported ); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::StartViewFinderBitmapsL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::StopViewFinder() +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::StopViewFinder() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::StopViewFinder() >>"), RThread().Id().operator TUint())); + // Make sure scaler is cancelled (just in case!) + iViewer->ClearVFScalingTargetSize(); + iViewer->DecreaseDataConsumer(); + iViewer->SetVFStop(); + // No double stopping.. + if( iVFState != EVFStopped ) + { + iVFState = EVFStopped; + iVFTimer->Cancel(); + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::StopViewFinder() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::ViewFinderActive() const +// ----------------------------------------------------------------------------- +// +TBool CVSStillImageDataProvider::ViewFinderActive() const + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::ViewFinderActive() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::ViewFinderActive() <<"), RThread().Id().operator TUint())); + return ( iVFState == EVFPlaying ); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::StartViewFinderDirectL( +// RWsSession& /*aWs*/, CWsScreenDevice& /*aScreenDevice*/, +// RWindowBase& /*aWindow*/, TRect& /*aScreenRect*/ ) +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::StartViewFinderDirectL( + RWsSession& /*aWs*/, + CWsScreenDevice& /*aScreenDevice*/, + RWindowBase& /*aWindow*/, + TRect& /*aScreenRect*/ ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::StartViewFinderDirectL() >>"), RThread().Id().operator TUint())); + User::Leave(KErrNotSupported); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::StartViewFinderDirectL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::StartViewFinderDirectL( +// RWsSession& /*aWs*/, CWsScreenDevice& /*aScreenDevice*/, +// RWindowBase& /*aWindow*/, TRect& /*aScreenRect*/, TRect& /*aClipRect*/ ) +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::StartViewFinderDirectL( + RWsSession& /*aWs*/, + CWsScreenDevice& /*aScreenDevice*/, + RWindowBase& /*aWindow*/, + TRect& /*aScreenRect*/, + TRect& /*aClipRect*/ ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::StartViewFinderDirectL() >>"), RThread().Id().operator TUint())); + User::Leave(KErrNotSupported); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::StartViewFinderDirectL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::ProviderInfo( TVSDataProviderInfo& aInfo ) +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::ProviderInfo( TVSDataProviderInfo& aInfo ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::ProviderInfo() >>"), RThread().Id().operator TUint())); + Mem::FillZ( &aInfo, sizeof( aInfo ) ); + aInfo.iHardwareVersion = TVersion( 0, 0, 0 ); + aInfo.iSoftwareVersion = TVersion( 0, 0, 0 ); + aInfo.iOrientation = TCameraInfo::EOrientationUnknown; + aInfo.iOptionsSupported = TCameraInfo::EViewFinderBitmapsSupported | + TCameraInfo::EVideoCaptureSupported; + aInfo.iFlashModesSupported = CCamera::EFlashNone; + aInfo.iExposureModesSupported = CCamera::EExposureAuto; + aInfo.iWhiteBalanceModesSupported = CCamera::EWBAuto; + aInfo.iMinZoom = KMinZoom; + aInfo.iMaxZoom = KMaxZoom; + aInfo.iMaxDigitalZoom = KMaxDigitalZoom; + aInfo.iMinZoomFactor = KMinZoomFactor; + aInfo.iMaxZoomFactor = KMaxZoomFactor; + aInfo.iMaxDigitalZoomFactor = KMaxDigitalZoomFactor; + aInfo.iImageFormatsSupported = CCamera::EFormatFbsBitmapColor64K | + CCamera::EFormatFbsBitmapColor16M; + aInfo.iNumVideoFrameSizesSupported = KNumVideoSizesSupported; + aInfo.iNumVideoFrameSizesSupported = KNumVideoFrameSizesSupported; + aInfo.iNumVideoFrameRatesSupported = KNumVideoFrameRatesSupported; + aInfo.iVideoFrameFormatsSupported = CCamera::EFormatYUV420Planar; + aInfo.iMaxFramesPerBufferSupported = KMaxFramesPerBufferSupported; + aInfo.iFreezeSupported = EFalse; + + aInfo.iSupportedColorTones = + CCamera::CCameraImageProcessing::EEffectNone; + + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::ProviderInfo() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::SetViewFinderMirrorL +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::SetViewFinderMirrorL( TBool /*aMirror*/ ) + { + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::ViewFinderMirror +// ----------------------------------------------------------------------------- +// +TBool CVSStillImageDataProvider::ViewFinderMirror() const + { + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::FreezeL +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::FreezeL() + { + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::UnfreezeL +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::UnfreezeL() + { + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::IsFrozen +// ----------------------------------------------------------------------------- +// +TBool CVSStillImageDataProvider::IsFrozen() const + { + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::PrimeL +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::PrimeL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::PrimeL() &%x >>"), RThread().Id().operator TUint(), this)); + SourcePrimeL(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::PrimeL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::FillBufferL( +// CMMFBuffer* aBuffer, MVTVideoSink* aConsumer, TMediaId aMediaId ) +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::FillBufferL( + CMMFBuffer* /*aBuffer*/, + MVTVideoSink* /*aConsumer*/, + TMediaId /*aMediaId*/ ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::FillBufferL() &%x >>"), RThread().Id().operator TUint(),this)); + if ( iPSState != EPSPlaying ) + { + User::Leave( KErrNotReady ); + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::FillBufferL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::BufferEmptiedL( CMMFBuffer* /*aBuffer*/ ) +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::BufferEmptiedL( CMMFBuffer* /*aBuffer*/ ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::BufferEmptiedL() >>"), RThread().Id().operator TUint())); + User::Leave( KErrNotSupported ); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::BufferEmptiedL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::SourceThreadLogon( +// MAsyncEventHandler& /*aEventHandler*/ ) +// ----------------------------------------------------------------------------- +// +TInt CVSStillImageDataProvider::SourceThreadLogon( + MAsyncEventHandler& /*aEventHandler*/ ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::SourceThreadLogon() &%x >>"), RThread().Id().operator TUint(),this)); + __ASSERT_DEBUG( iPSState > EPSUninitialized, + Panic( EVSPanicProviderNotReady ) ); + TRAPD( err, CreateProtoTimerL() ); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::SourceThreadLogon() <<"), RThread().Id().operator TUint())); + return err; + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::SourceThreadLogoff() +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::SourceThreadLogoff() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::SourceThreadLogoff() &%x >>"), RThread().Id().operator TUint(),this)); + ReleaseProtoTimer(); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::SourceThreadLogoff() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::SourcePrimeL() +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::SourcePrimeL() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::SourcePrimeL() &%x >>"), RThread().Id().operator TUint(),this)); + iPSState = EPSPrimed; + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::SourcePrimeL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::SourcePlayL() +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::SourcePlayL() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::SourcePlayL() &%x >>"), RThread().Id().operator TUint(),this)); + iPSState = EPSPlaying; + iFrameCount = 0; + ResetStartTime(); + iViewer->IncreaseDataConsumer(); + iProtoTimer->After( iProtoUpdateRate, &CVSStillImageDataProvider::ProtoTimer ); + iViewer->NextFrame(); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::SourcePlayL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::SourcePauseL() +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::SourcePauseL() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::SourcePauseL() &%x >>"), RThread().Id().operator TUint(),this)); + if ( iProtoTimer != NULL ) + { + iProtoTimer->Cancel(); + } + iPSState = EPSPrimed; + iViewer->DecreaseDataConsumer(); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::SourcePauseL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::SourceStopL() +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::SourceStopL() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::SourceStopL() &%x >>"), RThread().Id().operator TUint(),this)); + if ( iProtoTimer != NULL ) + { + iProtoTimer->Cancel(); + } + iPSState = EPSStopped; + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::SourceStopL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::SetFormatL( const TDesC8& aFormat ) +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::SetFormatL( const TDesC8& aFormat ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::SetFormatL() &%x >>"), RThread().Id().operator TUint(),this)); + if ( aFormat != KVtVideoMIMETypeYUV420 ) + { + User::Leave( KErrNotSupported ); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::SetFormatL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::SetFrameRateL( TReal32 aFrameRate ) +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::SetFrameRateL( TReal32 aFrameRate ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::SetFrameRateL() &%x >>"), RThread().Id().operator TUint(),this)); + if ( aFrameRate != KFrameRate ) + { + User::Leave( KErrNotSupported ); + } + iProtoUpdateRate = static_cast( 1000000.0 / aFrameRate ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::SetFrameRateL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::SetVideoFrameSizeL( const TSize& aSize ) +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::SetVideoFrameSizeL( const TSize& aSize ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::SetVideoFrameSizeL() &%x >>"), RThread().Id().operator TUint(),this)); + if( aSize != TSize( KQcifWidth, KQcifHeight ) ) + { + User::Leave( KErrNotSupported ); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::SetVideoFrameSizeL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::GetVideoFrameSizeL( TSize& aSize ) const +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::GetVideoFrameSizeL( TSize& aSize ) const + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::GetVideoFrameSizeL() &%x >>"), RThread().Id().operator TUint(),this)); + aSize = TSize( KQcifWidth, KQcifHeight ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::GetVideoFrameSizeL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::VFTimer() +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::VFTimer() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::VFTimer() >>"), RThread().Id().operator TUint())); + if( iVFState == EVFPlaying ) + { + Observer().vsViewFinderFrameReady( iVFBitmap->Bitmap() ); + iVFTimer->After( KVSViewFinderUpdateRate, &CVSStillImageDataProvider::VFTimer ); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::VFTimer() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::ProtoTimer() +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::ProtoTimer() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::ProtoTimer() this %x >>"), RThread().Id().operator TUint(), this)); + iFrameCount++; + CVSMMFDataBuffer* buffer = NULL; + TRAPD( err, buffer = BufferPool().GetBufferL( ETrue ) ); + if ( err != KErrNone ) + { + NotifyError( err ); + } + if( buffer ) + { + buffer->SetFrameNumber( iFrameCount ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::ProtoTimer(): iFrameCount %d"), RThread().Id().operator TUint(), iFrameCount)); + buffer->SetTimeToPlay( TimeToPlay() ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::ProtoTimer(): SetTimeToPlay() = $%08x:$%08x"), RThread().Id().operator TUint(), I64HIGH( buffer->TimeToPlay().Int64() ), I64LOW( buffer->TimeToPlay().Int64() ) )); + iFreezeCS.Wait(); + buffer->Data() = *iYUVBuffer; + iFreezeCS.Signal(); + TRAPD( err, Consumer()->BufferFilledL( buffer ) ); + if( err != KErrNone ) + { + TInt leaveCode = KErrNone; + TRAP( leaveCode, BufferPool().FreeBufferL( buffer ) ); + NotifyError( err ); + } + } + else + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::ProtoTimer(): GetBufferL() returned NULL"), RThread().Id().operator TUint())); + } + // Just to make sure that we're actually playing. We also check that + // iProtoTimer still exists BECAUSE BufferFilledL() may call + // SourceThreadLogoff() if a switch is pending + if( iProtoTimer && ( iPSState == EPSPlaying ) ) + { + iProtoTimer->After( iProtoUpdateRate, &CVSStillImageDataProvider::ProtoTimer ); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::ProtoTimer() this %x <<"), RThread().Id().operator TUint(), this)); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::CreateProtoTimerL() +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::CreateProtoTimerL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::CreateProtoTimerL() >>"), RThread().Id().operator TUint())); + iProtoTimer = CVSFrameRateTimer::NewL( this ); + CActiveScheduler::Add( iProtoTimer ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::CreateProtoTimerL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::ReleaseProtoTimer() +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::ReleaseProtoTimer() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::ReleaseProtoTimer() >>"), RThread().Id().operator TUint())); + delete iProtoTimer; + iProtoTimer = 0; + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::ReleaseProtoTimer() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::CreateYUVDataL() +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::CreateYUVDataL() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::CreateYUVDataL() this %x >>"), RThread().Id().operator TUint(), this)); + CVSFbsBitmapIYUVConverter* conv = + CVSFbsBitmapIYUVConverter::NewL( iYUVBitMap->Bitmap() ); + CleanupStack::PushL( conv ); + conv->ProcessL(); + iFreezeCS.Wait(); + ReleaseYUVData(); + iYUVBuffer = conv->YUVData().AllocL(); + iFreezeCS.Signal(); + CleanupStack::PopAndDestroy(); // conv + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::CreateYUVDataL() iYUVBuffer %x <<"), RThread().Id().operator TUint(), iYUVBuffer)); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::ReleaseYUVData() +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::ReleaseYUVData() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::ReleaseYUVData() >>"), RThread().Id().operator TUint())); + delete iYUVBuffer; + iYUVBuffer = 0; + __IF_DEBUG(Print(_L("VideoSource[%d]: CVSStillImageDataProvider::ReleaseYUVData() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::CVSStillImageDataProvider( +// MVSDataProviderObserver* aObserver ) +// ----------------------------------------------------------------------------- +// +CVSStillImageDataProvider::CVSStillImageDataProvider( + MVSDataProviderObserver* aObserver, + MVSBufferPool* aPool ) : + CVSDataProvider( aObserver, aPool ), iProtoUpdateRate( 1000000.0 / KFrameRate ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::CVSStillImageDataProvider() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::CVSStillImageDataProvider() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::ConstructL() +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::ConstructL() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::ConstructL() this %x >>"), RThread().Id().operator TUint(), this)); + CVSDataProvider::ConstructL(); + User::LeaveIfError( iFs.Connect() ); + RWsSession wsSession; + User::LeaveIfError( wsSession.Connect() ); + CleanupClosePushL( wsSession ); + CWsScreenDevice* wsScreenDevice = new ( ELeave ) CWsScreenDevice( wsSession ); + CleanupStack::PushL( wsScreenDevice ); + User::LeaveIfError( wsScreenDevice->Construct() ); + //iDisplayMode = wsScreenDevice->DisplayMode();/* = EColor16MU;*/ + iDisplayMode = EColor16MU; + CleanupStack::PopAndDestroy( 2 ); // wsSession, wsScreenDevice + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::ConstructL() this %x <<"), RThread().Id().operator TUint(), this)); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::GetVideoFrameSize( +// TSize& aSize, TInt /*aSizeIndex*/, const TDesC8& aFormat ) +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::GetVideoFrameSize( + TSize& aSize, + TInt /*aSizeIndex*/, + const TDesC8& aFormat ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::GetVideoFrameSize() >>"), RThread().Id().operator TUint())); + if ( aFormat == KVtVideoMIMETypeYUV420 ) + { + aSize.SetSize( KQcifWidth, KQcifHeight ); + } + else + { + aSize.SetSize( 0, 0 ); + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::GetVideoFrameSize() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::GetVideoFrameRate( +// TReal32& aRate, TInt /*aRateIndex*/, const TDesC8& aFormat, +// const TSize& aSize ) +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::GetVideoFrameRate( + TReal32& aRate, + TInt /*aRateIndex*/, + const TDesC8& aFormat, + const TSize& aSize ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::GetVideoFrameRate() >>"), RThread().Id().operator TUint())); + if ( aFormat == KVtVideoMIMETypeYUV420 && + aSize == TSize( KQcifWidth, KQcifHeight ) ) + { + aRate = KFrameRate; + } + else + { + aRate = 0.0; + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::GetVideoFrameRate() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::DisplayMode +// ----------------------------------------------------------------------------- +// +TDisplayMode CVSStillImageDataProvider::DisplayMode() const + { +#ifdef _DEBUG + TUint threadId( RThread().Id() ); + switch( iDisplayMode ) + { + case EColor4K: + RDebug::Print( _L( "VideoSource [%d]: DisplayMode() = EColor4K" ), threadId ); + break; + case EColor64K: + RDebug::Print( _L( "VideoSource [%d]: DisplayMode() = EColor64K" ), threadId ); + break; + case EColor16M: + RDebug::Print( _L( "VideoSource [%d]: DisplayMode() = EColor16M" ), threadId ); + break; + case EColor16MU: + RDebug::Print( _L( "VideoSource [%d]: DisplayMode() = EColor16MU" ), threadId ); + break; + default: + RDebug::Print( _L( "VideoSource [%d]: DisplayMode() = %d" ), threadId, iDisplayMode ); + break; + } +#endif // _DEBUG + return iDisplayMode; + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::SetContrastL +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::SetContrastL(TInt /*aContrast*/) + { + __IF_DEBUG(Print(_L("VideoSource [%d]:CVSStillImageDataProvider::SetContrastL() LEAVE"), RThread().Id().operator TUint())); + User::Leave( KErrNotSupported ); + } +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::GetContrast +// ----------------------------------------------------------------------------- +// +TInt CVSStillImageDataProvider::GetContrast(TInt& /*aContrast*/) const + { + return KErrNotSupported; + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::SetBrightnessL +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::SetBrightnessL(TInt /*aBrightness*/) + { + __IF_DEBUG(Print(_L("VideoSource [%d]:CVSStillImageDataProvider::SetBrightnessL() LEAVE"), RThread().Id().operator TUint())); + User::Leave( KErrNotSupported ); + } +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::GetBrightness +// ----------------------------------------------------------------------------- +// +TInt CVSStillImageDataProvider::GetBrightness(TInt& /*aBrightness*/ ) const + { + return KErrNotSupported; + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::SetWhiteBalanceL +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::SetWhiteBalanceL( CCamera::TWhiteBalance /*aWhiteBalance*/ ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::SetWhiteBalanceL() LEAVE"), RThread().Id().operator TUint())); + User::Leave( KErrNotSupported ); + } +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::GetWhiteBalance +// ----------------------------------------------------------------------------- +// + TInt CVSStillImageDataProvider::GetWhiteBalance(CCamera::TWhiteBalance& /*aWhiteBalance*/) const + { + return KErrNotSupported; + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::SetColorToneL +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::SetColorToneL( CCamera::CCameraImageProcessing::TEffect /*aValue*/ ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::SetColorToneL() LEAVE"), RThread().Id().operator TUint())); + User::Leave( KErrNotSupported ); + } +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::GetColorTone +// ----------------------------------------------------------------------------- +// +TInt CVSStillImageDataProvider::GetColorTone( CCamera::CCameraImageProcessing::TEffect& /*aColorTone*/ ) const + { + return KErrNotSupported; + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::InitializeReady +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::InitializeReady() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::InitializeReady()>> "), RThread().Id().operator TUint())); + if ( EPSUndoInitializing == iPSState ) + { + NotifyError(KErrCancel); + UndoCommonInitialized(); + iPSState = EPSUninitialized; + } + else + { + iPSState = EPSStopped; + Observer().vsProviderReady(); + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::InitializeReady()<< "), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::RefreshYUVData +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::RefreshYUVData( TImageShareDataBuffer& aYUVBitMap ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::RefreshYUVData()>> "), RThread().Id().operator TUint())); + iYUVBitMap = aYUVBitMap.iBitmap; + //Create YUV buffer only in play state + TRAP_IGNORE ( CreateYUVDataL() ); + aYUVBitMap.iIsBitmapFree = ETrue; + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::RefreshYUVData()<< "), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::RefreshViewFinder +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::RefreshViewFinder( TImageShareDataBuffer& aVFBitMap ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::RefreshViewFinder()>> "), RThread().Id().operator TUint())); + iVFBitmap = aVFBitMap.iBitmap; + aVFBitMap.iIsBitmapFree = ETrue; + // Allow VF refresh only if size is what + // has beed aquired and play state is on + if ( ( iTargetSize == iVFBitmap->Size() ) && ( iVFState == EVFPlaying ) ) + { + iVFTimer->After( 1, &CVSStillImageDataProvider::VFTimer ); + } + else + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::RefreshViewFinder() conditon doesn't match, iVFState[%d] "), RThread().Id().operator TUint(), iVFState)); + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::RefreshViewFinder()<< "), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::NotifyImageHandlingError +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::NotifyImageHandlingError( TInt aError ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::NotifyImageHandlingError()>> "), RThread().Id().operator TUint())); + NotifyError( aError ); + if ( ( KErrCancel == aError ) && ( EPSUndoInitializing == iPSState ) ) + { + UndoCommonInitialized(); + iPSState = EPSUninitialized; + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::NotifyImageHandlingError()<< "), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::CancelInitializing +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::CancelInitializing() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::CancelInitializing()>> "), RThread().Id().operator TUint())); + if ( iPSState != EPSInitializing ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::CancelInitializing(), iPSState is not valid,%d>> "), RThread().Id().operator TUint(), iPSState)); + return; + } + + if ( iInitType != TVSStillImageDataProviderParams::EInitializeFromFile ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::CancelInitializing(), iInitType is not valid,%d>> "), RThread().Id().operator TUint(), iInitType)); + return; + } + if ( iViewer->CancelInitializing() ) + { + // In this condition, convert was cancelled , no any message will receive from multiframe provider, + // so delete multiFrame provider, and change IPSState, NotifyError to VT Engine + NotifyError(KErrCancel); + UndoCommonInitialized(); + iPSState = EPSUninitialized; + } + else + { + // In this condition, cnverting is finished, and Scale will cancel(CVtImageScaler->Cancel()), but in CVtImageScaler::DoCancel(), + // there is a error notify exist, so we must wait the error message from multiframe provider, + // we change the iPSState to EPSUndoInitializing for waiting error message. + // Error message will be received in function CVSStillImageDataProvider::NotifyImageHandlingError + iPSState = EPSUndoInitializing; + } + + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::CancelInitializing()<< "), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::UndoCommonInitialized +// ----------------------------------------------------------------------------- +// +void CVSStillImageDataProvider::UndoCommonInitialized() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::UndoCommonInitialized()>> "), RThread().Id().operator TUint())); + + iFreezeCS.Close(); + if ( NULL != iVFTimer ) + { + iVFTimer->Cancel(); + } + + delete iViewer; + iViewer = NULL; + + delete iActiveWait; + iActiveWait = NULL; + + delete iVFTimer; + iVFTimer = NULL; + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSStillImageDataProvider::UndoCommonInitialized()<< "), RThread().Id().operator TUint())); + + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/src/cactivewait.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/src/cactivewait.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,99 @@ +/* +* Copyright (c) 2008 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 "cactivewait.h" + +const TInt KFirstFrameIndx = 0; + +// MACROS + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// ============================ CVSActiveWait =============================== + +// ----------------------------------------------------------------------------- +// CVSActiveWait::~CVSActiveWait() +// ----------------------------------------------------------------------------- +// +template +CVSActiveWait< R >::~CVSActiveWait() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::~CVSActiveWait() >>"), RThread().Id().operator TUint())); + Cancel(); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::~CVSActiveWait() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSActiveWait::RequestStatus() +// ----------------------------------------------------------------------------- +// +template +TRequestStatus* CVSActiveWait< R >::RequestStatus() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::RequestStatus() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::RequestStatus() <<"), RThread().Id().operator TUint())); + return &iStatus; + } + +// ----------------------------------------------------------------------------- +// CVSActiveWait::Signal( TInt aError ) +// ----------------------------------------------------------------------------- +// +template +void CVSActiveWait< R >::Signal( TInt aError ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::Signal() >>"), RThread().Id().operator TUint())); + if( IsActive() ) + { + TRequestStatus* status = &iStatus; + User::RequestComplete( status, aError ); + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::Signal() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSActiveWait::RunL() +// ----------------------------------------------------------------------------- +// +template +void CVSActiveWait< R >::RunL() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::RunL() >>"), RThread().Id().operator TUint())); + (iRequester->*iCallback)( iStatus.Int() ); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::RunL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CVSActiveWait::DoCancel() +// ----------------------------------------------------------------------------- +// +template +void CVSActiveWait< R >::DoCancel() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::DoCancel() >>"), RThread().Id().operator TUint())); + TRequestStatus* pStatus = &iStatus; + User::RequestComplete( pStatus, KErrCancel ); + __IF_DEBUG(Print(_L("VideoSource [%d]: CVSActiveWait::DoCancel() <<"), RThread().Id().operator TUint())); + } + + \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/src/cmultiframedataao.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/src/cmultiframedataao.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,177 @@ +/* +* Copyright (c) 2008 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 "cmultiframedataao.h" +#include "mmultiframeprovider.h" +#include "cmultiframeprovider.h" +#include "VSPanic.h" + +// MACROS + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif +// ============================ CMultiframeDataAO =============================== + +// ----------------------------------------------------------------------------- +// CMultiframeDataAO::CMultiframeDataAO( CMultiframeProvider* aRequester ) +// ----------------------------------------------------------------------------- +// +CMultiframeDataAO::CMultiframeDataAO( CMultiframeProvider* aRequester ) +: CTimer( EPriorityHigh ), iRequester( aRequester ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeDataAO::CMultiframeDataAO() >>"), RThread().Id().operator TUint())); + RThread me; + iThreadId = me.Id(); + CActiveScheduler::Add( this ); + TRAP_IGNORE(CTimer::ConstructL()); + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeDataAO::CMultiframeDataAO() <<"), RThread().Id().operator TUint())); + } +// ----------------------------------------------------------------------------- +// CMultiframeDataAO::SetObserver( MMultiframeprovider* aObserever ) +// ----------------------------------------------------------------------------- +// +void CMultiframeDataAO::SetObserver( MMultiframeprovider* aObserver ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeDataAO::SetObserver() >>"), RThread().Id().operator TUint())); + iObserver = aObserver; + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeDataAO::SetObserver() <<"), RThread().Id().operator TUint())); + } +// ----------------------------------------------------------------------------- +// CMultiframeDataAO::~CMultiframeDataAO() +// ----------------------------------------------------------------------------- +// +CMultiframeDataAO::~CMultiframeDataAO() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeDataAO::~CMultiframeDataAO() >>"), RThread().Id().operator TUint())); + Cancel(); + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeDataAO::~CMultiframeDataAO() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeDataAO::Activate( ) +// ----------------------------------------------------------------------------- +// +void CMultiframeDataAO::Activate( TTimeIntervalMicroSeconds aUpdateTime, TBool aInit, TBool aVFUpdate ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeDataAO::Activate() >>"), RThread().Id().operator TUint())); + + TTimeIntervalMicroSeconds32 time = aUpdateTime.Int64(); + iInit = aInit; + iVFUpdate = aVFUpdate; + if ( !IsActive() ) + { + CTimer::After( time ); + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeDataAO::Activate() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeDataAO::LocalBuffer( ) +// ----------------------------------------------------------------------------- +// +void CMultiframeDataAO::LocalBuffer( CVtImageBitmap* aLocalBuffer ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeDataAO::LocalBuffer() >>"), RThread().Id().operator TUint())); + iLocalBuffer.iBitmap = aLocalBuffer; + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeDataAO::LocalBuffer() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeDataAO::RemoteBuffer( ) +// ----------------------------------------------------------------------------- +// +void CMultiframeDataAO::RemoteBuffer( CVtImageBitmap* aRemoteBuffer ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeDataAO::RemoteBuffer() >>"), RThread().Id().operator TUint())); + iRemoteBuffer.iBitmap = aRemoteBuffer; + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeDataAO::RemoteBuffer() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeDataAO::RunL() +// ----------------------------------------------------------------------------- +// +void CMultiframeDataAO::RunL() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeDataAO::RunL() >>"), RThread().Id().operator TUint())); + + //stop loop ao + if (iRequireStopping) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeDataAO::RunL() cancel by flag"), RThread().Id().operator TUint())); + iRequireStopping = EFalse; + return; + } + + if ( !iVFUpdate ) + { + iObserver->RefreshYUVData( iRemoteBuffer ); + } + iObserver->RefreshViewFinder( iLocalBuffer ); + iRequester->UseSecondVfBuffer(); + if ( iInit ) + { + iObserver->InitializeReady(); + } + if ( !iVFUpdate ) + { + iRequester->AddBitmapToFreeQueue(); + } + if ( !iInit && !iVFUpdate ) + { + iRequester->NextFrame(); + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeDataAO::RunL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeDataAO::CancelTimeLoop() +// ----------------------------------------------------------------------------- +// +void CMultiframeDataAO::CancelTimeLoop() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeDataAO::CancelTimeLoop >>"), RThread().Id().operator TUint())); + if ( IsActive() ) + { + if ( iStatus == KRequestPending ) + { + RThread me; + if ( me.Id() == iThreadId ) + { + Cancel(); + iRequireStopping = EFalse; + } + else + { + iRequireStopping = ETrue; + } + } + else + { + iRequireStopping = ETrue; + } + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeDataAO::CancelTimeLoop <<"), RThread().Id().operator TUint())); + } + + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/src/cmultiframeloopao.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/src/cmultiframeloopao.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,233 @@ +/* +* Copyright (c) 2008 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 "cmultiframeloopao.h" +#include "cmultiframeprovider.h" +#include "VSPanic.h" + +// MACROS + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif +// ============================ CMultiframeloopAO =============================== + +// ----------------------------------------------------------------------------- +// CMultiframeloopAO::CMultiframeloopAO( CMultiframeProvider* aRequester ) +// ----------------------------------------------------------------------------- +// +CMultiframeloopAO::CMultiframeloopAO( CMultiframeProvider* aRequester ) +: CActive( EPriorityLow ), iRequester( aRequester ), iFreeBMCount(0), iRequireStopping(EFalse) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::CMultiframeloopAO() >>"), RThread().Id().operator TUint())); + RThread me; + iThreadId = me.Id(); + CActiveScheduler::Add( this ); + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::CMultiframeloopAO() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeloopAO::~CMultiframeloopAO() +// ----------------------------------------------------------------------------- +// +CMultiframeloopAO::~CMultiframeloopAO() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::~CMultiframeloopAO() >>"), RThread().Id().operator TUint())); + Cancel(); + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::~CMultiframeloopAO() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeloopAO::Signal( ) +// ----------------------------------------------------------------------------- +// +void CMultiframeloopAO::Signal( ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::Signal() >>"), RThread().Id().operator TUint())); + iRequester->iAnimation = ETrue; + if ( !IsActive() ) + { + SetActive(); + TRequestStatus* pStatus = &iStatus; + RThread me; + if ( me.Id() == iThreadId ) + { + User::RequestComplete( pStatus, KErrNone ); + } + else + { + if ( me.Open( iThreadId ) == KErrNone ) + { + *pStatus = KRequestPending; + me.RequestComplete( pStatus, KErrNone ); + me.Close(); + } + else + { + Panic( EVSPanicThreadOpenFailure ); + } + } + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::Signal() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeloopAO::RunL() +// ----------------------------------------------------------------------------- +// +void CMultiframeloopAO::RunL() + { + iRequester->WaitForConverting(); + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::RunL() >>"), RThread().Id().operator TUint())); + + //stop loop ao + if (iRequireStopping) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::RunL() CANCEL CALLED,stop by flag"), RThread().Id().operator TUint())); + iRequireStopping = EFalse; + iRequester->ReleaseForConverting(); + return; + } + + // Cancel is handled in this way because + if ( iStatus == KErrCancel) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::RunL() CANCEL CALLED IN PROTO THREAD STOP LOOPPING"), RThread().Id().operator TUint())); + iRequester->ReleaseForConverting(); + return; + } + + //If free bitmaps proceed next frame + if ( iFreeBMCount > 0 ) + { + ++iIndex; + // Loop animation starting from first frame + if ( iIndex > iFramecount - 1 ) + { + iIndex = KFirstFrameIndx; + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::RunL() RunL index %d"), RThread().Id().operator TUint(), iIndex)); + iRequester->ConvertAndScaleL( iIndex ); + } + //Wait until free bitmaps to proceed + else + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::RunL() NO FREE BMs"), RThread().Id().operator TUint())); + iStatus = KRequestPending; + SetActive(); + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::RunL() <<"), RThread().Id().operator TUint())); + iRequester->ReleaseForConverting(); + } +// ----------------------------------------------------------------------------- +// CMultiframeloopAO::RemoveFreeBitmaps() +// ----------------------------------------------------------------------------- +// +void CMultiframeloopAO::RemoveFreeBitmaps( TInt aCount ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::RemoveFreeBitmaps() >>"), RThread().Id().operator TUint())); + iFreeBMCount = iFreeBMCount - aCount; + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::RemoveFreeBitmaps() frames %d <<"), RThread().Id().operator TUint(), aCount)); + } + +// ----------------------------------------------------------------------------- +// CMultiframeloopAO::SetFreeBitmaps() +// ----------------------------------------------------------------------------- +// +void CMultiframeloopAO::SetFreeBitmaps( TInt aCount ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::SetFreeBitmaps() >>"), RThread().Id().operator TUint())); + iFreeBMCount = iFreeBMCount + aCount; + if ( IsActive() && iStatus == KRequestPending) + { + TRequestStatus* pStatus = &iStatus; + User::RequestComplete( pStatus, KErrNone ); + } + + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::SetFreeBitmaps() frames %d <<"), RThread().Id().operator TUint(), aCount)); + } +// ----------------------------------------------------------------------------- +// CMultiframeloopAO::SetFrameCount() +// ----------------------------------------------------------------------------- +// +void CMultiframeloopAO::SetFrameCount( TInt aCount ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::SetFrameCount() >>"), RThread().Id().operator TUint())); + iFramecount = aCount; + iIndex = 0; + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::SetFrameCount() frames %d <<"), RThread().Id().operator TUint(), aCount)); + } + +// ----------------------------------------------------------------------------- +// CMultiframeloopAO::CancelDataLoop() +// ----------------------------------------------------------------------------- +// + void CMultiframeloopAO::CancelDataLoop() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::CancelDataLoop() >>"), RThread().Id().operator TUint())); + if ( IsActive() ) + { + if ( iStatus == KRequestPending ) + { + RThread me; + if ( me.Id() == iThreadId ) + { + Cancel(); + } + else + { + if ( me.Open( iThreadId ) == KErrNone ) + { + TRequestStatus* pStatus = &iStatus; + *pStatus = KRequestPending; + me.RequestComplete( pStatus, KErrCancel ); + me.Close(); + } + else + { + Panic( EVSPanicThreadOpenFailure ); + } + } + } + else + { + iRequireStopping = ETrue; + } + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::CancelDataLoop() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeloopAO::DoCancel() +// ----------------------------------------------------------------------------- +// +void CMultiframeloopAO::DoCancel() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::DoCancel() >>"), RThread().Id().operator TUint())); + if ( iStatus == KRequestPending ) + { + TRequestStatus* pStatus = &iStatus; + User::RequestComplete( pStatus, KErrCancel ); + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::DoCancel() <<"), RThread().Id().operator TUint())); + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/VideoSource/src/cmultiframeprovider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/src/cmultiframeprovider.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,1024 @@ +/* +* Copyright (c) 2008 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 +#include + +#include "cmultiframeprovider.h" +#include "cmultiframeloopao.h" +#include "cmultiframedataao.h" + +#include "CVSStillImageDataProvider.h" +#include "cvtimagebitmap.h" + +static const TInt KQcifWidth = 176; +static const TInt KQcifHeight = 144; + +// Default bitmap size is VGA +static const TInt KDefaultBitmapSizeWidth = 640; +static const TInt KDefaultBitmapSizeHeight = 480; + +// MACROS + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// ============================ TScalingMediator =============================== + +// ----------------------------------------------------------------------------- +// TScalingMediator::TScalingMediator( ) +// ----------------------------------------------------------------------------- +// +TScalingMediator::TScalingMediator() + { + } + +// ----------------------------------------------------------------------------- +// TScalingMediator::ScalingFinished( ) +// ----------------------------------------------------------------------------- +// +void TScalingMediator::ScalingFinished( TInt aError ) + { + __IF_DEBUG(Print(_L("TScalingMediator::ScalingFinished() >>"))); + iWait->Signal( aError ); + __IF_DEBUG(Print(_L("TScalingMediator::ScalingFinished() error %d <<"), aError)); + } +// ----------------------------------------------------------------------------- +// TScalingMediator::ScalingFinished( ) +// ----------------------------------------------------------------------------- +// +void TScalingMediator::SetWaiter( CVSActiveWait< CMultiframeProvider >* aWait ) + { + iWait = aWait; + } + +// ============================ CMultiframeProvider =============================== + +// ----------------------------------------------------------------------------- +// CMultiframeProvider::NewL( ) +// ----------------------------------------------------------------------------- +// +CMultiframeProvider* CMultiframeProvider::NewL( MMultiframeprovider* aObserver, TDisplayMode aDisplayMode ) + { + __IF_DEBUG(Print(_L("VideoSource: [%d] CMultiframeProvider::NewL() >>"), RThread().Id().operator TUint())); + CMultiframeProvider* self = + new (ELeave) CMultiframeProvider( aObserver, aDisplayMode ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + __IF_DEBUG(Print(_L("VideoSource: [%d] CMultiframeProvider::NewL() <<"), RThread().Id().operator TUint())); + return self; + } +// ----------------------------------------------------------------------------- +// CMultiframeProvider::CMultiframeProvider( +// MVSDataProviderObserver* aObserver ) +// ----------------------------------------------------------------------------- +// +CMultiframeProvider::CMultiframeProvider( + MMultiframeprovider* aObserver , TDisplayMode aDisplayMode ): iDisplayMode( aDisplayMode ), iObserver( aObserver ), iBlank( EFalse ), iGSImage( EFalse ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::CMultiframeProvider() >>"), RThread().Id().operator TUint())); + //Set target VF size QCIF as default + iTargetSize.SetSize( KQcifWidth , KQcifHeight ); + iVFSize.SetSize( KQcifWidth , KQcifHeight ); + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::CMultiframeProvider() <<"), RThread().Id().operator TUint())); + } +// ----------------------------------------------------------------------------- +// CMultiframeProvider::~CMultiframeProvider() +// ----------------------------------------------------------------------------- +// +CMultiframeProvider::~CMultiframeProvider() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::~CMultiframeProvider() >>"), RThread().Id().operator TUint())); + iFs.Close(); + iFreezeCS.Close(); + delete iImageDecoder; iImageDecoder = 0; + delete iVtImageScalerInit; + delete iVtImageScalerScale; + delete iActiveWaitInit; + delete iActiveWaitScale; + delete iActiveWaitInitScale; + delete iConverted; + delete iMask; + delete iTempBM; + delete iDataTimer; + delete iLoopAo; + if ( iScaled != iBuffer1 && iScaled != iBuffer2 ) + { + delete iScaled; + } + delete iGSBitmap; + if ( !iBlank || !iGSImage ) + { + delete iBuffer1; + delete iBuffer2; + } + delete iFirstVfBuf; + delete iSecondVfBuf; + iFreeQueue.Close(); + iDefaultImageFile.Close(); + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::~CMultiframeProvider() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeProvider::ConstructL() +// ----------------------------------------------------------------------------- +// +void CMultiframeProvider::ConstructL() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::ConstructL() >>"), RThread().Id().operator TUint())); + User::LeaveIfError( iFs.Connect() ); + User::LeaveIfError( iFreezeCS.CreateLocal() ); + + // Create waiters and mediators for scaling purposes + iActiveWaitInit = new (ELeave) CVSActiveWait< CMultiframeProvider >( this ); + iActiveWaitScale = new (ELeave) CVSActiveWait< CMultiframeProvider >( this ); + iActiveWaitInitScale = new (ELeave) CVSActiveWait< CMultiframeProvider >( this ); + iInitMediator.SetWaiter( iActiveWaitInitScale ); + iScalingMediator.SetWaiter( iActiveWaitScale ); + iVtImageScalerInit = CVtImageScaler::NewL( iInitMediator, CVtImageScaler::EBilinear ); + iVtImageScalerScale = CVtImageScaler::NewL( iScalingMediator, CVtImageScaler::EBilinear ); + iDataTimer = new (ELeave) CMultiframeDataAO( this ); + iDataTimer->SetObserver( iObserver ); + iLoopAo = new (ELeave) CMultiframeloopAO( this ); + iFirstVfBuf = CVtImageBitmap::NewL( TSize( KQcifWidth >> 2, KQcifHeight >> 2 ), iDisplayMode ); + iSecondVfBuf = CVtImageBitmap::NewL( TSize( KQcifWidth >> 2, KQcifHeight >> 2 ), iDisplayMode ); + iSecondVFBuffer = EFalse; + iFirstVFBuffer = ETrue; + iIsVfStopped = EFalse; + iWaitForConverting = EFalse; + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::ConstructL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeProvider::IniatializeGSL() +// +// ----------------------------------------------------------------------------- +// +void CMultiframeProvider::IniatializeGSL( const TGeneralSettingsImageType aType ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::IniatializeGSL() >>"), RThread().Id().operator TUint())); + if ( aType == EGSStillImage ) + { + // Open connection to phone server + RPhCltServer phoneClient; + User::LeaveIfError( phoneClient.Connect() ); + CleanupClosePushL( phoneClient ); + + CPhCltImageHandler* stillH = CPhCltImageHandler::NewL(); + CleanupStack::PushL( stillH ); + + // Load images + CPhCltImageParams* imageParams; + imageParams = stillH->CPhCltBaseImageParamsL( EPhCltTypeVTStill ); + CleanupStack::PushL( imageParams ); + User::LeaveIfError( stillH->LoadImages( imageParams ) ); + + // Duplicate to image + if( imageParams->Count() > 0 ) + { + __IF_DEBUG(Print(_L("iImageCount > 0"))); + iGSBitmap = CVtImageBitmap::NewL( imageParams->GetImageL( 0 ) ); + } + else + { + __IF_DEBUG(Print(_L("iImageCount <= 0 -> User::Leave( KErrNotFound )"))); + User::Leave( KErrNotFound ); + } + // Cleanup + CleanupStack::PopAndDestroy( 3 ); // phoneClient, stillH, imageParams + iScaled = CVtImageBitmap::NewL( TSize( KQcifWidth, KQcifHeight ), iDisplayMode ); + + // If bitmap has different display mode than screen, then new bitmap + // is created and image is converted to screen's display mode + if ( iGSBitmap->Bitmap().DisplayMode() != iDisplayMode || + iGSBitmap->Bitmap().ExtendedBitmapType() != KNullUid ) + { + CVtImageBitmap* temp = CVtImageBitmap::NewL( + iGSBitmap->Bitmap().SizeInPixels(), iDisplayMode ); + CleanupStack::PushL( temp ); + // Color conversion is done by blitting it to other bitmap + CFbsBitmapDevice* fbd = CFbsBitmapDevice::NewL( &temp->Bitmap() ); + CleanupStack::PushL( fbd ); + CFbsBitGc* fgc = NULL; + User::LeaveIfError( fbd->CreateContext( fgc ) ); + CleanupStack::PushL( fgc ); + fgc->BitBlt( TPoint(), &iGSBitmap->Bitmap() ); + CleanupStack::PopAndDestroy( 2 ); // fbd, fgc + CleanupStack::Pop(); // temp + delete iGSBitmap; iGSBitmap = NULL; + iGSBitmap = temp; + } + iGSImage = ETrue; + iCount = 1; + iActiveWaitInit->InitializeWaiter( &CMultiframeProvider::ConversionFinished ); + iActiveWaitInit->Signal( KErrNone ); + } + else + { // default still image prepared by using file handle + InitializeL( NULL ); + } + iInitialization = ETrue; + iDelay = 0; + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::IniatializeGSL() <<"), RThread().Id().operator TUint())); + } +// ----------------------------------------------------------------------------- +// CMultiframeProvider::IniatializeBlank() +// +// ----------------------------------------------------------------------------- +// +void CMultiframeProvider::IniatializeBlankL() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::IniatializeBlank() >>"), RThread().Id().operator TUint())); + iBlank = ETrue; + iInitialization = ETrue; + iDelay = 0; + iCount = 1; + + CFbsBitmap* tempBitmap = 0; + + CreateBlankBitmapL( + tempBitmap, + TSize( KQcifWidth, KQcifHeight ), + iDisplayMode, +#ifdef _DEBUG + KRgbYellow +#else + KRgbBlack +#endif + ); + + CleanupStack::PushL( tempBitmap ); + iScaled = CVtImageBitmap::NewL( tempBitmap->Handle() ); + CleanupStack::PopAndDestroy(); // tempBitmap + tempBitmap = 0; + + iActiveWaitInit->InitializeWaiter( &CMultiframeProvider::BMSScalingFinished ); + iActiveWaitInit->Signal( KErrNone ); + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::IniatializeBlank() <<"), RThread().Id().operator TUint())); + } + // ----------------------------------------------------------------------------- +// CVSStillImageDataProvider::CreateBlankBitmapL( +// CFbsBitmap*& aBitmap, const TSize& aSize, const TDisplayMode& aMode, +// const TRgb& aColor ) +// ----------------------------------------------------------------------------- +// +void CMultiframeProvider::CreateBlankBitmapL( + CFbsBitmap*& aBitmap, + const TSize& aSize, + const TDisplayMode& aMode, + const TRgb& aColor ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::CreateBlankBitmapL() >>"), RThread().Id().operator TUint())); + if( aBitmap ) + { + delete aBitmap; + aBitmap = 0; + } + aBitmap = new (ELeave) CFbsBitmap(); + User::LeaveIfError( aBitmap->Create( aSize, aMode ) ); + CFbsBitmapDevice* fbd = CFbsBitmapDevice::NewL( aBitmap ); + CleanupStack::PushL( fbd ); + CFbsBitGc* fgc = 0; + User::LeaveIfError( fbd->CreateContext( fgc ) ); + CleanupStack::PushL( fgc ); + + fgc->SetPenColor( aColor ); + fgc->SetBrushColor( aColor ); + fgc->SetBrushStyle( CGraphicsContext::ESolidBrush ); + fgc->DrawRect( TRect( aSize ) ); + + CleanupStack::PopAndDestroy( 2 ); // fbd, fgc + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::CreateBlankBitmapL() <<"), RThread().Id().operator TUint())); + } +// ----------------------------------------------------------------------------- +// CMultiframeProvider::Iniatialize() +// +// ----------------------------------------------------------------------------- +// +void CMultiframeProvider::InitializeL( const TFileName* aFileName ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::InitializeL() >>"), RThread().Id().operator TUint())); + // Create bitmaps used for conversion and scaling + iBuffer1 = CVtImageBitmap::NewL( TSize( KQcifWidth, KQcifHeight ), iDisplayMode ); + iBuffer2 = CVtImageBitmap::NewL( TSize( KQcifWidth, KQcifHeight ), iDisplayMode ); + User::LeaveIfError( iFreeQueue.Append( iBuffer1 ) ); + User::LeaveIfError( iFreeQueue.Append( iBuffer2 ) ); + iLoopAo->SetFreeBitmaps( 2 ); + + // Create ICL decoder in its own thread for current file + TInt decodingoptions( + CImageDecoder::TOptions( CImageDecoder::EOptionAlwaysThread | CImageDecoder::EAllowGeneratedMask ) ); + + if ( aFileName ) + { + __IF_DEBUG(Print(_L(" file name exist, creating CImageDecoder"))); + iImageDecoder = CImageDecoder::FileNewL( iFs, *aFileName, (CImageDecoder::TOptions )decodingoptions /*CImageDecoder::EOptionNone*/ ); + } + else + { + __IF_DEBUG(Print(_L(" default vt image file => use phone server"))); + // default VT image file handle obtained from phone server + RPhCltServer phoneClient; + User::LeaveIfError( phoneClient.Connect() ); + __IF_DEBUG(Print(_L(" connected to phone server"))); + CleanupClosePushL( phoneClient ); + CPhCltImageHandler* handler = CPhCltImageHandler::NewL(); + CleanupStack::PushL( handler ); + __IF_DEBUG(Print(_L(" created image handler"))); + User::LeaveIfError( handler->OpenDefaultVtImage( iDefaultImageFile ) ); + decodingoptions &= ~CImageDecoder::EOptionAlwaysThread; + __IF_DEBUG(Print(_L(" creating image decoder"))); + iImageDecoder = CImageDecoder::FileNewL( iDefaultImageFile, ContentAccess::EPlay, (CImageDecoder::TOptions )decodingoptions ); + __IF_DEBUG(Print(_L(" created image decoder"))); + CleanupStack::PopAndDestroy( 2 ); // handler, phoneClient + } + // Use ICL to calculate frame count + iCount = iImageDecoder->FrameCount(); + __IF_DEBUG(Print(_L(" frame count=%d"),iCount)); + //If advanced flags are on show only first frame! + for ( TInt index = 0; index < iCount; ++index ) + { + TFrameInfo frameInfo( iImageDecoder->FrameInfo( index ) ); + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::InitializeL() frameInfo.iFlags %b >>"), RThread().Id().operator TUint(), frameInfo.iFlags)); + if ( frameInfo.iFlags & TFrameInfo::ELeaveInPlace ) + { + iDelay = 0; + iCount = 1; + } + } + //Set num of frames to viewer AO + iLoopAo->SetFrameCount( iCount ); + //For default loopping frame sequence is disabled + iAnimation = EFalse; + iInitialization = ETrue; + //Start ICL image conversion (decoding) and local scaling + ConvertAndScaleL( KFirstFrameIndx ); + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::InitializeL() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeProvider::SetVFScalingTargetSize() +// +// ----------------------------------------------------------------------------- +// +void CMultiframeProvider::SetVFScalingTargetSize( TSize aSize ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::SetVFScalingTargetSize() >>"), RThread().Id().operator TUint())); + iTargetSize = aSize; + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::SetVFScalingTargetSize() W %d H %d <<"), RThread().Id().operator TUint(), aSize.iWidth , aSize.iHeight )); + } + +// ----------------------------------------------------------------------------- +// CMultiframeProvider::ConvertAndScaleL() +// ----------------------------------------------------------------------------- +// +void CMultiframeProvider::ConvertAndScaleL( TInt aFrameIndex ) + { + // Variables related to Bitmap size + // calculation + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::ConvertAndScale() aFrameIndex %d>>"), RThread().Id().operator TUint(),aFrameIndex)); + TSize convertedBitmapSize; + TFrameInfo frameInfo( iImageDecoder->FrameInfo( aFrameIndex ) ); + if ( !iInitialization ) + { + TInt delayindex; + delayindex = aFrameIndex - 1; + if ( delayindex < KFirstFrameIndx ) + { + delayindex = ( iCount - 1 ); + } + TFrameInfo delayframeInfo( iImageDecoder->FrameInfo( delayindex ) ); + iDelay = delayframeInfo.iDelay; + } + else + { + iDelay = 1; + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::ConvertAndScale() iDelay %d>>"), RThread().Id().operator TUint(),iDelay.Int64() )); +#ifdef _DEBUG + TUint threadId( RThread().Id() ); + switch ( frameInfo.iFrameDisplayMode ) + { + case EColor4K: + RDebug::Print( _L( "VideoSource [%d]: FrameDPmode = EColor4K" ), + threadId ); + break; + case EColor64K: + RDebug::Print( _L( "VideoSource [%d]: FrameDPmode = EColor64K" ), + threadId ); + break; + case EColor16M: + RDebug::Print( _L( "VideoSource [%d]: FrameDPmode = EColor16M" ), + threadId ); + break; + case EColor16MU: + RDebug::Print( _L( "VideoSource [%d]: FrameDPmode = EColor16MU" ), + threadId ); + break; + default: + RDebug::Print( _L( "VideoSource [%d]: FrameDPmode = %d" ), + threadId, frameInfo.iFrameDisplayMode ); + break; + } + + RDebug::Print( _L( "VideoSource [%d]: CMultiframeProvider:: frameInfo.iFlags %d" ), + threadId,frameInfo.iFlags ); +#endif // _DEBUG + + // Use imagedecoder to calculate how many times source picture needs to be divided by 2 + // to fit in default (VGA) picture + TInt reductionfactor = iImageDecoder->ReductionFactor( frameInfo.iOverallSizeInPixels, + TSize( KDefaultBitmapSizeWidth, KDefaultBitmapSizeHeight ) ); + if ( iImageDecoder->ReducedSize( frameInfo.iOverallSizeInPixels, reductionfactor, convertedBitmapSize ) ) + { + convertedBitmapSize = frameInfo.iOverallSizeInPixels; + } + +#ifdef _DEBUG + RDebug::Print( _L( "VideoSource [%d]: convertedBitmapSize Width = %d convertedBitmapSize Height = %d" ), + threadId, convertedBitmapSize.iWidth, convertedBitmapSize.iHeight ); +#endif // _DEBUG + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::ConvertAndScale() iConverted"), RThread().Id().operator TUint())); + iConverted = CVtImageBitmap::NewL( convertedBitmapSize, iDisplayMode ); + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::ConvertAndScale() iConverted"), RThread().Id().operator TUint())); +#ifdef _DEBUG + RDebug::Print( _L( "VideoSource [%d]: convBitmap Width = %d convBitmap Height = %d" ), + threadId, iConverted->Size().iWidth, iConverted->Size().iHeight ); +#endif // _DEBUG + + iStartTime.HomeTime(); + if ( iFreeQueue.Count() < 2 ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::ConvertAndScale() iFreeQueue.Count() < 2 "), RThread().Id().operator TUint())); + iOldBM = ETrue; + iOldBitmap = iScaled; + } + iScaled = iFreeQueue[ 0 ]; + iFreeQueue.Remove( 0 ); + iLoopAo->RemoveFreeBitmaps( 1 ); + iActiveWaitInit->InitializeWaiter( &CMultiframeProvider::ConversionFinished ); + // Check if masking is supported + if ( frameInfo.iFlags & TFrameInfo::ETransparencyPossible ) + { + // Create mask for bitmap + iMask = new ( ELeave )CFbsBitmap(); + User::LeaveIfError( iMask->Create( convertedBitmapSize, EGray256 )); + iTempBM = CVtImageBitmap::NewL( convertedBitmapSize, iDisplayMode ); + iImageDecoder->Convert( iActiveWaitInit->RequestStatus(), iTempBM->Bitmap(), *iMask, aFrameIndex ); + } + // No mask + else + { + iImageDecoder->Convert( iActiveWaitInit->RequestStatus(), iConverted->Bitmap(), aFrameIndex ); + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::ConvertAndScale() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeProvider::ConversionFinished( TInt aError ) +// ----------------------------------------------------------------------------- +// +void CMultiframeProvider::ConversionFinished( TInt aError ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::ConversionFinished() >>"), RThread().Id().operator TUint())); + if ( iCount == 1 || aError ) + { + // delete decoder if not needed any more + // 1) single frame image, no further frames to convert + // 2) error occured, decoder won't be used anyway + __IF_DEBUG(Print(_L(" single frame image => destruct iImageDecoder, err %d"), aError ) ); + delete iImageDecoder; + iImageDecoder = NULL; + } + // no harm done if other than this used, handle would already be 0 + iDefaultImageFile.Close(); + if ( aError == KErrNone ) + { + iActiveWaitInitScale->InitializeWaiter( &CMultiframeProvider::BMSScalingFinished ); + if ( iGSImage ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::ConversionFinished() scale GS "), RThread().Id().operator TUint())); + iVtImageScalerInit->Scale( *iGSBitmap, *iScaled ); + } + else + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::ConversionFinished() scale "), RThread().Id().operator TUint())); + // Blit mask into a converted bitmap + if ( iMask ) + { + CGraphicsContext* bitmapcontext = NULL; + CFbsBitmapDevice* bitmapdevice = NULL; + // Create bm device + TRAPD( error, bitmapdevice = CFbsBitmapDevice::NewL( &( iConverted->Bitmap() ) ) ); + if ( error != KErrNone ) + { + iObserver->NotifyImageHandlingError( aError ); + delete bitmapdevice; + delete iTempBM; + delete iMask; + iMask = NULL; + iTempBM = NULL; + return; + } + // Create GC for bm + error = bitmapdevice->CreateContext( bitmapcontext ); + if ( error != KErrNone ) + { + iObserver->NotifyImageHandlingError( aError ); + delete bitmapdevice; + delete bitmapcontext; + delete iTempBM; + delete iMask; + iMask = NULL; + iTempBM = NULL; + return; + } + // Fill destination bitmap with white color + TRect rect( iConverted->Size() ); + bitmapcontext->SetBrushStyle( CGraphicsContext:: ESolidBrush ); + bitmapcontext->SetPenStyle( CGraphicsContext::ESolidPen ); + bitmapcontext->SetBrushColor( KRgbWhite ); + bitmapcontext->SetPenColor( KRgbWhite); + bitmapcontext->DrawRect( rect ); + + // Draw mask and data bitmap into a same destination bm + bitmapcontext->DrawBitmapMasked( iConverted->Size(), &( iTempBM->Bitmap() ), iConverted->Size(), iMask, EFalse ); + delete bitmapdevice; + delete bitmapcontext; + delete iTempBM; + delete iMask; + iMask = NULL; + iTempBM = NULL; + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::ConversionFinished() iMask"), RThread().Id().operator TUint())); + } + iVtImageScalerInit->Scale( *iConverted, *iScaled ); + } + } + // Allways inform Decoding problems + else + { + iObserver->NotifyImageHandlingError( aError ); + delete iTempBM; + delete iMask; + iMask = NULL; + iTempBM = NULL; + // GIF used when error happen + if ( iCount > 1 ) + { + iCount = 1; + } + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::ConversionFinished() error %d <<"), RThread().Id().operator TUint(), aError)); + } + +// ----------------------------------------------------------------------------- +// CMultiframeProvider::BMSScalingFinished( TInt aError ) +// ----------------------------------------------------------------------------- +// +void CMultiframeProvider::BMSScalingFinished( TInt aError ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::BMSScalingFinished() >>"), RThread().Id().operator TUint())); + if ( aError == KErrNone ) + { + VFScalingReady(); + } + else + { +#if 0 + if ( aError != KErrCancel ) // If KErrCancel, then ignore error! + { + iObserver->NotifyImageHandlingError( aError ); + } + //Needs to be deleted also in cancel case + delete iConverted; iConverted = NULL; +#endif + delete iConverted; iConverted = NULL; + iObserver->NotifyImageHandlingError( aError ); + + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::BMSScalingFinished() err %d <<"), RThread().Id().operator TUint(), aError)); + } + +// ----------------------------------------------------------------------------- +// CMultiframeProvider::AddBitmapToFreeQueue( CVtImageBitmap* aBitmap ) +// ----------------------------------------------------------------------------- +// +void CMultiframeProvider::AddBitmapToFreeQueue() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::AddBitmapToFreeQueue() >>"), RThread().Id().operator TUint())); + if ( iOldBM ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::AddBitmapToFreeQueue() OLD BM"), RThread().Id().operator TUint())); + iOldBM = EFalse; + iFreeQueue.Append( iOldBitmap ); + } + else + { + iFreeQueue.Append( iScaled ); + } + iLoopAo->SetFreeBitmaps( 1 ); + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::AddBitmapToFreeQueue() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeProvider::UseSecondVfBuffer() +// ----------------------------------------------------------------------------- +// +void CMultiframeProvider::UseSecondVfBuffer() + { + iSecondVFBuffer = ETrue; + } + +// ----------------------------------------------------------------------------- +// CMultiframeProvider::VFScalingReady() +// ----------------------------------------------------------------------------- +// +void CMultiframeProvider::VFScalingReady() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::VFScalingReady() >>"), RThread().Id().operator TUint())); + delete iConverted; iConverted = 0; + + // Calculate frame update delay here! + TTime refpointtime; + refpointtime.HomeTime(); + TTimeIntervalMicroSeconds deltaTime = refpointtime.MicroSecondsFrom( iStartTime ); + iFrameUpdateTime = iDelay.Int64() - deltaTime.Int64(); + if ( iFrameUpdateTime < 0 ) + { + iFrameUpdateTime = 1; + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::VFScalingReady() iFrameUpdateTime %d>>"), RThread().Id().operator TUint(), iFrameUpdateTime.Int64())); + // Scale VF to fit in requested size + // size is as default QCIF + if ( iIsVfStopped ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::VFScalingReady()VF Stop>>"), RThread().Id().operator TUint())); + if ( iActiveWaitScale->IsActive() ) + { + //ScaleCopy running + //Waiting is OK + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::VFScalingReady()ScaleCopy running>>"), RThread().Id().operator TUint())); + } + else + { + //ScaleCopy is not running, Jump ScaleCopy + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::VFScalingReady()jump ScaleCopy>>"), RThread().Id().operator TUint())); + iActiveWaitScale->InitializeWaiter( &CMultiframeProvider::VFRescalingFinished ); + iActiveWaitScale->Signal(KErrNone); + } + } + else + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::VFScalingReady()Normal run>>"), RThread().Id().operator TUint())); + iVFUpdate = EFalse; + ScaleCopy( iTargetSize ); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::VFScalingReady() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeProvider::ScaleCopy( TSize& aSize ) +// ----------------------------------------------------------------------------- +// +void CMultiframeProvider::ScaleCopy( TSize& aSize, TBool aVFUpdate ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::ScaleCopy() >>"), RThread().Id().operator TUint())); + + iVFUpdate = aVFUpdate; + iVFSize = aSize; + if ( iSecondVFBuffer && !iFirstVFBuffer ) + { + iVFbitmap = iSecondVfBuf; + iSecondVFBuffer = EFalse; + iFirstVFBuffer = ETrue; + } + else + { + iVFbitmap = iFirstVfBuf; + iFirstVFBuffer = EFalse; + } + //If Scaling is ongoing + if ( iActiveWaitScale->IsActive() ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::ScaleCopy(): active, storing size"), RThread().Id().operator TUint())); + iWantedVFSize = aSize; + } + else + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::ScaleCopy(): scaling NOW"), RThread().Id().operator TUint())); + iActiveWaitScale->InitializeWaiter( &CMultiframeProvider::VFRescalingFinished ); + TInt result( iVFbitmap->Bitmap().Resize( aSize ) ); + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeProvider::ScaleCopy() result %d <<"), RThread().Id().operator TUint(), result)); + if ( result != KErrNone ) + { + iActiveWaitScale->Signal( result ); + } + else + { + iVtImageScalerScale->Scale( *iScaled, *iVFbitmap ); + } + } + } +// ----------------------------------------------------------------------------- +// CMultiframeProvider::NextFrame() +// ----------------------------------------------------------------------------- +// +void CMultiframeProvider::NextFrame() + { + iFreezeCS.Wait(); + iInitialization = EFalse; + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::NextFrame() >>"), RThread().Id().operator TUint())); + + if ( iNumOfConsumers < 1 ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::NextFrame() Consumer < 1>>"), RThread().Id().operator TUint())); + iFreezeCS.Signal(); + return; + } + + if (iCount > 1 && !iActiveWaitInit->IsActive() ) + { + if (iWaitForConverting) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::NextFrame() Because CMultiframeloopAO::RunL is executing, so Signal is not needed"), RThread().Id().operator TUint())); + } + else + { + iLoopAo->Signal(); + } + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::NextFrame() <<"), RThread().Id().operator TUint())); + iFreezeCS.Signal(); + } + +// ----------------------------------------------------------------------------- +// CMultiframeProvider::IncreaseDataConsumer() +// ----------------------------------------------------------------------------- +// +void CMultiframeProvider::IncreaseDataConsumer() + { + iFreezeCS.Wait(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::IncreaseDataConsumer() >>"), RThread().Id().operator TUint())); + ++iNumOfConsumers; + iFreezeCS.Signal(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::IncreaseDataConsumer() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeProvider::DecreaseDataConsumer() +// ----------------------------------------------------------------------------- +// +void CMultiframeProvider::DecreaseDataConsumer() + { + iFreezeCS.Wait(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::DecreaseDataConsumer() >>"), RThread().Id().operator TUint())); + --iNumOfConsumers; + if ( iNumOfConsumers < 1 ) + { + iLoopAo->CancelDataLoop(); + iDataTimer->CancelTimeLoop(); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::DecreaseDataConsumer() <<"), RThread().Id().operator TUint())); + iFreezeCS.Signal(); + } +// ----------------------------------------------------------------------------- +// CMultiframeProvider::ScaleVF( const TSize& aSize ) +// ----------------------------------------------------------------------------- +// +void CMultiframeProvider::ScaleVF( const TSize& aSize ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::ScaleVF() >>"), RThread().Id().operator TUint())); + iActiveWaitScale->InitializeWaiter( &CMultiframeProvider::VFRescalingFinished ); + TInt result( iVFbitmap->Bitmap().Resize( aSize ) ); + ClearVFScalingTargetSize(); + if ( result != KErrNone ) + { + iActiveWaitScale->Signal( result ); + } + else + { + iVtImageScalerScale->Scale( *iScaled, *iVFbitmap ); + } + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::ScaleVF() result %d <<"), RThread().Id().operator TUint(), result)); + } + +// ----------------------------------------------------------------------------- +// CMultiframeProvider::VFRescalingFinished( TInt aError ) +// ----------------------------------------------------------------------------- +// +void CMultiframeProvider::VFRescalingFinished( TInt aError ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::VFRescalingFinished() >>"), RThread().Id().operator TUint())); + if ( aError == KErrNone ) + { + if ( iWantedVFSize != TSize() ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::VFRescalingFinished() REScaling needed"), RThread().Id().operator TUint())); + ScaleVF( iWantedVFSize ); + ClearVFScalingTargetSize(); + } + else + { + iDataTimer->CancelTimeLoop(); + + if ( !iIsVfStopped && !iVFUpdate ) + { + //Normally, VF and VS work + iVFCurrent = iVFbitmap; + iYUVBitMap = iScaled; + iDataTimer->LocalBuffer(iVFCurrent); + iDataTimer->RemoteBuffer(iYUVBitMap); + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::ScalecopyRemoteAndUpdate() normal, iFrameUpdateTime %d>>"), RThread().Id().operator TUint(), + iFrameUpdateTime.Int64())); + iDataTimer->Activate(iFrameUpdateTime, iInitialization, iVFUpdate); + } + else if ( iIsVfStopped && !iVFUpdate ) + { + //VF doesn't work. + iYUVBitMap = iScaled; + iDataTimer->RemoteBuffer(iYUVBitMap); + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::ScalecopyRemoteAndUpdate() VF Stop, iFrameUpdateTime %d>>"), RThread().Id().operator TUint(), + iFrameUpdateTime.Int64())); + iDataTimer->Activate( iFrameUpdateTime, iInitialization, iVFUpdate); + } + else if ( iIsVfStopped && iVFUpdate ) + { + //VF restart + iIsVfStopped = EFalse; + iVFUpdate = EFalse; + iVFCurrent = iVFbitmap; + iYUVBitMap = iScaled; + iDataTimer->LocalBuffer(iVFCurrent); + iDataTimer->RemoteBuffer(iYUVBitMap); + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::ScalecopyRemoteAndUpdate() VF Restart iFrameUpdateTime 1>>"), + RThread().Id().operator TUint())); + iDataTimer->Activate(1, iInitialization, iVFUpdate); + } + else + { + //maybe this condition never execute. + iVFCurrent = iVFbitmap; + iDataTimer->LocalBuffer(iVFCurrent); + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::ScalecopyRemoteAndUpdate() last one, iFrameUpdateTime %d>>"), RThread().Id().operator TUint(), + iFrameUpdateTime.Int64())); + iDataTimer->Activate( 1, iInitialization, iVFUpdate); + } + } + } +#if 0 + else if ( ( aError == KErrCancel ) ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::VFRescalingFinished() CANCEL"), RThread().Id().operator TUint())); + } + else if( aError != KErrCancel ) // If KErrCancel, then ignore error! + { + iObserver->NotifyImageHandlingError( aError ); + } +#endif + else + { + iObserver->NotifyImageHandlingError( aError ); + } + + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::VFRescalingFinished() err %d <<"), RThread().Id().operator TUint(), aError)); + } + +// ----------------------------------------------------------------------------- +// CMultiframeProvider::IsVFStopped() +// ----------------------------------------------------------------------------- +// +TBool CMultiframeProvider::IsVFStopped() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::IsVFStopped() >>"), RThread().Id().operator TUint())); + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::IsVFStopped() <<"), RThread().Id().operator TUint())); + return iIsVfStopped; + } + +// ----------------------------------------------------------------------------- +// CMultiframeProvider::SetVFStop() +// ----------------------------------------------------------------------------- +// +void CMultiframeProvider::SetVFStop() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::SetVFStop() >>"), RThread().Id().operator TUint())); + iIsVfStopped = ETrue; + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::SetVFStop() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeProvider::WaitForConverting() +// ----------------------------------------------------------------------------- +// +void CMultiframeProvider::WaitForConverting() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::WaitForConverting() >>"), RThread().Id().operator TUint())); + iWaitForConverting = ETrue; + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::WaitForConverting() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeProvider::WaitForConverting() +// ----------------------------------------------------------------------------- +// +void CMultiframeProvider::ReleaseForConverting() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::ReleaseForConverting() >>"), RThread().Id().operator TUint())); + iWaitForConverting = EFalse; + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::ReleaseForConverting() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeProvider::ClearVFScalingTargetSize() +// ----------------------------------------------------------------------------- +// +void CMultiframeProvider::ClearVFScalingTargetSize() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::ClearVFScalingTargetSize() >>"), RThread().Id().operator TUint())); + iWantedVFSize = TSize(); + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::ClearVFScalingTargetSize() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeProvider::CancelInitializing() +// ----------------------------------------------------------------------------- +// +TBool CMultiframeProvider::CancelInitializing() + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::CancelInitializing() >>"), RThread().Id().operator TUint())); + TBool lResult = EFalse; + + if ( NULL == iImageDecoder ) + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::CancelInitializing() iImageDecoder is NULL ==="), RThread().Id().operator TUint())); + // In this condition, Convert is already finished + if ( iVtImageScalerInit->IsActive() ) + { + __IF_DEBUG(Print(_L("VideoSource[%d] Line[%d]: CMultiframeProvider::CancelInitializing() iVtImageScalerInit->Cancel ==="), + RThread().Id().operator TUint(), __LINE__)); + iVtImageScalerInit->Cancel(); + } + else if ( iActiveWaitInitScale->IsActive() ) + { + __IF_DEBUG(Print(_L("VideoSource[%d] Line[%d]: CMultiframeProvider::CancelInitializing() iActiveWaitInitScale->Cancel ==="), + RThread().Id().operator TUint(), __LINE__)); + iActiveWaitInitScale->Cancel(); + } + else if ( iVtImageScalerScale->IsActive() ) + { + __IF_DEBUG(Print(_L("VideoSource[%d] Line[%d]: CMultiframeProvider::CancelInitializing() iVtImageScalerScale->Cancel ==="), + RThread().Id().operator TUint(), __LINE__)); + iVtImageScalerScale->Cancel(); + } + else if ( iActiveWaitScale->IsActive() ) + { + __IF_DEBUG(Print(_L("VideoSource[%d] Line[%d]: CMultiframeProvider::CancelInitializing() iActiveWaitScale->Cancel ==="), + RThread().Id().operator TUint(), __LINE__)); + iActiveWaitScale->Cancel(); + } + else + { + //In this condition, the convert,scale,copyScale were finished, + //so do nothing, Waiting for InitializeReady() + __IF_DEBUG(Print(_L("VideoSource[%d] Line[%d]: CMultiframeProvider::CancelInitializing() Nothong to do,wait finish ==="), + RThread().Id().operator TUint(), __LINE__)); + } + } + else + { + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::CancelInitializing() cancel convert ==="), RThread().Id().operator TUint())); + //Convert is not finished, so we can cancel it, and return ETrue + iImageDecoder->Cancel(); + lResult = ETrue; + } + + __IF_DEBUG(Print(_L("VideoSource[%d]: CMultiframeProvider::CancelInitializing() <<"), RThread().Id().operator TUint())); + return lResult; + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolplugins/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/group/bld.inf Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,26 @@ +/* +* Copyright (c) 2004 - 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: Build information for Video Telephony protocol subsystem. +* +*/ + + +PRJ_PLATFORMS +DEFAULT + +// Include components' bld.inf files +#include "../DisplaySink/group/bld.inf" +#include "../VideoSource/group/bld.inf" + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocols/bwins/videotelprotou.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocols/bwins/videotelprotou.def Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,13 @@ +EXPORTS + ?DeleteAudioSink@VTProtocolFactory@@SAHPAVMVTAudioSink@@@Z @ 1 NONAME ; int VTProtocolFactory::DeleteAudioSink(class MVTAudioSink *) + ?CreateAudioSink@VTProtocolFactory@@SAPAVMVTAudioSink@@XZ @ 2 NONAME ; class MVTAudioSink * VTProtocolFactory::CreateAudioSink(void) + ?CreateCommServerL@VTProtocolFactory@@SAPAVMCommServer@@ABVTDesC16@@H@Z @ 3 NONAME ; class MCommServer * VTProtocolFactory::CreateCommServerL(class TDesC16 const &, int) + ?CreateUserInputIndication@VTProtocolFactory@@SAPAVMVTUserInput@@W4TUserInputType@@E@Z @ 4 NONAME ; class MVTUserInput * VTProtocolFactory::CreateUserInputIndication(enum TUserInputType, unsigned char) + ?CreateSessionCommandL@VTProtocolFactory@@SAPAVMVtSessionCommand@@PAVMVtProtocolHandler@@HAAW4TVt3G324MSupported@@@Z @ 5 NONAME ; class MVtSessionCommand * VTProtocolFactory::CreateSessionCommandL(class MVtProtocolHandler *, int, enum TVt3G324MSupported &) + ?DeletAudioSource@VTProtocolFactory@@SAHPAVMVTAudioSource@@@Z @ 6 NONAME ; int VTProtocolFactory::DeletAudioSource(class MVTAudioSource *) + ?GetAudioConfigCommandL@VTProtocolFactory@@SAPAVMVtAudioConfigCommand@@PAVMVTAudioSink@@@Z @ 7 NONAME ; class MVtAudioConfigCommand * VTProtocolFactory::GetAudioConfigCommandL(class MVTAudioSink *) + ?CreateAudioSource@VTProtocolFactory@@SAPAVMVTAudioSource@@XZ @ 8 NONAME ; class MVTAudioSource * VTProtocolFactory::CreateAudioSource(void) + ?DeleteCommServerL@VTProtocolFactory@@SAXPAVMCommServer@@@Z @ 9 NONAME ; void VTProtocolFactory::DeleteCommServerL(class MCommServer *) + ?DeleteUserInputIndication@VTProtocolFactory@@SAXPAVMVTUserInput@@@Z @ 10 NONAME ; void VTProtocolFactory::DeleteUserInputIndication(class MVTUserInput *) + ?DeleteSessionCommand@VTProtocolFactory@@SAXPAVMVtSessionCommand@@@Z @ 11 NONAME ; void VTProtocolFactory::DeleteSessionCommand(class MVtSessionCommand *) + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocols/eabi/videotelprotou.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocols/eabi/videotelprotou.def Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,13 @@ +EXPORTS + _ZN17VTProtocolFactory15CreateAudioSinkEv @ 1 NONAME + _ZN17VTProtocolFactory15DeleteAudioSinkEP12MVTAudioSink @ 2 NONAME + _ZN17VTProtocolFactory16DeletAudioSourceEP14MVTAudioSource @ 3 NONAME + _ZN17VTProtocolFactory17CreateAudioSourceEv @ 4 NONAME + _ZN17VTProtocolFactory17CreateCommServerLERK7TDesC16i @ 5 NONAME + _ZN17VTProtocolFactory17DeleteCommServerLEP11MCommServer @ 6 NONAME + _ZN17VTProtocolFactory20DeleteSessionCommandEP17MVtSessionCommand @ 7 NONAME + _ZN17VTProtocolFactory21CreateSessionCommandLEP18MVtProtocolHandleriR18TVt3G324MSupported @ 8 NONAME + _ZN17VTProtocolFactory22GetAudioConfigCommandLEP12MVTAudioSink @ 9 NONAME + _ZN17VTProtocolFactory25CreateUserInputIndicationE14TUserInputTypeh @ 10 NONAME + _ZN17VTProtocolFactory25DeleteUserInputIndicationEP12MVTUserInput @ 11 NONAME + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocols/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocols/group/bld.inf Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,38 @@ +/* +* Copyright (c) 2004 - 2007 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: vtprotocols build information file. +* +*/ + + +#include + +PRJ_PLATFORMS +DEFAULT + +PRJ_TESTEXPORTS + +PRJ_EXPORTS + + +../inc/mvtprotocolhandler.h |../../inc/mvtprotocolhandler.h + + +PRJ_MMPFILES + +../group/videotelproto.mmp + + + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocols/group/videotelproto.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocols/group/videotelproto.mmp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,67 @@ +/* +* Copyright (c) 2004 - 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: This is project specification file for the Vtprotocols. +* +*/ + + +#include + +// Capability assignment. +CAPABILITY CAP_GENERAL_DLL + +// default vendor id +VENDORID VID_DEFAULT + +TARGET videotelproto.dll +TARGETTYPE dll +UID 0x1000008d 0x20021182 + + +SOURCEPATH ../src + +SOURCE cdatasinkproxy.cpp +SOURCE cdatasourceproxy.cpp +SOURCE caudioconfighandler.cpp +SOURCE ch324confighandler.cpp +SOURCE csessionhandler.cpp +SOURCE cvideoconfighandler.cpp +SOURCE cvtuserinput.cpp +SOURCE vtprotocolfactory.cpp + +DOCUMENT ../../bld.inf + +USERINCLUDE ../inc/ + + +APP_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE ../../inc +SYSTEMINCLUDE /epoc32/include/mmf/common +SYSTEMINCLUDE /epoc32/include/mmf/server + +LIBRARY euser.lib +LIBRARY ws32.lib + +LIBRARY commonengine.lib +LIBRARY mediaclientaudio.lib + + + +DEBUGLIBRARY vtlogger.lib + +LIBRARY pv2waysymbianadapter.lib +LIBRARY mmfdevsound.lib + + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocols/inc/caudioconfighandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocols/inc/caudioconfighandler.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,100 @@ +/* +* Copyright (c) 2004-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: . +* +*/ + + +#ifndef CAUDIOCONFIGHANDLER_H +#define CAUDIOCONFIGHANDLER_H +NONSHARABLE_CLASS( TAudioConfigHandler ) : public MPVAudioOutputControlObserver + { + public: + /** + * Constructor. + */ + TAudioConfigHandler( MVtProtocolHandler* aProtocolHandler); + + /** + * Signals completion of the audio output control command. + * @param aId The command id of the completed command. + * @param aCmd The command type. + * @param aContextData The context data passed in with the command. + * @param aStatus The command completion status. + **/ + virtual void AudioOutputControlCommandComplete(TPVCommandId aId + ,TPVAudioOutputControlCommand aCmd + ,TAny *aContextData + ,TInt aStatus); + private: + MVtProtocolHandler* iProtocolHandler; + }; + +NONSHARABLE_CLASS( CAudioConfigCommand ) : public CBase, + public MVtAudioConfigCommand + { + public: + + /** + * Constructor. + */ + CAudioConfigCommand(MPVAudioOutputControl* aAudioCtrl); + + /** + * Destructor. + */ + ~CAudioConfigCommand(); + + /** + * Method to set the playback volume to the specified value. + * + * This is a pure virtual function that each derived class must implement. + * It is also an asynchronous function which will be answered with a callback. + * + * @param aNewVolume + * An input parameter to hold the value for the requested playback volume. + * + * @returns TInt + * Returns a command ID that can be used to identify a command completion result with corresponding request. + */ + virtual TInt SetAudioVolumeL(TInt aVolume); + + /** + * Method to get the maximum valid value for the playback volume. + * + * This is a pure virtual function that each derived class must implement. + * It is also an asynchronous function which will be answered with a callback. + * + * @param aMaxVolume + * An output parameter to hold the value for the maximum valid playback volume. + * Note that the parameter should not be used until the callback indicates that the + * method has completed. + * + * @returns TInt + * Returns a command ID that can be used to identify a command completion result with corresponding request. + */ + virtual TInt GetMaxAudioVolumeL(TInt& aMaxVolume); + + /** + * This API allows the user to specify observers for the 324m interface. + * + * @param aHandler + **/ + virtual void SetObserverL(MVtProtocolHandler* aHandler); + private: + MPVAudioOutputControl* iAudioCtrl; + TAudioConfigHandler* iAudioConfigHandler; + }; +#endif +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocols/inc/ccommserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocols/inc/ccommserver.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,27 @@ +/* +* Copyright (c) 2004-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: +* +*/ + +#ifndef CCOMMSERVER_H +#define CCOMMSERVER_H +NONSHARABLE_CLASS( CCommServer ) : public CBase, + public MCommServer + { + public: + MPVCommServerBase* iComm; + }; +#endif +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocols/inc/cdatasinkproxy.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocols/inc/cdatasinkproxy.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,270 @@ +/* +* Copyright (c) 2004-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: +* +*/ + + +#ifndef CDATASINKPROXY_H +#define CDATASINKPROXY_H +NONSHARABLE_CLASS( CPVDisplaySinkNodeProxy ) : public CBase, + public MVTVideoSource + { + public: //New + /** + * Constructor . + */ + CPVDisplaySinkNodeProxy(); + /** + * Set new supplier. + * @param aSupplier + */ + void SetSupplier(MPVDataSourceBase* aSupplier); + public: //From MVTVideoSource + /** + * Method called by a data sink to pass back an emptied buffer to the source + * + * This is a pure virtual function that each derived class must implement. + * This method is used as the callback when the data source actively requests a consumer ie a data sink + * to empty a buffer by calling the data sinks EmptyBufferL. + * When the data source gets this callback it knows that the buffer has been emptied and can be reused + * + * @param "aBuffer" + * The buffer that has been emptied by a data sink and is now available for reuse + */ + virtual void BufferEmptiedL(CMMFBuffer* aBuffer); + private: + MPVDataSourceBase* iSupplier; + }; + +NONSHARABLE_CLASS( CDisplaySinkProxy ) : public CBase, + public MPVDataSink, + public MPVVideoOutput + { + public: //From MPVPluginBase + /** + * This API returns multimedias type supported by the data source/sink - + * Audio, Video, Data etc. Each supported type is indicated by a MIME type structure. + * @return Multimedia types supported by the data source/sink. The reference + * is valid until the MPVPluginBase derived object is destroyed. + **/ + virtual const RArray& GetMultimediaTypesL() const; + /** + * This API is to allow for extensibility of the plugin interface. + * It allows a caller to ask for all UUIDs associated with a particular MIME type. + * If interfaces of the requested MIME type are found within the plugin, they are added + * to the UUIDs array. + * + * Also added to the UUIDs array will be all interfaces which have the requested MIME + * type as a base MIME type. This functionality can be turned off. + * + * @param aMimeType The MIME type of the desired interfaces + * @param aUuids An array to hold the discovered UUIDs + * @param aExactUuidsOnly Turns on/off the retrival of UUIDs with aMimeType as a base type + **/ + virtual void QueryUUID( const TPVMIMEType& aMimeType, RArray& aUuids, bool aExactUuidsOnly = false ); + /** + * This API is to allow for extensibility of the plugin interface. + * It allows a caller to ask for an instance of a particular interface object to be returned. + * The mechanism is analogous to the COM IUnknown method. The interfaces are identified with + * an interface ID that is a UUID as in DCE and a pointer to the interface object is + * returned if it is supported. Otherwise the returned pointer is NULL. + * @param aUuid The UUID of the desired interface + * @param aInterfacePtr The output pointer to the desired interface + **/ + virtual void QueryInterface( const TPVUuid& aUuid, TPVInterfacePtr& aInterfacePtr ); + /** + * This API is used to provide a timebase for plugins that deal with synchronized media data + **/ + virtual void SetTimebaseL(MPVSymbianTimebaseInterface* aTimebase); + public: //From MPVDataSinkBase + /** + * Method called by a MDataSource to request the data sink to empty aBuffer of data. + * + * This is a pure virtual function that each derived class must implement. + * This method is used when a data sink is passively waiting for requests from a supplier ie a data source + * to empty a buffer. The data sink must call the BufferEmptiedL member on aSupplier when it has emptied + * the buffer of it's data - the data sink can either make this callback synchronously or asynchronously. + * + * @param "aBuffer" + * The full buffer that needs emptying of it's data + * + * @param "aSupplier" + * The data source that supplied the data. The data sink needs this to make the BufferEmptiedL + * callback on aSupplier to indicate to the data source that the data sink has finished with the buffer. + * + * @param "aMediaId" + * This identifies the type of media eg audio or video and the stream id. + * This parameter is required in cases where the source can supply data + * of more than one media type and/or multiple strams of data + */ + virtual void EmptyBufferL(CMMFBuffer* aBuffer, MPVDataSourceBase* aSupplier, TMediaId aMediaId); + /** + * Method called by a data source to pass back an filled buffer to the sink + * + * This is a pure virtual function that each derived class must implement. + * This method is used as the callback when the data sink actively requests a supplier ie a data source + * to fill a buffer by calling the data sources FillBufferL. + * When the data sink gets this callback it knows that the buffer has been filled and is ready to be emptied + * + * @param "aBuffer" + * The buffer that has been filled by a data source and is now available for processing + */ + virtual void BufferFilledL(CMMFBuffer* aBuffer); + /** + * Method to indicate whether the data sink can create a buffer. + * + * This is a pure virtual function that each derived class must implement. + * + * @return ETrue if the data sink can create a buffer else EFalse + */ + virtual TBool CanCreateSinkBuffer(); + /** + * Returns a buffer created by the data sink + * + * This is a pure virtual function that each derived class must implement. + * + * @param "aMediaId" + * This identifies the type of media eg audio or video and the stream id. + * This parameter is required in cases where the source can supply data + * of more than one media type and/or multiple strams of data. + * + * @param "aReference" + * This must be written to by the method to indicate whether the created buffer is + * a 'reference' buffer. A 'reference' buffer is a buffer that is owned by the sink + * and should be used in preference to the source buffer provided the source buffer + * is also not a reference buffer. + * . + * @return The created buffer + */ + virtual CMMFBuffer* CreateSinkBufferL(TMediaId aMediaId, TBool &aReference ); + /** + * Method to 'logon' the data sink to the same thread that sink will be consuming data in. + * + * This method may be required as the thread that the data sink was created in is not always + * the same thread that the data transfer will take place in. Therefore any thread specific + * initialisation needs to be performed in the SinkThreadLogon rather than in the creation + * of the data sink. + * + * This is a virtual function that a derrived data sink can implement if any thread specific + * initialisation is required and/or the data sink can create any asynchronous events. + * + * + * @param "aEventHandler" + * This is an MAsyncEventHandler to handle asynchronous events that occur during the + * transfer of multimedia data. The event handler must be in the same thread as the data transfer + * thread - hence the reason it is passed in the SinkThreadLogon as opposed to say the constructor. + * + * + * @return KErrNone if successful, otherwise a system wide error code. + */ + virtual TInt SinkThreadLogon( MAsyncEventHandler& aEventHandler ); + /** + * Method to 'logoff' the data sink from the same thread that sink consumes data in. + * + * This method may be required as the thread that the data sink is deleted in may not be + * the same thread that the data transfer took place in. Therefore any thread specific + * releasing of resources needs to be performed in the SinkThreadLogoff rather than in the destructor + * + * This is a virtual function that a derrived data sink can implement if any thread specific + * releasing of resources is required. + */ + virtual void SinkThreadLogoff(); + /** + * Method to 'prime' the data sink + * + * This is a virtual function that a derrived data sink can implement if + * any data sink specific 'priming' is required + */ + virtual TInt SinkPrimeL(); + /** + * Method to 'play' the data sink + * + * This is a virtual function that a derrived data sink can implement if + * any data sink specific action is required prior to 'playing'ie the start of data transfer + */ + virtual TInt SinkPlayL(); + /** + * Method to 'pause' the data sink + * + * This is a virtual function that a derrived data sink can implement if + * any data sink specific action is required to 'pause' + */ + virtual TInt SinkPauseL(); + + /** + * Method to 'stop' the data sink + * + * This is a virtual function that a derrived data sink can implement if + * any data sink specific action is required to 'stop' + */ + virtual TInt SinkStopL(); + public: //From MPVVideoOutput + + /** + * Set the video frame format. This must be from the list of supported formats. + * @param "aFormat" A mime string describing the video frame format. + * @exception Can leave with one of the system wide error codes + **/ + virtual void SetFormatL(const TDesC8& aFormat); + + /** + * Set the video frame size + * @param "aSize" The video frame size, in pixels + * @exception Can leave with one of the system wide error codes + **/ + virtual void SetVideoFrameSizeL(const TSize& aSize); + + /** + * Get the video frame size + * @param "aSize" The video frame size, in pixels + * @exception Can leave with one of the system wide error codes + **/ + virtual void GetVideoFrameSizeL(TSize& aSize) const; + public: + /** + * Constructor. + */ + CDisplaySinkProxy(MVTVideoSink* aDisplaySink); + + /** + * ConstructL + */ + void ConstructL(); + + /** + * NewL + */ + static CDisplaySinkProxy* NewL(MVTVideoSink* aDisplaySink); + /** + * Get pointer object of data sink. + * @return member variant:iDisplaySink + */ + MVTVideoSink* DisplaySink() { return iDisplaySink; } + private: + MVTVideoSink* iDisplaySink; + CPVDisplaySinkNodeProxy* iDSNodeProxy; + + }; + +NONSHARABLE_CLASS( CAudioSinkProxy ) : public CBase, + public MVTAudioSink + { + public: + MPVDataSink* iAudioSink; + }; + +#endif +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocols/inc/cdatasourceproxy.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocols/inc/cdatasourceproxy.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,322 @@ +/* +* Copyright (c) 2004-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: +* +*/ + + +#ifndef CDATASOURCEPROXY_H +#define CDATASOURCEPROXY_H +NONSHARABLE_CLASS( CPVCameraSourceNodeProxy ) : public CBase, + public MAsyncEventHandler, + public MVTVideoSink + { + public: //From MAsyncEventHandler + /** + * Send event to client. + * @param aEvent + */ + virtual TInt SendEventToClient(const TMMFEvent &aEvent); + public: //From MVTVideoSink + + /** + * Method called by a data source to pass back an filled buffer to the sink. + * + * This is a pure virtual function that each derived class must implement. + * This method is used as the callback when the data sink actively requests a supplier ie a data source + * to fill a buffer by calling the data sources FillBufferL. + * When the data sink gets this callback it knows that the buffer has been filled and is ready to be emptied + * + * @param "aBuffer" + * The buffer that has been filled by a data source and is now available for processing + */ + void BufferFilledL(CMMFBuffer* aBuffer); + + public: //New + /** + * Constructor. + */ + CPVCameraSourceNodeProxy(); + + /** + * Set consumer object. + * @param aConsumer new object + */ + void SetConsumer(MPVDataSinkBase* aConsumer); + private: + MPVDataSinkBase* iConsumer; + }; + +NONSHARABLE_CLASS( CVideoSourceProxy ) : public CBase, + public MPVDataSource, + public MPVVideoInput + { + public: //From MPVPluginBase + + /** + * This API returns multimedias type supported by the data source/sink - + * Audio, Video, Data etc. Each supported type is indicated by a MIME type structure. + * @return Multimedia types supported by the data source/sink. The reference + * is valid until the MPVPluginBase derived object is destroyed. + **/ + virtual const RArray& GetMultimediaTypesL() const; + + /** + * This API is to allow for extensibility of the plugin interface. + * It allows a caller to ask for all UUIDs associated with a particular MIME type. + * If interfaces of the requested MIME type are found within the plugin, they are added + * to the UUIDs array. + * + * Also added to the UUIDs array will be all interfaces which have the requested MIME + * type as a base MIME type. This functionality can be turned off. + * + * @param aMimeType The MIME type of the desired interfaces + * @param aUuids An array to hold the discovered UUIDs + * @param aExactUuidsOnly Turns on/off the retrival of UUIDs with aMimeType as a base type + **/ + virtual void QueryUUID( const TPVMIMEType& aMimeType, RArray& aUuids, bool aExactUuidsOnly = false ); + + /** + * This API is to allow for extensibility of the plugin interface. + * It allows a caller to ask for an instance of a particular interface object to be returned. + * The mechanism is analogous to the COM IUnknown method. The interfaces are identified with + * an interface ID that is a UUID as in DCE and a pointer to the interface object is + * returned if it is supported. Otherwise the returned pointer is NULL. + * @param aUuid The UUID of the desired interface + * @param aInterfacePtr The output pointer to the desired interface + **/ + virtual void QueryInterface( const TPVUuid& aUuid, TPVInterfacePtr& aInterfacePtr ); + + /** + * This API is used to provide a timebase for plugins that deal with synchronized media data + **/ + virtual void SetTimebaseL(MPVSymbianTimebaseInterface* aTimebase); + public: //From MPVDataSourceBase + + /** + * Method called by a MDataSink to request the data source to fill aBuffer with data. + * + * This is a pure virtual function that each derived class must implement. + * This method is used when a data source is passively waiting for requests from a consumer ie a data sink + * to fill a buffer. The data source must call the BufferFilledL member on aConsumer when it has filled + * the buffer with data - the data source can either make this callback synchronously or asynchronously. + * + * @param "aBuffer" + * The buffer that needs filling with data + * + * @param "aConsumer" + * The data sink that consumes the data. The data source needs this to make the BufferFilledL + * callback on aConsumer when the data source has completed filling the aBuffer. + * + * @param "aMediaId" + * This identifies the type of media eg audio or video and the stream id. + * This parameter is required in cases where the source can supply data + * of more than one media type and/or multiple strams of data eg a multimedia file + */ + virtual void FillBufferL(CMMFBuffer* aBuffer, MPVDataSinkBase* aConsumer, TMediaId /*aMediaId*/); + + /** + * Returns a buffer created by the data source. + * + * This is a pure virtual function that each derived class must implement. + * + * @param "aMediaId" + * This identifies the type of media eg audio or video and the stream id. + * This parameter is required in cases where the source can supply data + * of more than one media type and/or multiple strams of data eg a multimedia file + * + * @param "aReference" + * This must be written to by the method to indicate whether the created buffer is + * a 'reference' buffer. A 'reference' buffer is a buffer that is owned by the source + * and should be used in preference to the sink buffer provided the sink buffer + * is also not a reference buffer + * . + * @return The created buffer + */ + virtual CMMFBuffer *CreateSourceBufferL(TMediaId aMediaId, TBool &aReference); + + /** + * Returns a buffer created by the data source. + * + * This is a virtual function that a derived class can implement. + * This can be used in preference to the above CreateSourceBufferL method in cases where + * the source buffer creation has a dependancy on the sink buffer + * + * @param "aMediaId" + * This identifies the type of media eg audio or video and the stream id. + * This parameter is required in cases where the source can supply data + * of more than one media type and/or multiple strams of data eg a multimedia file + * + * @param "aSinkBuffer" + * The sink buffer the nature of which may influence the creation of the source buffer + * + * @param "aReference" + * This must be written to by the method to indicate whether the created buffer is + * a 'reference' buffer. A 'reference' buffer is a buffer that is owned by the source + * and should be used in preference to the sink buffer provided the sink buffer is not a reference buffer + * . + * @return The created buffer + */ + virtual CMMFBuffer *CreateSourceBufferL(TMediaId aMediaId, CMMFBuffer &aSinkBuffer, TBool &aReference); + + /** + * Method to 'logon' the data source to the same thread that source will be supplying data in. + * + * This method may be required as the thread that the data source was created in is not always + * the same thread that the data transfer will take place in. Therefore any thread specific + * initialisation needs to be performed in the SourceThreadLogon rather than in the creation + * of the data source. + * + * This is a virtual function that a derrived data source can implement if any thread specific + * initialisation is required and/or the data source can create any asynchronous events. + * + * + * @param "aEventHandler" + * This is an MAsyncEventHandler to handle asynchronous events that occur during the + * transfer of multimedia data. The event handler must be in the same thread as the data transfer + * thread - hence the reason it is passed in the SourceThreadLogon as opposed to say the constructor. + * + * + * @return KErrNone if successful, otherwise a system wide error code. + */ + virtual TInt SourceThreadLogon( MAsyncEventHandler& aEventHandler ); + + /** + * Method to 'logoff' the data source from the same thread that source supplies data in. + * + * This method may be required as the thread that the data source is deleted in may not be + * the same thread that the data transfer took place in. Therefore any thread specific + * releasing of resources needs to be performed in the SourceThreadLogoff rather than in the destructor + * + * This is a virtual function that a derrived data source can implement if any thread specific + * releasing of resources is required. + */ + virtual void SourceThreadLogoff(); + + /** + * Method to 'prime' the data source. + * + * This is a virtual function that a derrived data source can implement if + * any data source specific 'priming' is required + */ + virtual TInt SourcePrimeL(); + + /** + * Method to 'play' the data source. + * + * This is a virtual function that a derrived data source can implement if + * any data source specific action is required prior to 'playing'ie the start of data transfer + */ + virtual TInt SourcePlayL(); + + /** + * Method to 'pause' the data source. + * + * This is a virtual function that a derrived data source can implement if + * any data source specific action is required to 'pause' + */ + virtual TInt SourcePauseL(); + + /** + * Method to 'stop' the data source. + * + * This is a virtual function that a derrived data source can implement if + * any data source specific action is required to 'stop' + */ + virtual TInt SourceStopL(); + + /** + * Method called by a data sink to pass back an emptied buffer to the source + * + * This is a pure virtual function that each derived class must implement. + * This method is used as the callback when the data source actively requests a consumer ie a data sink + * to empty a buffer by calling the data sinks EmptyBufferL. + * When the data source gets this callback it knows that the buffer has been emptied and can be reused + * + * @param "aBuffer" + * The buffer that has been emptied by a data sink and is now available for reuse + */ + virtual void BufferEmptiedL(CMMFBuffer* aBuffer); + + /** + * Method to indicate whether the data source can create a buffer. + * + * This is a pure virtual function that each derived class must implement. + * + * @return ETrue if the data source can create a buffer else EFalse + */ + virtual TBool CanCreateSourceBuffer(); + public: //From MPVVideoInput + + /** + * Set the video frame format. This must be from the list of supported formats. + * @param "aFormat" The mime string describing the video frame format. + * @exception Can leave with one of the system wide error codes + */ + virtual void SetFormatL(const TDesC8& aFormat); + + /** + * Set the video frame rate. This must be within the range of supported frame rates + * for the current frame size. + * @param "aFrameRate" The video frame rate to set. + * @exception Can leave with one of the system wide error codes + */ + virtual void SetFrameRateL(TReal32 aFrameRate); + + /** + * Set the video frame size. + * @param "aSize" The video frame size, in pixels + * @exception Can leave with one of the system wide error codes + */ + virtual void SetVideoFrameSizeL(const TSize& aSize); + + /** + * Get the video frame size. + * @param "aSize" The video frame size, in pixels + * @exception Can leave with one of the system wide error codes + */ + virtual void GetVideoFrameSizeL(TSize& aSize) const; + public: //new + /** + * Constructor. + */ + CVideoSourceProxy(MVTVideoSource* aVideoSource); + /** + * ConstructL. + */ + void ConstructL( ); + + /** + * NewL. + */ + static CVideoSourceProxy* NewL(MVTVideoSource* aVideoSource); + + /** + * Get member variant. + * @return memeber variant:iVideoSource + */ + MVTVideoSource* VideoSource() { return iVideoSource; } + private: + MVTVideoSource* iVideoSource; + CPVCameraSourceNodeProxy* iCameraSourceNodeProxy; + }; + +NONSHARABLE_CLASS( CAudioSourceProxy ) : public CBase, + public MVTAudioSource + { + public: + MPVDataSource* iAudioSource; + }; +#endif +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocols/inc/ch324confighandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocols/inc/ch324confighandler.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,129 @@ +/* +* Copyright (c) 2004-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: +* +*/ + + +#ifndef CH324ConfigHandler_H +#define CH324ConfigHandler_H +NONSHARABLE_CLASS( TH324ConfigHandler ) : public MPVH324MConfigSymbianObserver + { + public: + + /** + * Constructor. + */ + TH324ConfigHandler(MVtProtocolHandler* aProtocolHandler); + + /** + Handle an event that has been generated. + + @param aResponse The response to a previously issued command. + */ + virtual void MPVH324MConfigCommandCompletedL(const CPVCmdResponse& aResponse); + + /** + Handle an information event. + + @param aEvent + */ + virtual void MPVH324MConfigInformationalEventL(const CPVAsyncInformationalEvent& aEvent); + private: + MVtProtocolHandler* iProtocolHandler; + }; + +NONSHARABLE_CLASS( CH324ConfigCommand ): public CBase, + public MVtH324ConfigCommand + { + public: + /** + * Destructor. + */ + ~CH324ConfigCommand(); + + /** + * Sets the vendor identification data. This does not cause the stack to issue a vendor identifiation request. + * Set to NULL to disable sending vendor id. If set to a valid parameter before Connect, it will cause the stack + * to automatically send it along with the TCS message. + * @param cc + * T35 Country code + * @param ext + * T35 Extension + * @param mc + * T35 Manufacturer code + * @param aProduct + * Product number + * @param aVersion + * Version number + **/ + virtual TInt SetVendorId(TUint8 cc, TUint8 ext, TUint32 mc, const TDesC8* aProduct, const TDesC8* aVersion); + + /** + * This API allows the user to send a videoTemporalSpatialTradeOff command to the peer. + * It is a request to the remote encoder to adjust its encoding in accordance with the tradeoff value. + * A value of 0 indicates a high spatial resolution and a value of 31 indicates a high frame rate. + * The values from 0 to 31 indicate monotonically a higher frame rate. Actual values do not correspond + * to precise values of spatial resolution or frame rate. + * + **/ + virtual TInt SendVideoTemporalSpatialTradeoffCommand(TUint aLogicalChannel, TUint8 aTradeoff); + + /** + * This API allows the user to send a videoTemporalSpatialTradeOff command to the peer. + * It is an indication to the remote decoder that the local encoder has adjusted its encoding parameters + * according to the tradeoff value. + * A value of 0 indicates a high spatial resolution and a value of 31 indicates a high frame rate. + * The values from 0 to 31 indicate monotonically a higher frame rate. Actual values do not correspond + * to precise values of spatial resolution or frame rate. + * + **/ + virtual TInt SendVideoTemporalSpatialTradeoffIndication(TUint aLogicalChannel, TUint8 aTradeoff); + + /** + * This API allows the user to specify the supported resolutions for video for transmit and receive. + * + **/ + virtual TInt SetSupportedResolutions( ); + /** + * This API allows the user to set options for fast call setup procedures + **/ + virtual TInt SetFastCsupOptions( ); + + /** + * Causes the protocol to send the specified user input to the remote terminal using + * control channel. The user input can be either DTMF ot Alphanumeric + * @param user_input A pointer to MVTUserInput + * @returns A unique command id for asynchronous completion + **/ + virtual TInt SendUserInputMessageL(MVTUserInput& user_input); + + /** + * This API allows the user to specify observers for the 324m interface. + * + * @param aHandler the observer for command status and unsolicited informational events + **/ + virtual void SetObserverL(MVtProtocolHandler* aHandler); + + /** + * Get member variant. + */ + MPVH324MConfig*& PVH324ConfigInterface() { return iH324Config; } + private: + MPVH324MConfig* iH324Config; + TH324ConfigHandler* iH324ConfigHandler; + }; +#endif +// End of File + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocols/inc/csessionhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocols/inc/csessionhandler.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,254 @@ +/* +* Copyright (c) 2004-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: +* +*/ + + +#ifndef CSESSIOHANDLER_H +#define CSESSIOHANDLER_H +NONSHARABLE_CLASS( TSessionHandler ) : public MPVCommandStatusObserver, + public MPVInformationalEventObserver, + public MPVErrorEventObserver + { + public: + + /** + Handle an event that has been generated. + + @param "aResponse" "The response to a previously issued command." + */ + virtual void CommandCompletedL(const CPVCmdResponse& aResponse); + + /** + * Handle an informational event that has been generated. + * + * @param "aEvent" "The event to be handled." + */ + virtual void HandleInformationalEventL(const CPVAsyncInformationalEvent& aEvent); + + /** + * Handle an error event that has been generated. + * + * @param "aEvent" "The event to be handled." + */ + virtual void HandleErrorEventL(const CPVAsyncErrorEvent& aEvent); + public: + /** + * Constructor. + */ + TSessionHandler(MVtProtocolHandler* aProtocolHandler); + private: + MVtProtocolHandler* iProtocolHandler; + }; + +NONSHARABLE_CLASS( CSessionCommand ): public CBase, + public MVtSessionCommand + { + public: + /** + * Contructor. + */ + CSessionCommand(TSessionHandler* aSessionHandler, MPV2WaySymbianInterface* aPv2Way); + + /** + * Destructor. + */ + ~CSessionCommand(); + + /** + * This function is valid only in the EIdle state. It is a no-op when + * invoked in any other state. It causes the protocol to transition + * to the ESetup state. The terminal remains in the EInitializing state during + * the transition. + * + * + * @param aInitInfo + * A reference to a TVtInitInfo structure which set Mona on and off + * + * @leave This method can leave with one of the following error codes + * KPVErrInvalidState if invoked in the incorrect state + * KErrNoMemory if the SDK failed to allocate memory during this operation + * @returns A unique command id for asynchronous completion + **/ + virtual TInt InitProtocolL(TVtInitInfo& aInitInfo); + + /** + * For an incoming track (MVTVideoSink) this function pauses sending + * media to the sink (output device) and stops the sink. It then does the protocol + * negotiations with the remote terminal to pause the logical channel for + * the specified track. + * + * For outgoing, it pauses the sending of media from the source and calls Stop() on the + * source. It also performs any necessary protocol negotiations with the remote terminal. + * EVtCommandPause will be sent to the observer when the processing completes. + * + * @returns A unique command id for asynchronous completion + **/ + virtual TInt PauseVideoL(MVTVideoSource& aDataSource); + virtual TInt PauseVideoL(MVTVideoSink& aDataSink); + virtual TInt PauseAudioL(MVTAudioSource& aAudioSource); + + /** + * Resume a previously paused incoming or outgoing track. For incoming, + * this function starts resumes playing out the media to the appropriate + * sink based on the current settings. For outgoing it resumes encoding + * and sending media from the source. + * + * EVtCommandResume will be invoked will be invoked on the observer when the processing completes. + * + * @returns A unique command id for asynchronous completion + **/ + virtual TInt ResumeVideoL(MVTVideoSource& aDataSource); + virtual TInt ResumeVideoL(MVTVideoSink& aDataSink); + virtual TInt ResumeAudioL(MVTAudioSource& aAudioSource); + + /** + * This function is valid only in the ESetup and EInitializing state. It is a + * no-op when invoked in the EIdle state and returns KPVErrInvalidState + * if invoked in any other state. + * + * It causes the protocol to transition back to the EIdle state. The + * terminal remains in the EResetting state during the transition. + * + * While resetting, the protocol de-allocates all resources resources that + * had been previously allocated. When it completes, ResetComplete is called + * and the protocol reverts to the EIdle state. + * + * @leave This method can leave with one of the following error codes + * KPVErrInvalidState if invoked in the incorrect state + * KErrNoMemory if the SDK failed to allocate memory during this operation + * @returns A unique command id for asynchronous completion + **/ + virtual TInt ResetProtocolL(); + + /** + * This function can be invoked only in the ESetup state. The terminal starts connecting with the remote + * terminal based on the specified options and capabilities. + * The EVtCommandConnect command completion event will be passed to the observer + * when connect completes. + * Details about the negotiated session may be obtained by calling the GetSessionParamsL API. + * GetSessionParamsL may be called after call setup is started to get the list of available channels + * and their capabilities. + * Incoming tracks may be opened before ConnectL completes and will be indicated via the + * EVtIndicationIncommingTrack event. + * + * @param aComm + * An optional pointer to a comm server to provide comm source and sink end-points. + * @returns A unique command id for asynchronous completion + **/ + virtual TInt ConnectToProtocolL(MCommServer* aComm); + + /** + * Allows an application to provide a media source to be associated with a logical channel + * of communication with the peer. Sources should be added after the EVtIndicationOutgoingTrack + * indication is received for a newly established logical channel. The media type and + * channel id associated with the logical channel are specified as part of the indication. + * This function accepts a MVtVideoSource which provides additional functionality + * for advertizing capability and exposing configuration APIs. + * Data sources could be of the following types: + * a)raw media sources like camera, microphone etc. + * b)sources of compressed data like file, gateway component etc. + * + * @param aChannelId + * Indicates the channel id to be associated with this source. + * @param aDataSource + * reference to the data source + * @leave This method can leave with one of the following error codes + * KErrNotSupported if the format of the sources/sinks is incomtible with what the SDK can handle + * KPVErrInvalidState if invoked in the incorrect state + * KErrNoMemory if the SDK failed to allocate memory during this operation + * @return A unique command id for asynchronous completion + */ + virtual TInt AddVideoSourceL(const TUint aChannelId, MVTVideoSource &aDataSource); + virtual TInt AddAudioSourceL(const TUint aChannelId, MVTAudioSource &aDataSource); + + /** + * Allows an application to provide a media sink for rendering an incoming media bitstream in a + * logical channel of communication with the peer. + * AddDataSinkL can be called only for established incoming logical channels identified by a unique + * channel id. + * Regular incoming channels are established by the peer and are + * indicated using the EVtIndicationIncomingTrack indication. + * This function takes in PV extension to MVtVideoSink or MVtAudioSink which provides additional functionality + * for advertizing capability and exposing configuration APIs. + * EVtCommandAddDataSink event is sent to the observer on completion of this call. + * + * @param aChannelId + * Indicates the channel id to be associated with this sink. + * @param aDataSink The data sink to be added + * + * @return A unique command id for asynchronous completion + **/ + virtual TInt AddVideoSinkL(const TUint aChannelId, MVTVideoSink &aDataSink); + virtual TInt AddAudioSinkL(const TUint aChannelId, MVTAudioSink &aDataSink); + + /** + * This API is to allow the user to cancel all pending requests. The current request being + * processed, if any, will also be aborted. + * EVtCommandCancelAllCommands will be passed to the command observer on completion. + * @returns A unique command id for asynchronous completion + **/ + virtual TInt CancelAllCommandsL( ); + + /** + * The Disconnect call is valid only when invoked in the EConnecting, and + * EConnected states. It causes the terminal to transition to the + * EDisconnecting state. All the media tracks both incoming and outgoing + * will be closed on invoking Disconnect. On completion, the terminal + * goes to the ESetup state. + * + * It is a no-op when called in any other state. + * + * This is an asynchronous request. The EvtCommandDisconnect event will be + * sent to the observer when the request processing is complete. This + * is the only event the Phone application should expect after calling + * Disconnect. + * + * @returns A unique command id for asynchronous completion + **/ + virtual TInt DisconnectFromProtocolL(); + + /** + * This API is to allow for extensibility of the protocol interface. + * It allows a caller to ask for an instance of a particular interface object to be returned. + * The mechanism is analogous to the COM IUnknown method. The interfaces are identified with + * an interface ID that is a UUID as in DCE and a pointer to the interface object is + * returned if it is supported. Otherwise the returned pointer is NULL. + * @param aType + * @param aProtocolCommand + * @exception not_supported + * leaves if the specified interface id is not supported. + **/ + virtual TInt GetProtocolInterfaceL(TVtConfigType aType, MVtProtocolCommand*& aProtocolCommand); + + /** + * This APIis to be used to release an interface that was previously obtained using + * QueryInterfaceL. + * @param aType + * @param + * @exception not_supported + * leaves if the specified interface id is not supported. + **/ + virtual TInt DeleteProtocolInterfaceL(TVtConfigType aType, MVtProtocolCommand* aProtocolCommand); + public: + MPV2WaySymbianInterface *iPv2Way; + private: + CVideoSourceProxy* iVideoSource; + CDisplaySinkProxy* iDisplaySink; + TSessionHandler* iSessionHandler; + }; +#endif +// End of File + \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocols/inc/cvideoconfighandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocols/inc/cvideoconfighandler.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,97 @@ +/* +* Copyright (c) 2004-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: +* +*/ + + +#ifndef CVideoConfigHandler_H +#define CVideoConfigHandler_H +NONSHARABLE_CLASS( TVideoConfigHandler ): public MPvMp4H263EncExtensionSymbianObserver + { + public: + + /** + * Constructor. + */ + TVideoConfigHandler(MVtProtocolHandler* aProtocolHandler); + + /** + Handle an event that has been generated. + + @param aResponse The response to a previously issued command. + */ + virtual void MPvMp4H263EncExtensionCommandCompletedL(const CPVCmdResponse& aResponse); + + /** + Handle an information event. + + @param aEvent + */ + virtual void HandleMPvMp4H263EncExtensionInformationalEventL(const CPVAsyncInformationalEvent& aEvent); + private: + MVtProtocolHandler* iProtocolHandler; + }; + +NONSHARABLE_CLASS( CVideoConfigCommand ) : public CBase, + public MVtVideoConfigCommand + { + public: + /** + * Destructor. + */ + ~CVideoConfigCommand(); + + /** + * Sets the I-Frame refresh rate of the encoded output. + * + * @param aIFrameInterval I-Frame rate in seconds per I-Frame + * @return True if successful, else false + */ + virtual TInt SetIntraFrameInterval(TUint32 aIFrameInterval); + + /** + * Requests the encoder to encode the next frame as an I-Frame. This menthod is valid + * only when the node is in EPVMFNodeStarted state. If successful, the next encoded + * frame will be an I-Frame. + * + * @return True for success, else false + */ + virtual TInt RequestNextIntraFrame(); + + /** + * Sets the frame rate of encoded output for the specified layer. + * @param aFrameRate Frame rate for the specified layer in frames per second. + * @return True if successful, else false. + */ + virtual TInt SetVideoFrameRate(TUint32 aFrameRate); + + /** + * This API allows the user to specify separate observers for the extension interface. + * + * @param aHandler the observer for unsolicited informational events + **/ + virtual void SetObserverL(MVtProtocolHandler* aHandler); + + /** + * Get member variant. + */ + MPvMp4H263EncExtensionInterfaceSymbian*& PVVideoEncoderInterface() { return iH263Encoder; } + private: + MPvMp4H263EncExtensionInterfaceSymbian* iH263Encoder; + TVideoConfigHandler* iVideoConfigHandler; + }; +#endif +// End of File + \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocols/inc/cvtuserinput.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocols/inc/cvtuserinput.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,72 @@ +/* +* Copyright (c) 2004-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: +* +*/ + + +#ifndef CVTUSERINPUT_H +#define CVTUSERINPUT_H +NONSHARABLE_CLASS( CVTUserInputDtmf ) : public CBase, + public MVTUserInput + { + public: + /** + * ConstructL. + */ + void ConstructL(TUint8 aTone); + /** + * NewL. + */ + static CVTUserInputDtmf* NewL(TUint8 aTone); + + /** + * Destructor. + */ + ~CVTUserInputDtmf(); + + /** + * Virtual function to return the user input type + **/ + virtual TUserInputType GetType(); + CPVUserInputDtmfSymbian* iUII; + }; + +NONSHARABLE_CLASS( CVTUserInputAlphanumeric ) : public CBase, + public MVTUserInput + { + public: + /** + * ConstructL. + */ + void ConstructL(TUint8 aTone); + /** + * NewL. + */ + static CVTUserInputAlphanumeric* NewL(TUint8 aTone); + + /** + * Destructor. + */ + ~CVTUserInputAlphanumeric(); + + /** + * Virtual function to return the user input type + **/ + virtual TUserInputType GetType(); + CPVUserInputAlphanumericSymbian* iUII; + }; +#endif +// End of File + \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocols/inc/mvtprotocolhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocols/inc/mvtprotocolhandler.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,1131 @@ +/* +* Copyright (c) 2004-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: +* +*/ + + +#ifndef MVTENGMEDIAHANDLER_H +#define MVTENGMEDIAHANDLER_H + +// INCLUDES +#include +#include +#include +#include + +typedef TInt TVtCommandId; +typedef TInt TVtCommandStatus; +typedef TDesC8 TVtMIMEType; + +const TUid KVTUidYUVFrameBuffer = {0xFFFFFF0d}; +const TInt KVtUidDataSrcPrime = 0xFFFFFF08; +const TInt KVtUidDataSrcPlay = 0xFFFFFF09; +const TInt KVtUidDataSrcPause = 0xFFFFFF0A; +const TInt KVtUidDataSrcStop = 0xFFFFFF0B; + +_LIT8(KVtVideoMIMETypeH263, "/video/x-pv/compressed/h263"); +_LIT8(KVtVideoMIMETypeM4V, "/video/x-pv/compressed/m4v"); +_LIT8(KVtVideoMIMETypeH264, "/video/x-pv/compressed/h264"); +_LIT8(KVtAudioMIMETypeAMRIF2, "/audio/x-pv/compressed/amr/if2"); +_LIT8(KVtAudioMIMETypeAMRWBIF2, "/audio/x-pv/compressed/amrwb/if2"); +_LIT8(KVtVideoMIMETypeYUV420, "/video/x-pv/raw/yuv420"); + +enum TVt3G324MSupported + { + EVt3G324MMissing, + EVt3G324MSupported + }; + +enum TVtConfigType + { + EVtH324Config, + EVtVideoEncoderConfig + }; + +enum TVtCommandType { + EVtCommandInit, + EVtCommandGetSDKInfo, + EVtCommandGetProtocolState = 3, + EVtCommandReset, + EVtCommandAddDataSource = 6, + EVtCommandRemoveDataSource, + EVtCommandAddDataSink, + EVtCommandRemoveDataSink, + EVtCommandConnect, + EVtCommandDisconnect, + EVtCommandPause, + EVtCommandResume, + EVtCommandGetProtocolInterface =20, + EVtCommandDeleteProtocolInterface, + EVtCommandCancelAllCommands + }; + +enum TVtIndicationType + { + EVtIndicationVideoSpatialTamporalTradeOffCommand, + EVtIndicationVideoSpatialTamporalTradeOffIndication, + EVtIndicationUserInputCapability = 6, + EVtIndicationIncomingTrack = 41, + EVtIndicationOutgoingTrack, + EVtIndicationDisconnect, + EVtIndicationClosingTrack, + EVtIndicationCloseTrack, + EVtIndicationPauseTrack, + EVtIndicationResumeTrack + }; + +enum TVtMediaType + { + EVtAudio = 1, + EVtVideo, + EVtControl, + EVtData, + EVtUserInput, + EVtMediaNone + }; + +enum TVtAudioOutputControlCommand + { + EVtAudioOutputControlGetMaxVolume, + EVtAudioOutputControlGetVolume, + EVtAudioOutputControlSetVolume, + EVtAudioOutputControlGetBalance, + EVtAudioOutputControlSetBalance + }; + +const TUint8 EVtIncoming = 1; + +enum TUserInputType + { + EVtUiiDTMF, + EVtUiiAlphaNumeric + }; + +struct TVtInitInfo + { + TBool iAMRWBOn; + TBool iDisableMpeg4; + }; + +struct TVtIndicationEvent + { + public: + /** + * Constructor. + */ + TVtIndicationEvent(TInt aEventType, const TUint8 *aLocalBuffer) : iEventType(aEventType), iLocalBuffer(aLocalBuffer) + {} + public: + TInt iEventType; + const TUint8 *iLocalBuffer; + }; + +struct TVtCommandResponse + { + public: + /** + * Constructor. + */ + TVtCommandResponse(TVtCommandType aCmdType, TInt aCmdId, TInt iCmdStatus) : iCmdType(aCmdType), iCmdId(aCmdId), iCmdStatus(iCmdStatus) + {} + public: + TVtCommandType iCmdType; + TInt iCmdId; + TInt iCmdStatus; + }; + +struct TVtErrorEvent + { + public: + /** + * Constructor. + */ + TVtErrorEvent(TInt aEventType) : iEventType(aEventType) {} + public: + TInt iEventType; + }; + +struct TVtMMFDataBuffer + { + public: + /** + * Constructor. + */ + TVtMMFDataBuffer(CMMFBuffer* aMmfBuffer,TSize aFrameSize, TPtr8& aPtr) : iMmfBuffer(aMmfBuffer), iFrameSize(aFrameSize), iPtr(aPtr) {} + + /** + * Get the YUV frame size. + * @return The frame size, in pixels + */ + TSize GetFrameSize() {return iFrameSize;} + + /** + * Get MMF buffer. + * @return the MMF buffer + */ + CMMFBuffer* GetMMFBuffer() {return iMmfBuffer;} + + /** + * Get MMF buffer. + * @return the MMF buffer + */ + const CMMFBuffer* GetMMFBuffer() const {return iMmfBuffer;} + + /** + * @return Returns a reference to the data buffer + **/ + TPtr8& Data() {return iPtr;} + + /** + * @return Returns the frame size of the contained buffer. + **/ + const TSize GetFrameSize() const {return iFrameSize;} + + /** + * @return Returns a reference to the data buffer + **/ + const TPtr8& Data() const {return iPtr;} + private: + CMMFBuffer* iMmfBuffer; + TSize iFrameSize; + TPtr8& iPtr; + }; + +class MVTVideoInput + { + public: + + /** + * Set the video frame format. This must be from the list of supported formats. + * @param "aFormat" The mime string describing the video frame format. + * @exception Can leave with one of the system wide error codes + */ + virtual void SetFormatL(const TDesC8& aFormat) {} + + /** + * Set the video frame rate. This must be within the range of supported frame rates + * for the current frame size. + * @param "aFrameRate" The video frame rate to set. + * @exception Can leave with one of the system wide error codes + */ + virtual void SetFrameRateL(TReal32 aFrameRate) {} + + /** + * Set the video frame size + * @param "aSize" The video frame size, in pixels + * @exception Can leave with one of the system wide error codes + */ + virtual void SetVideoFrameSizeL(const TSize& aSize) {} + + /** + * Get the video frame size + * @param "aSize" The video frame size, in pixels + * @exception Can leave with one of the system wide error codes + */ + virtual void GetVideoFrameSizeL(TSize& aSize) const {} + + /** + * This API returns multimedias type supported by the data source/sink - + * Audio, Video, Data etc. Each supported type is indicated by a MIME type structure. + * @return + **/ + virtual const RArray& GetMultimediaTypesL() const {} + }; + +class MVTVideoOutput + { + public: + + /** + * Sets the data format using MIME string. + * @param aFormat The format as a MIME string. + **/ + virtual void SetFormatL(const TDesC8& aFormat) {} + + /** + * Set the video frame size + * @param "aSize" The video frame size, in pixels + * @exception Can leave with one of the system wide error codes + **/ + virtual void SetVideoFrameSizeL(const TSize& aSize) {} + + /** + * Get the video frame size + * @param "aSize" The video frame size, in pixels + * @exception Can leave with one of the system wide error codes + **/ + virtual void GetVideoFrameSizeL(TSize& aSize) const {} + + /** + * This API returns multimedias type supported by the data source/sink - + * Audio, Video, Data etc. Each supported type is indicated by a MIME type structure. + * @return + **/ + virtual const RArray& GetMultimediaTypesL() const {} + }; + +//This class is empty +class MVTAudioSource + { + }; + +//This class is empty +class MVTAudioSink + { + }; + +class MVTVideoSource; +class MVTVideoSink : public MVTVideoOutput + { + public: + /** + * Constructor. + */ + MVTVideoSink(TUid aType): iDataSinkType(aType) {} + + /** + * Method called by a data source to request the data sink to empty aBuffer of data. + * + * This is a pure virtual function that each derived class must implement. + * This method is used when a data sink is passively waiting for requests from a supplier ie a data source + * to empty a buffer. The data sink must call the BufferEmptiedL member on aSupplier when it has emptied + * the buffer of it's data - the data sink can either make this callback synchronously or asynchronously. + * + * @param "aBuffer" + * The full buffer that needs emptying of it's data + * + * @param "aSupplier" + * The data source that supplied the data. The data sink needs this to make the BufferEmptiedL + * callback on aSupplier to indicate to the data source that the data sink has finished with the buffer. + * + * @param "aMediaId" + * This identifies the type of media eg audio or video and the stream id. + * This parameter is required in cases where the source can supply data + * of more than one media type and/or multiple strams of data + */ + virtual void EmptyBufferL( + TVtMMFDataBuffer aDataBuffer, + MVTVideoSource* aSupplier, + TMediaId aMediaId ) {} + + /** + * Method called by a data source to pass back an filled buffer to the sink + * + * This is a pure virtual function that each derived class must implement. + * This method is used as the callback when the data sink actively requests a supplier ie a data source + * to fill a buffer by calling the data sources FillBufferL. + * When the data sink gets this callback it knows that the buffer has been filled and is ready to be emptied + * + * @param "aBuffer" + * The buffer that has been filled by a data source and is now available for processing + */ + virtual void BufferFilledL( CMMFBuffer* aBuffer ) = 0; + + /** + * Method to indicate whether the data sink can create a buffer. + * + * This is a pure virtual function that each derived class must implement. + * + * @return ETrue if the data sink can create a buffer else EFalse + */ + virtual TBool CanCreateSinkBuffer() {return EFalse;} + + /** + * Returns a buffer created by the data sink + * + * This is a pure virtual function that each derived class must implement. + * + * @param "aMediaId" + * This identifies the type of media eg audio or video and the stream id. + * This parameter is required in cases where the source can supply data + * of more than one media type and/or multiple strams of data. + * + * @param "aReference" + * This must be written to by the method to indicate whether the created buffer is + * a 'reference' buffer. A 'reference' buffer is a buffer that is owned by the sink + * and should be used in preference to the source buffer provided the source buffer + * is also not a reference buffer. + * . + * @return The created buffer + */ + virtual CMMFBuffer* CreateSinkBufferL( + TMediaId aMediaId, + TBool &aReference ) {return NULL;} + + /** + * Method to 'logon' the data sink to the same thread that sink will be consuming data in. + * + * This method may be required as the thread that the data sink was created in is not always + * the same thread that the data transfer will take place in. Therefore any thread specific + * initialisation needs to be performed in the SinkThreadLogon rather than in the creation + * of the data sink. + * + * This is a virtual function that a derrived data sink can implement if any thread specific + * initialisation is required and/or the data sink can create any asynchronous events. + * + * + * @param "aEventHandler" + * This is an MAsyncEventHandler to handle asynchronous events that occur during the + * transfer of multimedia data. The event handler must be in the same thread as the data transfer + * thread - hence the reason it is passed in the SinkThreadLogon as opposed to say the constructor. + * + * + * @return KErrNone if successful, otherwise a system wide error code. + */ + virtual TInt SinkThreadLogon( MAsyncEventHandler& aEventHandler ) {return KErrNone;} + + /** + * Method to 'logoff' the data sink from the same thread that sink consumes data in. + * + * This method may be required as the thread that the data sink is deleted in may not be + * the same thread that the data transfer took place in. Therefore any thread specific + * releasing of resources needs to be performed in the SinkThreadLogoff rather than in the destructor + * + * This is a virtual function that a derrived data sink can implement if any thread specific + * releasing of resources is required. + */ + virtual void SinkThreadLogoff() {} + + /** + * Method to 'prime' the data sink + * + * This is a virtual function that a derrived data sink can implement if + * any data sink specific 'priming' is required + */ + virtual TInt SinkPrimeL() {return 0;} + + /** + * Method to 'play' the data sink + * + * This is a virtual function that a derrived data sink can implement if + * any data sink specific action is required prior to 'playing'ie the start of data transfer + */ + virtual TInt SinkPlayL() {return 0;} + + /** + * Method to 'pause' the data sink + * + * This is a virtual function that a derrived data sink can implement if + * any data sink specific action is required to 'pause' + */ + virtual TInt SinkPauseL() {return 0;} + + /** + * Method to 'stop' the data sink + * + * This is a virtual function that a derrived data sink can implement if + * any data sink specific action is required to 'stop' + */ + virtual TInt SinkStopL() {return 0;} + private: + TUid iDataSinkType; + }; + +class MVTVideoSource : public MVTVideoInput + { + public: + + /** + * Constructor. + */ + MVTVideoSource(TUid aType): iDataSourceType(aType) {} + + /** + * Method called by a data sink to request the data source to fill aBuffer with data. + * + * This is a pure virtual function that each derived class must implement. + * This method is used when a data source is passively waiting for requests from a consumer ie a data sink + * to fill a buffer. The data source must call the BufferFilledL member on aConsumer when it has filled + * the buffer with data - the data source can either make this callback synchronously or asynchronously. + * + * @param "aBuffer" + * The buffer that needs filling with data + * + * @param "aConsumer" + * The data sink that consumes the data. The data source needs this to make the BufferFilledL + * callback on aConsumer when the data source has completed filling the aBuffer. + * + * @param "aMediaId" + * This identifies the type of media eg audio or video and the stream id. + * This parameter is required in cases where the source can supply data + * of more than one media type and/or multiple strams of data eg a multimedia file + */ + virtual void FillBufferL( + CMMFBuffer* aBuffer, + MVTVideoSink* aConsumer, + TMediaId aMediaId ) {} + + /** + * Method called by a data sink to pass back an emptied buffer to the source + * + * This is a pure virtual function that each derived class must implement. + * This method is used as the callback when the data source actively requests a consumer ie a data sink + * to empty a buffer by calling the data sinks EmptyBufferL. + * When the data source gets this callback it knows that the buffer has been emptied and can be reused + * + * @param "aBuffer" + * The buffer that has been emptied by a data sink and is now available for reuse + */ + virtual void BufferEmptiedL( CMMFBuffer* aBuffer ) = 0; + + /** + * Method to indicate whether the data source can create a buffer. + * + * This is a pure virtual function that each derived class must implement. + * + * @return ETrue if the data source can create a buffer else EFalse + */ + virtual TBool CanCreateSourceBuffer() {return EFalse;} + + /** + * Returns a buffer created by the data source + * + * This is a pure virtual function that each derived class must implement. + * + * @param "aMediaId" + * This identifies the type of media eg audio or video and the stream id. + * This parameter is required in cases where the source can supply data + * of more than one media type and/or multiple strams of data eg a multimedia file + * + * @param "aReference" + * This must be written to by the method to indicate whether the created buffer is + * a 'reference' buffer. A 'reference' buffer is a buffer that is owned by the source + * and should be used in preference to the sink buffer provided the sink buffer + * is also not a reference buffer + * . + * @return The created buffer + */ + virtual CMMFBuffer* CreateSourceBufferL( + TMediaId aMediaId, + TBool &aReference ) {return NULL;} + + /** + * Returns a buffer created by the data source + * + * This is a virtual function that a derived class can implement. + * This can be used in preference to the above CreateSourceBufferL method in cases where + * the source buffer creation has a dependancy on the sink buffer + * + * @param "aMediaId" + * This identifies the type of media eg audio or video and the stream id. + * This parameter is required in cases where the source can supply data + * of more than one media type and/or multiple strams of data eg a multimedia file + * + * @param "aSinkBuffer" + * The sink buffer the nature of which may influence the creation of the source buffer + * + * @param "aReference" + * This must be written to by the method to indicate whether the created buffer is + * a 'reference' buffer. A 'reference' buffer is a buffer that is owned by the source + * and should be used in preference to the sink buffer provided the sink buffer is not a reference buffer + * . + * @return The created buffer + */ + virtual CMMFBuffer* CreateSourceBufferL( + TMediaId aMediaId, + CMMFBuffer& aSinkBuffer, + TBool &aReference ) {return NULL;} + + /** + * Method to 'logon' the data source to the same thread that source will be supplying data in. + * + * This method may be required as the thread that the data source was created in is not always + * the same thread that the data transfer will take place in. Therefore any thread specific + * initialisation needs to be performed in the SourceThreadLogon rather than in the creation + * of the data source. + * + * This is a virtual function that a derrived data source can implement if any thread specific + * initialisation is required and/or the data source can create any asynchronous events. + * + * + * @param "aEventHandler" + * This is an MAsyncEventHandler to handle asynchronous events that occur during the + * transfer of multimedia data. The event handler must be in the same thread as the data transfer + * thread - hence the reason it is passed in the SourceThreadLogon as opposed to say the constructor. + * + * + * @return KErrNone if successful, otherwise a system wide error code. + */ + virtual TInt SourceThreadLogon( MAsyncEventHandler& aEventHandler ) {return KErrNone;} + + /** + * Method to 'logoff' the data source from the same thread that source supplies data in. + * + * This method may be required as the thread that the data source is deleted in may not be + * the same thread that the data transfer took place in. Therefore any thread specific + * releasing of resources needs to be performed in the SourceThreadLogoff rather than in the destructor + * + * This is a virtual function that a derrived data source can implement if any thread specific + * releasing of resources is required. + */ + virtual void SourceThreadLogoff() {} + + /** + * Method to 'prime' the data source + * + * This is a virtual function that a derrived data source can implement if + * any data source specific 'priming' is required + */ + virtual TInt SourcePrimeL() {return 0;} + + /** + * Method to 'play' the data source + * + * This is a virtual function that a derrived data source can implement if + * any data source specific action is required prior to 'playing'ie the start of data transfer + */ + virtual TInt SourcePlayL() {return 0;} + + /** + * Method to 'pause' the data source + * + * This is a virtual function that a derrived data source can implement if + * any data source specific action is required to 'pause' + */ + virtual TInt SourcePauseL() {return 0;} + + /** + * Method to 'stop' the data source + * + * This is a virtual function that a derrived data source can implement if + * any data source specific action is required to 'stop' + */ + virtual TInt SourceStopL() {return 0;} + private: + TUid iDataSourceType; + }; + +class MCommServer + { + }; + +class MVtProtocolCommand + { + public: + enum TVtProtocolState + { + EIdle, + EInitializing, + ESetup, + EConnecting, + EConnected, + EDisconnecting, + EResetting + }; + }; + +class MVtProtocolHandler + { + public: + + /** + * Handle an event that has been generated. + * + * @param "aResponse" "The response to a previously issued command." + */ + virtual void HandleSessionCommandEventL(const TVtCommandResponse& aResponse) = 0; + + /** + * Handle an informational event that has been generated. + * + * @param "aEvent" "The event to be handled." + */ + virtual void HandleSessionInformationalEventL(const TVtIndicationEvent& aEvent) = 0; + + /** + * Handle an error event that has been generated. + * + * @param "aEvent" "The event to be handled." + */ + virtual void HandleSessionErrorEventL(const TVtErrorEvent& aEvent) = 0; + + /** + * Signals completion of the audio output control command. + * @param aId The command id of the completed command. + * @param aCmd The command type. + * @param aContextData The context data passed in with the command. + * @param aStatus The command completion status. + **/ + virtual void HandleAudioOutputControlCommandComplete(TInt aId, TVtAudioOutputControlCommand aCmd, TAny *aContextData ,TInt aStatus) = 0; + /** + * Handle an event that has been generated. + * + * @param "aResponse" "The response to a previously issued command." + */ + virtual void HandleVideoEncoderCommandCompletedL(const TVtCommandResponse& aResponse) = 0; + + /** + * Handle an event that has been generated. + * + * @param "aEvent" "The event to be handled." + */ + virtual void HandleVideoEncoderInformationalEventL(const TVtIndicationEvent& aEvent) = 0; + + /** + * Handle an event that has been generated. + * + * @param "aResponse" "The response to a previously issued command." + */ + virtual void HandleH324MConfigCommandCompletedL(const TVtCommandResponse& aResponse) = 0; + + /** + * Handle an event that has been generated. + * + * @param "aEvent" "The event to be handled." + */ + virtual void HandleH324MConfigInformationalEventL(const TVtIndicationEvent& aEvent) = 0; + virtual ~MVtProtocolHandler() {} + }; + + +class MVtSessionCommand : public MVtProtocolCommand + { + public: + /** + * This function is valid only in the EIdle state. It is a no-op when + * invoked in any other state. It causes the protocol to transition + * to the ESetup state. The terminal remains in the EInitializing state during + * the transition. + * + * + * @param aInitInfo + * A reference to a TVtInitInfo structure which set Mona on and off + * + * @leave This method can leave with one of the following error codes + * KErrNoMemory if the SDK failed to allocate memory during this operation + * @returns A unique command id for asynchronous completion + **/ + virtual TInt InitProtocolL(TVtInitInfo& aInitInfo) = 0; + + /** + * For an incoming track (MVTVideoSink) this function pauses sending + * media to the sink (output device) and stops the sink. It then does the protocol + * negotiations with the remote terminal to pause the logical channel for + * the specified track. + * + * For outgoing, it pauses the sending of media from the source and calls Stop() on the + * source. It also performs any necessary protocol negotiations with the remote terminal. + * EVtCommandPause will be sent to the observer when the processing completes. + * + * @returns A unique command id for asynchronous completion + **/ + virtual TInt PauseVideoL(MVTVideoSource& aDataSource) = 0; + virtual TInt PauseVideoL(MVTVideoSink& aDataSink) = 0; + virtual TInt PauseAudioL(MVTAudioSource& aAudioSource) = 0; + + /** + * Resume a previously paused incoming or outgoing track. For incoming, + * this function starts resumes playing out the media to the appropriate + * sink based on the current settings. For outgoing it resumes encoding + * and sending media from the source. + * EVtCommandResume will be invoked will be invoked on the observer when the processing completes. + * + * @returns A unique command id for asynchronous completion + **/ + virtual TInt ResumeVideoL(MVTVideoSource& aDataSource) = 0; + virtual TInt ResumeVideoL(MVTVideoSink& aDataSink) = 0; + virtual TInt ResumeAudioL(MVTAudioSource& aAudioSource) = 0; + + /** + * This function is valid only in the ESetup and EInitializing state. It is a + * no-op when invoked in the EIdle state + * + * It causes the protocol to transition back to the EIdle state. The + * terminal remains in the EResetting state during the transition. + * + * While resetting, the protocol de-allocates all resources resources that + * had been previously allocated. When it completes, ResetComplete is called + * and the protocol reverts to the EIdle state. + * + * @leave This method can leave with one of the following error codes + * KErrNoMemory if the SDK failed to allocate memory during this operation + * @returns A unique command id for asynchronous completion + **/ + virtual TInt ResetProtocolL() = 0; + + /** + * This function can be invoked only in the ESetup state. The terminal starts connecting with the remote + * terminal based on the specified options and capabilities. + * The EVtCommandConnect command completion event will be passed to the observer + * when connect completes. + * Details about the negotiated session may be obtained by calling the GetSessionParamsL API. + * GetSessionParamsL may be called after call setup is started to get the list of available channels + * and their capabilities. + * Incoming tracks may be opened before ConnectL completes and will be indicated via the + * EVtIndicationIncommingTrack event. + * + * @param aComm + * An optional pointer to a comm server to provide comm source and sink end-points. + * @returns A unique command id for asynchronous completion + **/ + virtual TInt ConnectToProtocolL(MCommServer* aComm) = 0; + + /** + * Allows an application to provide a media source to be associated with a logical channel + * of communication with the peer. Sources should be added after the EVtIndicationOutgoingTrack + * indication is received for a newly established logical channel. The media type and + * channel id associated with the logical channel are specified as part of the indication. + * This function accepts a MVtVideoSource which provides additional functionality + * for advertizing capability and exposing configuration APIs. + * Data sources could be of the following types: + * a)raw media sources like camera, microphone etc. + * b)sources of compressed data like file, gateway component etc. + * + * @param aChannelId + * Indicates the channel id to be associated with this source. + * @param aDataSource + * reference to the data source + * @leave This method can leave with one of the following error codes + * KErrNotSupported if the format of the sources/sinks is incomtible with what the SDK can handle + * KErrNoMemory if the SDK failed to allocate memory during this operation + * @return A unique command id for asynchronous completion + */ + virtual TInt AddVideoSourceL(const TUint aChannelId, MVTVideoSource &aDataSource) = 0; + virtual TInt AddAudioSourceL(const TUint aChannelId, MVTAudioSource &aDataSource) = 0; + + /** + * Allows an application to provide a media sink for rendering an incoming media bitstream in a + * logical channel of communication with the peer. + * AddDataSinkL can be called only for established incoming logical channels identified by a unique + * channel id. + * Regular incoming channels are established by the peer and are + * indicated using the EVtIndicationIncomingTrack indication. + * This function takes in PV extension to MVtVideoSink or MVtAudioSink which provides additional functionality + * for advertizing capability and exposing configuration APIs. + * EVtCommandAddDataSink event is sent to the observer on completion of this call. + * + * @param aChannelId + * Indicates the channel id to be associated with this sink. + * @param aDataSink The data sink to be added + * + * @return A unique command id for asynchronous completion + **/ + virtual TInt AddVideoSinkL(const TUint aChannelId, MVTVideoSink &aDataSink) = 0; + virtual TInt AddAudioSinkL(const TUint aChannelId, MVTAudioSink &aDataSink) = 0; + + /** + * This API is to allow the user to cancel all pending requests. The current request being + * processed, if any, will also be aborted. + * EVtCommandCancelAllCommands will be passed to the command observer on completion. + * @returns A unique command id for asynchronous completion + **/ + virtual TInt CancelAllCommandsL( ) = 0; + + /** + * The Disconnect call is valid only when invoked in the EConnecting, and + * EConnected states. It causes the terminal to transition to the + * EDisconnecting state. All the media tracks both incoming and outgoing + * will be closed on invoking Disconnect. On completion, the terminal + * goes to the ESetup state. + * + * It is a no-op when called in any other state. + * + * This is an asynchronous request. The EvtCommandDisconnect event will be + * sent to the observer when the request processing is complete. This + * is the only event the Phone application should expect after calling + * Disconnect. + * + * @returns A unique command id for asynchronous completion + **/ + virtual TInt DisconnectFromProtocolL() = 0; + + /** + * This API is to allow for extensibility of the protocol interface. + * It allows a caller to ask for an instance of a particular interface object to be returned. + * The mechanism is analogous to the COM IUnknown method. The interfaces are identified with + * an interface ID that is a UUID as in DCE and a pointer to the interface object is + * returned if it is supported. Otherwise the returned pointer is NULL. + * @param aType + * @param aProtocolCommand + * @exception not_supported + * leaves if the specified interface id is not supported. + **/ + virtual TInt GetProtocolInterfaceL(TVtConfigType aType, MVtProtocolCommand*& aProtocolCommand) = 0; + + /** + * This APIis to be used to release an interface that was previously obtained using + * QueryInterfaceL. + * @param aType + * @param + * @exception not_supported + * leaves if the specified interface id is not supported. + **/ + virtual TInt DeleteProtocolInterfaceL(TVtConfigType aType, MVtProtocolCommand*) = 0; + + /** + * Destructor. + */ + virtual ~MVtSessionCommand() {} + }; + +class MVTUserInput + { + public: + + /** + * @returns Returns the user input type. + **/ + virtual TUserInputType GetType() = 0; + virtual ~MVTUserInput() {} + }; + +class MVtH324ConfigCommand : public MVtProtocolCommand + { + public: + + /** + * This API allows the user to specify observers for the 324m interface. + * + * @param aHandler the observer for command status and unsolicited informational events + **/ + virtual void SetObserverL(MVtProtocolHandler* aHandler) = 0; + + /** + * Sets the vendor identification data. This does not cause the stack to issue a vendor identifiation request. + * Set to NULL to disable sending vendor id. If set to a valid parameter before Connect, it will cause the stack + * to automatically send it along with the TCS message. + * @param cc + * T35 Country code + * @param ext + * T35 Extension + * @param mc + * T35 Manufacturer code + * @param aProduct + * Product number + * @param aVersion + * Version number + **/ + virtual TInt SetVendorId(TUint8 cc, TUint8 ext, TUint32 mc, const TDesC8* aProduct, const TDesC8* aVersion) = 0; + /** + * This API allows the user to send a videoTemporalSpatialTradeOff command to the peer. + * It is a request to the remote encoder to adjust its encoding in accordance with the tradeoff value. + * A value of 0 indicates a high spatial resolution and a value of 31 indicates a high frame rate. + * The values from 0 to 31 indicate monotonically a higher frame rate. Actual values do not correspond + * to precise values of spatial resolution or frame rate. + * + **/ + virtual TInt SendVideoTemporalSpatialTradeoffCommand(TUint aLogicalChannel, TUint8 aTradeoff)=0; + + /** + * This API allows the user to send a videoTemporalSpatialTradeOff command to the peer. + * It is an indication to the remote decoder that the local encoder has adjusted its encoding parameters + * according to the tradeoff value. + * A value of 0 indicates a high spatial resolution and a value of 31 indicates a high frame rate. + * The values from 0 to 31 indicate monotonically a higher frame rate. Actual values do not correspond + * to precise values of spatial resolution or frame rate. + * + **/ + virtual TInt SendVideoTemporalSpatialTradeoffIndication(TUint aLogicalChannel, TUint8 aTradeoff)=0; + + /** + * This API allows the user to specify the supported resolutions for video for transmit and receive. + * + **/ + virtual TInt SetSupportedResolutions( ) = 0; + + /** + * This API allows the user to set options for fast call setup procedures + **/ + + virtual TInt SetFastCsupOptions( ) = 0; + + /** + * Causes the protocol to send the specified user input to the remote terminal using + * control channel. The user input can be either DTMF ot Alphanumeric + * @param user_input A pointer to MVTUserInput + * @returns A unique command id for asynchronous completion + **/ + virtual TInt SendUserInputMessageL(MVTUserInput& user_input) = 0; + }; + +class MVtVideoConfigCommand : public MVtProtocolCommand + { + public: + + /** + * This API allows the user to specify separate observers for the extension interface. + * + * @param aHandler the observer for unsolicited informational events + **/ + virtual void SetObserverL(MVtProtocolHandler* aHandler) = 0; + + /** + * Sets the I-Frame refresh rate of the encoded output. + * + * @param aIFrameInterval I-Frame rate in seconds per I-Frame + * @return True if successful, else false + */ + virtual TInt SetIntraFrameInterval(TUint32 aIFrameInterval) = 0; + + /** + * Requests the encoder to encode the next frame as an I-Frame. If successful, the next encoded + * frame will be an I-Frame. + * + * @return True for success, else false + */ + virtual TInt RequestNextIntraFrame() = 0; + + /** + * Sets the frame rate of encoded output for the specified layer. + * @param aFrameRate Frame rate for the specified layer in frames per second. + * @return True if successful, else false. + */ + virtual TInt SetVideoFrameRate(TUint32 aFrameRate) = 0; + }; + +class MVtAudioConfigCommand : public MVtProtocolCommand + { + public: + + /** + * This API allows the user to specify observers for the 324m interface. + * + * @param aHandler + **/ + virtual void SetObserverL(MVtProtocolHandler* aHandler) = 0; + + /** + * Method to set the playback volume to the specified value. + * + * This is a pure virtual function that each derived class must implement. + * It is also an asynchronous function which will be answered with a callback. + * + * @param aNewVolume + * An input parameter to hold the value for the requested playback volume. + * + * @returns Returns a command ID that can be used to identify a command completion result with corresponding request. + */ + virtual TInt SetAudioVolumeL(TInt aVolume) = 0; + + /** + * Method to get the maximum valid value for the playback volume. + * + * This is a pure virtual function that each derived class must implement. + * It is also an asynchronous function which will be answered with a callback. + * + * @param aMaxVolume + * An output parameter to hold the value for the maximum valid playback volume. + * Note that the parameter should not be used until the callback indicates that the + * method has completed. + * + * @returns Returns a command ID that can be used to identify a command completion result with corresponding request. + */ + virtual TInt GetMaxAudioVolumeL(TInt& aMaxVolume) = 0; + }; + +class VTProtocolFactory + { + public: + + /** + * Create one instance. + */ + IMPORT_C static MVtSessionCommand* CreateSessionCommandL(MVtProtocolHandler* aProtocolHandler, TBool aEnableProxy, TVt3G324MSupported& a3G324MSupported); + + /** + * This function allows the application to delete an instance of a terminal + * and reclaim all allocated resources. A terminal should be deleted only in + * the EIdle state. An attempt to delete a terminal in any other state will + * result in unpredictable behavior. + * + * @param terminal the terminal to be deleted. + * + **/ + IMPORT_C static void DeleteSessionCommand( MVtSessionCommand* aSessionCommand ); + + /** + * Creates an instance of a DevSound audio data source. + * + * @param None + * + * @returns A pointer to the interface + **/ + IMPORT_C static MVTAudioSource* CreateAudioSource(); + + /** + * Deletes an instance of a DevSound audio data source + * that was previously created with CreateAudioSource(); + * + * @param aSource The audio data source to be deleted. + * + * @returns status + **/ + IMPORT_C static TInt DeletAudioSource(MVTAudioSource *aSource); + + /** + * Creates an instance of a DevSound audio data sink. + * + * @param None + * + * @returns A pointer to the interface + **/ + IMPORT_C static MVTAudioSink* CreateAudioSink(); + + /** + * Deletes an instance of a DevSound audio data sink + * that was previously created with CreateAudioSink(); + * + * @param The audio data sink to be deleted. + * + * @returns status + **/ + IMPORT_C static TInt DeleteAudioSink(MVTAudioSink *aSink); + + /** + * Creates an instance of a comm server of a particular name, to be used to + * initialize the terminal. + * + * + * @returns A pointer to a terminal or leaves if the type is invalid or the system is out of resources + **/ + IMPORT_C static MCommServer* CreateCommServerL(const TDesC & aName, TBool aEnableBitReversal=EFalse); + + /** + * This function allows the application to delete an instance of a comm server + * and reclaim all allocated resources. A comm server should be deleted only when the + * protocol is in the EIdle state. An attempt to delete a comm server in any other state + * could result in memory corruption within the protocol. This function will leave with + * KErrInUse if the comm server is still in use. However it will not check the state of the + * protocol that is using the comm server. + * + * @param aCommServer the comm server to be deleted. + * + * @returns a status code indicating success or failure + **/ + IMPORT_C static void DeleteCommServerL(MCommServer* aCommServer); + + /** + * Create instance. + * @param aUIITyep + * @param aTone + */ + IMPORT_C static MVTUserInput* CreateUserInputIndication(TUserInputType aUIIType, TUint8 aTone); + + /** + * Delete instance. + * @param aUII + */ + IMPORT_C static void DeleteUserInputIndication(MVTUserInput* aUII); + + /** + * + * @param aAudioSink + */ + IMPORT_C static MVtAudioConfigCommand* GetAudioConfigCommandL(MVTAudioSink* aAudioSink); + }; + +#endif +// End of File + \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocols/src/caudioconfighandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocols/src/caudioconfighandler.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,114 @@ +/* +* Copyright (c) 2004-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: +* +*/ + + +#include +#include +#include "mvtprotocolhandler.h" +#include "caudioconfighandler.h" + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// ----------------------------------------------------------------------------- +// TAudioConfigHandler::TAudioConfigHandler +// Constructor. +// ----------------------------------------------------------------------------- +// +TAudioConfigHandler::TAudioConfigHandler(MVtProtocolHandler* aProtocolHandler) : iProtocolHandler(aProtocolHandler) + { + __IF_DEBUG(Print(_L("VTProto: TAudioConfigHandler::TAudioConfigHandler<"))); + __IF_DEBUG(Print(_L("VTProto: TAudioConfigHandler::TAudioConfigHandler>"))); + } + +// ----------------------------------------------------------------------------- +// TAudioConfigHandler::AudioOutputControlCommandComplete +// Signals completion of the audio output control command. +// ----------------------------------------------------------------------------- +// +void TAudioConfigHandler::AudioOutputControlCommandComplete(TPVCommandId aId + ,TPVAudioOutputControlCommand aCmd + ,TAny *aContextData + ,TInt aStatus) + { + __IF_DEBUG(Print(_L("VTProto: TAudioConfigHandler::AudioOutputControlCommandComplete<"))); + iProtocolHandler->HandleAudioOutputControlCommandComplete(aId, (TVtAudioOutputControlCommand)aCmd, aContextData, aStatus); + __IF_DEBUG(Print(_L("VTProto: TAudioConfigHandler::AudioOutputControlCommandComplete>"))); + } +// ----------------------------------------------------------------------------- +// CAudioConfigCommand::CAudioConfigCommand +// Constructor. +// ----------------------------------------------------------------------------- +// +CAudioConfigCommand::CAudioConfigCommand(MPVAudioOutputControl* aAudioCtrl) : iAudioCtrl(aAudioCtrl) + { + __IF_DEBUG(Print(_L("VTProto: CAudioConfigCommand::CAudioConfigCommand<"))); + __IF_DEBUG(Print(_L("VTProto: CAudioConfigCommand::CAudioConfigCommand>"))); + } + +// ----------------------------------------------------------------------------- +// CAudioConfigCommand::SetObserverL +// This API allows the user to specify observers for the 324m interface. +// ----------------------------------------------------------------------------- +// +void CAudioConfigCommand::SetObserverL(MVtProtocolHandler* aHandler) + { + __IF_DEBUG(Print(_L("VTProto: CAudioConfigCommand::SetObserverL<"))); + iAudioConfigHandler = new (ELeave)TAudioConfigHandler(aHandler); + iAudioCtrl->SetAudioOutputControlObserver(iAudioConfigHandler); + __IF_DEBUG(Print(_L("VTProto: CAudioConfigCommand::SetObserverL>"))); + } + +// ----------------------------------------------------------------------------- +// CAudioConfigCommand::SetAudioVolumeL +// Method to set the playback volume to the specified value. +// ----------------------------------------------------------------------------- +// +TInt CAudioConfigCommand::SetAudioVolumeL(TInt aVolume) + { + __IF_DEBUG(Print(_L("VTProto: CAudioConfigCommand::SetAudioVolumeL"))); + __IF_DEBUG(Print(_L("VTProto: CAudioConfigCommand::SetAudioVolumeL aVolume %d"), aVolume)); + return iAudioCtrl->SetVolumeL(aVolume); + } + +// ----------------------------------------------------------------------------- +// CAudioConfigCommand::GetMaxAudioVolumeL +// Method to get the maximum valid value for the playback volume. +// ----------------------------------------------------------------------------- +// +TInt CAudioConfigCommand::GetMaxAudioVolumeL(TInt& aMaxVolume) + { + __IF_DEBUG(Print(_L("VTProto: CAudioConfigCommand::GetMaxAudioVolumeL"))); + __IF_DEBUG(Print(_L("VTProto: CAudioConfigCommand::GetMaxAudioVolumeL aMaxVolume %d"), aMaxVolume)); + return iAudioCtrl->GetMaxVolumeL(aMaxVolume); + } + +// ----------------------------------------------------------------------------- +// CAudioConfigCommand::~CAudioConfigCommand +// Destructor. +// ----------------------------------------------------------------------------- +// +CAudioConfigCommand::~CAudioConfigCommand() + { + __IF_DEBUG(Print(_L("VTProto: CAudioConfigCommand::~CAudioConfigCommand>"))); + delete iAudioConfigHandler; + __IF_DEBUG(Print(_L("VTProto: CAudioConfigCommand::~CAudioConfigCommand"))); + } +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocols/src/cdatasinkproxy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocols/src/cdatasinkproxy.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,295 @@ +/* +* Copyright (c) 2004-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: +* +*/ + + +#include +#include "mvtprotocolhandler.h" +#include "cdatasinkproxy.h" + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// ----------------------------------------------------------------------------- +// CPVDisplaySinkNodeProxy::SetSupplier +// Set new supplier . +// ----------------------------------------------------------------------------- +// +void CPVDisplaySinkNodeProxy::SetSupplier(MPVDataSourceBase* aSupplier) + { + __IF_DEBUG(Print(_L("VTProto: CPVDisplaySinkNodeProxy::SetSupplier<"))); + iSupplier = aSupplier; + __IF_DEBUG(Print( _L( "VTProto: CPVDisplaySinkNodeProxy::SetSupplier>" ) )); + } + +// ----------------------------------------------------------------------------- +// CPVDisplaySinkNodeProxy::BufferEmptiedL +// Method called by a data sink to pass back an emptied buffer to the source. +// ----------------------------------------------------------------------------- +// +void CPVDisplaySinkNodeProxy::BufferEmptiedL(CMMFBuffer* aBuffer) + { + __IF_DEBUG(Print( _L( "VTProto: CPVDisplaySinkNodeProxy::BufferEmptiedL<" ) )); + iSupplier->BufferEmptiedL(aBuffer); //call actually PV code + __IF_DEBUG(Print( _L( "VTProto: CPVDisplaySinkNodeProxy::BufferEmptiedL>" ) )); + } + +// ----------------------------------------------------------------------------- +// CPVDisplaySinkNodeProxy::CPVDisplaySinkNodeProxy +// Constructor. +// ----------------------------------------------------------------------------- +// +CPVDisplaySinkNodeProxy::CPVDisplaySinkNodeProxy() : MVTVideoSource(KNullUid) + { + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::CDisplaySinkProxy +// Constructor. +// ----------------------------------------------------------------------------- +// +CDisplaySinkProxy::CDisplaySinkProxy(MVTVideoSink* aDisplaySink) : MPVDataSink(KNullUid), iDisplaySink(aDisplaySink) + { + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::CDisplaySinkProxy<" ) )); + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::CDisplaySinkProxy iDisplaySink %d>" ), iDisplaySink)); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::ConstructL +// ----------------------------------------------------------------------------- +// +void CDisplaySinkProxy::ConstructL() + { + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::ConstructL<" ) )); + iDSNodeProxy = new (ELeave)CPVDisplaySinkNodeProxy(); + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::ConstructL>" ) )); + } + + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::NewL +// ----------------------------------------------------------------------------- +// +CDisplaySinkProxy* CDisplaySinkProxy::NewL(MVTVideoSink* aDisplaySink) + { + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::NewL<" ) )); + CDisplaySinkProxy* self = new (ELeave)CDisplaySinkProxy(aDisplaySink); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::NewL>" ) )); + return self; + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::QueryInterface +// This API is to allow for extensibility of the plugin interface. +// ----------------------------------------------------------------------------- +// +void CDisplaySinkProxy::QueryInterface( const TPVUuid& aUuid, TPVInterfacePtr& aInterfacePtr ) + { + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::QueryInterface<" ) )); + if ( aUuid == KPVUidVideoOutputInterface ) + { + MPVVideoInput* interfaceP = (MPVVideoInput*) this; + aInterfacePtr = (TPVInterfacePtr) interfaceP; + } + else + { + aInterfacePtr = NULL; + } + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::QueryInterface aInterfacePtr %d>" ), aInterfacePtr )); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::GetMultimediaTypesL +// This API returns multimedias type supported by the data source/sink. +// ----------------------------------------------------------------------------- +// +const RArray& CDisplaySinkProxy::GetMultimediaTypesL() const + { + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::GetMultimediaTypesL" ) )); + return iDisplaySink->GetMultimediaTypesL(); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::QueryUUID +// This API is to allow for extensibility of the plugin interface. +// ----------------------------------------------------------------------------- +// +void CDisplaySinkProxy::QueryUUID( const TPVMIMEType& aMimeType, RArray& aUuids, bool aExactUuidsOnly) + { + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::SetTimebaseL +// This API is used to provide a timebase for plugins that deal with synchronized media data. +// ----------------------------------------------------------------------------- +// +void CDisplaySinkProxy::SetTimebaseL(MPVSymbianTimebaseInterface* aTimebase) + { + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::EmptyBufferL +// Method called by a MDataSource to request the data sink to empty aBuffer of data. +// ----------------------------------------------------------------------------- +// +void CDisplaySinkProxy::EmptyBufferL(CMMFBuffer *aBuffer, MPVDataSourceBase* aSupplier, TMediaId) + { + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::EmptyBufferL<" ) )); + iDSNodeProxy->SetSupplier(aSupplier); + CPVMMFPointerBuffer& pvMMFBuffer = *static_cast< CPVMMFPointerBuffer* >( aBuffer ); + TVtMMFDataBuffer mmfDataBuffer(aBuffer, pvMMFBuffer.GetFrameSize(), static_cast(pvMMFBuffer.Data())); + iDisplaySink->EmptyBufferL(mmfDataBuffer, iDSNodeProxy, TMediaId()); + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::EmptyBufferL>" ) )); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::BufferFilledL +// Method called by a data source to pass back an filled buffer to the sink. +// ----------------------------------------------------------------------------- +// +void CDisplaySinkProxy::BufferFilledL(CMMFBuffer* aBuffer) + { + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::BufferFilledL" ) )); + return iDisplaySink->BufferFilledL(aBuffer); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::CanCreateSinkBuffer +// Method to indicate whether the data sink can create a buffer. +// ----------------------------------------------------------------------------- +// +TBool CDisplaySinkProxy::CanCreateSinkBuffer() + { + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::CanCreateSinkBuffer" ) )); + return iDisplaySink->CanCreateSinkBuffer(); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::CreateSinkBufferL +// Returns a buffer created by the data sink +// ----------------------------------------------------------------------------- +// +CMMFBuffer* CDisplaySinkProxy::CreateSinkBufferL(TMediaId aMediaId, TBool &aReference ) + { + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::CreateSinkBufferL" ) )); + return iDisplaySink->CreateSinkBufferL(aMediaId, aReference); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::SinkThreadLogon +// Method to 'logon' the data sink to the same thread that sink will be consuming data in. +// ----------------------------------------------------------------------------- +// +TInt CDisplaySinkProxy::SinkThreadLogon( MAsyncEventHandler& aEventHandler ) + { + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::SinkThreadLogon" ) )); + return iDisplaySink->SinkThreadLogon(aEventHandler); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::SinkThreadLogoff +// Method to 'logoff' the data sink from the same thread that sink consumes data in. +// ----------------------------------------------------------------------------- +// +void CDisplaySinkProxy::SinkThreadLogoff() + { + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::SinkThreadLogoff" ) )); + iDisplaySink->SinkThreadLogoff(); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::SinkPrimeL +// Method to 'prime' the data sink. +// ----------------------------------------------------------------------------- +// +TInt CDisplaySinkProxy::SinkPrimeL() + { + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::SinkPrimeL" ) )); + return iDisplaySink->SinkPrimeL(); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::SinkPlayL +// Method to 'play' the data sink. +// ----------------------------------------------------------------------------- +// +TInt CDisplaySinkProxy::SinkPlayL() + { + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::SinkPlayL" ) )); + return iDisplaySink->SinkPlayL(); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::SinkPauseL +// Method to 'pause' the data sink. +// ----------------------------------------------------------------------------- +// +TInt CDisplaySinkProxy::SinkPauseL() + { + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::SinkPauseL" ) )); + return iDisplaySink->SinkPauseL(); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::SinkStopL +// Method to 'stop' the data sink. +// ----------------------------------------------------------------------------- +// +TInt CDisplaySinkProxy::SinkStopL() + { + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::SinkStopL" ) )); + return iDisplaySink->SinkStopL(); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::SetFormatL +// Set the video frame format. This must be from the list of supported formats. +// ----------------------------------------------------------------------------- +// +void CDisplaySinkProxy::SetFormatL(const TDesC8& aFormat) + { + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::SetFormatL" ) )); + iDisplaySink->SetFormatL(aFormat); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::SetVideoFrameSizeL +// Set the video frame size. +// ----------------------------------------------------------------------------- +// +void CDisplaySinkProxy::SetVideoFrameSizeL(const TSize& aSize) + { + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::SetVideoFrameSizeL" ) )); + iDisplaySink->SetVideoFrameSizeL(aSize); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::GetVideoFrameSizeL +// Get the video frame size. +// ----------------------------------------------------------------------------- +// +void CDisplaySinkProxy::GetVideoFrameSizeL(TSize& aSize) const + { + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::GetVideoFrameSizeL" ) )); + iDisplaySink->GetVideoFrameSizeL(aSize); + } +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocols/src/cdatasourceproxy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocols/src/cdatasourceproxy.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,334 @@ +/* +* Copyright (c) 2004-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: +* +*/ + + +#include +#include "mvtprotocolhandler.h" +#include "cdatasourceproxy.h" + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// ----------------------------------------------------------------------------- +// CPVCameraSourceNodeProxy::CPVCameraSourceNodeProxy +// Constructor. +// ----------------------------------------------------------------------------- +// +CPVCameraSourceNodeProxy::CPVCameraSourceNodeProxy() : MVTVideoSink(KNullUid) + { + } + +// ----------------------------------------------------------------------------- +// CPVCameraSourceNodeProxy::SetConsumer +// Set consumer object. +// ----------------------------------------------------------------------------- +// +void CPVCameraSourceNodeProxy::SetConsumer(MPVDataSinkBase* aConsumer) + { + __IF_DEBUG(Print(_L("VTProto: CPVCameraSourceNodeProxy::SetConsumer<"))); + iConsumer = aConsumer; + __IF_DEBUG(Print(_L("VTProto: CPVCameraSourceNodeProxy::SetConsumer>"))); + } + +// ----------------------------------------------------------------------------- +// CPVCameraSourceNodeProxy::BufferFilledL +// Method called by a data source to pass back an filled buffer to the sink. +// ----------------------------------------------------------------------------- +// +void CPVCameraSourceNodeProxy::BufferFilledL(CMMFBuffer* aBuffer) + { + __IF_DEBUG(Print(_L("VTProto: CPVCameraSourceNodeProxy::BufferFilledL<"))); + iConsumer->BufferFilledL(aBuffer); + __IF_DEBUG(Print(_L("VTProto: CPVCameraSourceNodeProxy::BufferFilledL>"))); + } + +// ----------------------------------------------------------------------------- +// CPVCameraSourceNodeProxy::SendEventToClient +// Send event to client. +// ----------------------------------------------------------------------------- +// +TInt CPVCameraSourceNodeProxy::SendEventToClient(const TMMFEvent &aEvent) + { + __IF_DEBUG(Print(_L("VTProto: CPVCameraSourceNodeProxy::SendEventToClient<"))); + MAsyncEventHandler* eventHandler = dynamic_cast(iConsumer); + TInt result = eventHandler->SendEventToClient(aEvent); + __IF_DEBUG(Print(_L("VTProto: CPVCameraSourceNodeProxy::SendEventToClient>"))); + return result; + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::CVideoSourceProxy +// Constructor. +// ----------------------------------------------------------------------------- +// +CVideoSourceProxy::CVideoSourceProxy(MVTVideoSource* aDataSource) : MPVDataSource(KNullUid), iVideoSource(aDataSource) + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::CVideoSourceProxy<"))); + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::CVideoSourceProxy iVideoSource %d>"), iVideoSource)); + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::ConstructL +// ----------------------------------------------------------------------------- +// +void CVideoSourceProxy::ConstructL() + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::ConstructL<"))); + iCameraSourceNodeProxy = new (ELeave) CPVCameraSourceNodeProxy(); + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::ConstructL>"))); + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::NewL +// ----------------------------------------------------------------------------- +// +CVideoSourceProxy* CVideoSourceProxy::NewL(MVTVideoSource* aDataSource) + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::NewL<"))); + CVideoSourceProxy* self = new (ELeave)CVideoSourceProxy(aDataSource); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::NewL>"))); + return self; + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::QueryInterface +// This API is to allow for extensibility of the plugin interface. +// ----------------------------------------------------------------------------- +// +void CVideoSourceProxy::QueryInterface( const TPVUuid& aUuid, TPVInterfacePtr& aInterfacePtr ) + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::QueryInterface<"))); + if ( aUuid == KPVUidVideoInputInterface ) + { + MPVVideoInput* interfaceP = (MPVVideoInput*) this; + aInterfacePtr = (TPVInterfacePtr) interfaceP; + } + else + { + aInterfacePtr = NULL; + } + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::QueryInterface aInterfacePtr %d<"), aInterfacePtr)); + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::GetMultimediaTypesL +// This API returns multimedias type supported by the data source/sink. +// ----------------------------------------------------------------------------- +// +const RArray& CVideoSourceProxy::GetMultimediaTypesL() const + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::GetMultimediaTypesL iVideoSource %d"), iVideoSource)); + const RArray& multimediaType = iVideoSource->GetMultimediaTypesL(); + return multimediaType; + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::QueryUUID +// This API is to allow for extensibility of the plugin interface. +// ----------------------------------------------------------------------------- +// +void CVideoSourceProxy::QueryUUID( const TPVMIMEType& aMimeType, RArray& aUuids, bool aExactUuidsOnly) + { + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::SetTimebaseL +// This API is used to provide a timebase for plugins that deal with synchronized media data. +// ----------------------------------------------------------------------------- +// +void CVideoSourceProxy::SetTimebaseL(MPVSymbianTimebaseInterface* aTimebase) + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::SetTimebaseL<"))); + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::SetTimebaseL>"))); + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::FillBufferL +// Method called by a MDataSink to request the data source to fill aBuffer with data. +// ----------------------------------------------------------------------------- +// +void CVideoSourceProxy::FillBufferL(CMMFBuffer* aBuffer, MPVDataSinkBase* aConsumer, TMediaId aMediaId ) + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::FillBufferL<"))); + iCameraSourceNodeProxy->SetConsumer(aConsumer); + iVideoSource->FillBufferL(aBuffer, iCameraSourceNodeProxy, aMediaId); + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::FillBufferL>"))); + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::CreateSourceBufferL +// Returns a buffer created by the data source. +// ----------------------------------------------------------------------------- +// +CMMFBuffer* CVideoSourceProxy::CreateSourceBufferL(TMediaId aMediaId, TBool &aReference ) + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::CreateSourceBufferL"))); + return iVideoSource->CreateSourceBufferL(aMediaId, aReference); + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::CreateSourceBufferL +// Returns a buffer created by the data source. +// ----------------------------------------------------------------------------- +// +CMMFBuffer* CVideoSourceProxy::CreateSourceBufferL(TMediaId aMediaId, CMMFBuffer &aSinkBuffer, TBool &aReference) + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::CreateSourceBufferL"))); + return iVideoSource->CreateSourceBufferL(aMediaId, aSinkBuffer, aReference); + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::SourceThreadLogon +// Method to 'logon' the data source to the same thread that source will be supplying data in. +// ----------------------------------------------------------------------------- +// +TInt CVideoSourceProxy::SourceThreadLogon( MAsyncEventHandler& aEventHandler ) + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::SourceThreadLogon"))); + return iVideoSource->SourceThreadLogon(aEventHandler); + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::SourceThreadLogoff +// Method to 'logoff' the data source from the same thread that source supplies data in. +// ----------------------------------------------------------------------------- +// +void CVideoSourceProxy::SourceThreadLogoff() + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::SourceThreadLogoff<"))); + iVideoSource->SourceThreadLogoff(); + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::SourceThreadLogoff>"))); + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::SourcePrimeL +// Method to 'prime' the data source. +// ----------------------------------------------------------------------------- +// +TInt CVideoSourceProxy::SourcePrimeL() + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::SourcePrimeL<"))); + return iVideoSource->SourcePrimeL(); + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::SourcePlayL +// Method to 'play' the data source. +// ----------------------------------------------------------------------------- +// +TInt CVideoSourceProxy::SourcePlayL() + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::SourcePlayL"))); + return iVideoSource->SourcePlayL(); + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::SourcePauseL +// Method to 'pause' the data source. +// ----------------------------------------------------------------------------- +// +TInt CVideoSourceProxy::SourcePauseL() + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::SourcePauseL"))); + return iVideoSource->SourcePauseL(); + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::SourceStopL +// Method to 'stop' the data source. +// ----------------------------------------------------------------------------- +// +TInt CVideoSourceProxy::SourceStopL() + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::SourceStopL"))); + return iVideoSource->SourceStopL(); + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::BufferEmptiedL +// Method called by a data sink to pass back an emptied buffer to the source. +// ----------------------------------------------------------------------------- +// +void CVideoSourceProxy::BufferEmptiedL(CMMFBuffer* aBuffer) + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::BufferEmptiedL"))); + iVideoSource->BufferEmptiedL(aBuffer); + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::CanCreateSourceBuffer +// Method to indicate whether the data source can create a buffer. +// ----------------------------------------------------------------------------- +// +TBool CVideoSourceProxy::CanCreateSourceBuffer() + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::CanCreateSourceBuffer"))); + return iVideoSource->CanCreateSourceBuffer(); + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::SetFormatL +// Set the video frame format. This must be from the list of supported formats. +// ----------------------------------------------------------------------------- +// +void CVideoSourceProxy::SetFormatL(const TDesC8& aFormat) + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::SetFormatL"))); + iVideoSource->SetFormatL(aFormat); + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::SetFrameRateL +// Set the video frame rate. This must be within the range of supported frame rates. +// ----------------------------------------------------------------------------- +// +void CVideoSourceProxy::SetFrameRateL(TReal32 aFrameRate) + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::SetFrameRateL"))); + iVideoSource->SetFrameRateL(aFrameRate); + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::SetVideoFrameSizeL +// Set the video frame size. +// ----------------------------------------------------------------------------- +// +void CVideoSourceProxy::SetVideoFrameSizeL(const TSize& aSize) + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::SetVideoFrameSizeL <"))); + iVideoSource->SetVideoFrameSizeL(aSize); + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::SetVideoFrameSizeL >"))); + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::GetVideoFrameSizeL +// Get the video frame size. +// ----------------------------------------------------------------------------- +// +void CVideoSourceProxy::GetVideoFrameSizeL(TSize& aSize) const + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::GetVideoFrameSizeL<"))); + iVideoSource->GetVideoFrameSizeL(aSize); + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::GetVideoFrameSizeL>"))); + } +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocols/src/ch324confighandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocols/src/ch324confighandler.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,211 @@ +/* +* Copyright (c) 2004-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: +* +*/ + + +#include +#include +#include "mvtprotocolhandler.h" +#include "ch324confighandler.h" +#include "cvtuserinput.h" + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// Define image sizes. +// QCIF. +const TInt KVtProtoResolutionQCIFWidth = 176; +const TInt KVtProtoResolutionQCIFHeight = 144; + +// SQCIF. +const TInt KVtProtoResolutionSQCIFWidth = 128; +const TInt KVtProtoResolutionSQCIFHeight = 96; + +// ----------------------------------------------------------------------------- +// TH324ConfigHandler::TH324ConfigHandler +// Constructor. +// ----------------------------------------------------------------------------- +// +TH324ConfigHandler::TH324ConfigHandler(MVtProtocolHandler* aProtocolHandler) : iProtocolHandler(aProtocolHandler) + { + __IF_DEBUG(Print(_L("VTProto: TH324ConfigHandler::TH324ConfigHandler<"))); + __IF_DEBUG(Print(_L("VTProto: TH324ConfigHandler::TH324ConfigHandler>"))); + } + +// ----------------------------------------------------------------------------- +// TH324ConfigHandler::MPVH324MConfigCommandCompletedL +// Handle an event that has been generated. +// ----------------------------------------------------------------------------- +// +void TH324ConfigHandler::MPVH324MConfigCommandCompletedL(const CPVCmdResponse& aResponse) + { + __IF_DEBUG(Print(_L("VTProto: TH324ConfigHandler::MPVH324MConfigCommandCompletedL<"))); + TVtCommandType cmdType = (TVtCommandType)aResponse.GetCmdType(); + TInt cmdId = aResponse.GetCmdId(); + TInt cmdResponse = aResponse.GetCmdStatus(); + TVtCommandResponse commandRsp(cmdType, cmdId, cmdResponse); + iProtocolHandler->HandleH324MConfigCommandCompletedL(commandRsp); + __IF_DEBUG(Print(_L("VTProto: TH324ConfigHandler::MPVH324MConfigCommandCompletedL>"))); + } + +// ----------------------------------------------------------------------------- +// TH324ConfigHandler::MPVH324MConfigInformationalEventL +// Handle an information event. +// ----------------------------------------------------------------------------- +// +void TH324ConfigHandler::MPVH324MConfigInformationalEventL(const CPVAsyncInformationalEvent& aEvent) + { + __IF_DEBUG(Print(_L("VTProto: TH324ConfigHandler::MPVH324MConfigInformationalEventL<"))); + const TUint8* buffer = aEvent.GetLocalBuffer(); + TInt eventType = aEvent.GetEventType(); + TVtIndicationEvent vtEvent(eventType, buffer); + iProtocolHandler->HandleH324MConfigInformationalEventL(vtEvent); + __IF_DEBUG(Print(_L("VTProto: TH324ConfigHandler::MPVH324MConfigInformationalEventL>"))); + } + +// ----------------------------------------------------------------------------- +// CH324ConfigCommand::SetVendorId +// Sets the vendor identification data. +// ----------------------------------------------------------------------------- +// +TInt CH324ConfigCommand::SetVendorId(TUint8 cc, TUint8 ext, TUint32 mc, const TDesC8* aProduct, const TDesC8* aVersion) + { + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::SetVendorId"))); + return iH324Config->SetVendor(cc, ext, mc, aProduct, aVersion); + } + +// ----------------------------------------------------------------------------- +// CH324ConfigCommand::SendVideoTemporalSpatialTradeoffCommand +// This API allows the user to send a videoTemporalSpatialTradeOff command to the peer. +// ----------------------------------------------------------------------------- +// +TInt CH324ConfigCommand::SendVideoTemporalSpatialTradeoffCommand(TUint aLogicalChannel, TUint8 aTradeoff) + { + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::SendVideoTemporalSpatialTradeoffCommand"))); + return iH324Config->SendVideoTemporalSpatialTradeoffCommand(aLogicalChannel, aTradeoff); + } + +// ----------------------------------------------------------------------------- +// CH324ConfigCommand::SendVideoTemporalSpatialTradeoffIndication +// This API allows the user to send a videoTemporalSpatialTradeOff command to the peer. +// ----------------------------------------------------------------------------- +// +TInt CH324ConfigCommand::SendVideoTemporalSpatialTradeoffIndication(TUint aLogicalChannel, TUint8 aTradeoff) + { + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::SendVideoTemporalSpatialTradeoffIndication"))); + return iH324Config->SendVideoTemporalSpatialTradeoffIndication(aLogicalChannel, aTradeoff); + } + +// ----------------------------------------------------------------------------- +// CH324ConfigCommand::SetVideoResolutions +// This API allows the user to specify the supported resolutions for video for transmit and receive. +// ----------------------------------------------------------------------------- +// +TInt CH324ConfigCommand::SetSupportedResolutions() + { + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::SetSupportedResolutions"))); + RArray resolutions; + TPVVideoResolutionRange qcif; + qcif.first.iWidth = KVtProtoResolutionQCIFWidth; + qcif.first.iHeight = KVtProtoResolutionQCIFHeight; + qcif.last.iWidth = KVtProtoResolutionQCIFWidth; + qcif.last.iHeight = KVtProtoResolutionQCIFHeight; + TInt err( resolutions.Append( qcif ) ); + if ( err == KErrNone ) + { + TPVVideoResolutionRange sqcif; + sqcif.first.iWidth = KVtProtoResolutionSQCIFWidth; + sqcif.first.iHeight = KVtProtoResolutionSQCIFHeight; + sqcif.last.iWidth = KVtProtoResolutionSQCIFWidth; + sqcif.last.iHeight = KVtProtoResolutionSQCIFHeight; + err = resolutions.Append( sqcif ); + if ( err == KErrNone ) + { + err = iH324Config->SetVideoResolutions( INCOMING, resolutions ); + } + } + resolutions.Close(); + + return err; + } + +// ----------------------------------------------------------------------------- +// CH324ConfigCommand::SetFastCsupOptions +// This API allows the user to set options for fast call setup procedures. +// ----------------------------------------------------------------------------- +// +TInt CH324ConfigCommand::SetFastCsupOptions( ) + { + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::SetFastCsupOptions"))); + TPVH324FastCsupOptions fastCsupOptions; + fastCsupOptions.iEnableWnsrp = ETrue; + fastCsupOptions.iEnableMona = EFalse; + return iH324Config->SetFastCsupOptions(fastCsupOptions); + } + +// ----------------------------------------------------------------------------- +// CH324ConfigCommand::SendUserInputMessageL +// Causes the vt2way to send the specified user input to the remote terminal using +// control channel. +// ----------------------------------------------------------------------------- +// +TInt CH324ConfigCommand::SendUserInputMessageL(MVTUserInput& user_input) + { + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::SendUserInputMessageL<"))); + if ( user_input.GetType() == EVtUiiDTMF ) + { + CVTUserInputDtmf* dtmf = static_cast(&user_input); + return iH324Config->SendUserInputL(*dtmf->iUII); + } + else if (user_input.GetType() == EVtUiiAlphaNumeric) + { + CVTUserInputAlphanumeric* alphanumeric = static_cast(&user_input); + return iH324Config->SendUserInputL(*alphanumeric->iUII); + } + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::SendUserInputMessageL>"))); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CH324ConfigCommand::SetObserverL +// This API allows the user to specify observers for the 324m interface. +// ----------------------------------------------------------------------------- +// +void CH324ConfigCommand::SetObserverL(MVtProtocolHandler* aHandler) + { + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::SetObserverL<"))); + iH324ConfigHandler = new (ELeave)TH324ConfigHandler(aHandler); + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::SetObserverL observer %d"), iH324ConfigHandler)); + iH324Config->SetObserver(iH324ConfigHandler); + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::SetObserverL>"))); + } + +// ----------------------------------------------------------------------------- +// CH324ConfigCommand::~CH324ConfigCommand +// Destructor. +// ----------------------------------------------------------------------------- +// +CH324ConfigCommand::~CH324ConfigCommand() + { + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::~CH324ConfigCommand<"))); + delete iH324ConfigHandler; + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::~CH324ConfigCommand>"))); + } + +// end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocols/src/csessionhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocols/src/csessionhandler.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,450 @@ +/* +* Copyright (c) 2004-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: +* +*/ + + +#include +#include +#include +#include +#include +#include +#include "mvtprotocolhandler.h" +#include "cdatasinkproxy.h" +#include "cdatasourceproxy.h" +#include "csessionhandler.h" +#include "ccommserver.h" +#include "ch324confighandler.h" +#include "cvideoconfighandler.h" +#include "caudioconfighandler.h" + +#define DEBUG_CFG_BB_LOOPBACK 0 +#define DEBUG_CFG_PV_LOOPBACK 0 +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +const TInt KVtProtoMultiplexingDelay = 150; +const TInt EVtGet324CtrlInterface = 15; +const TInt EVtGetH263EncInterface = 24; +// ----------------------------------------------------------------------------- +// TSessionHandler::TSessionHandler +// Constructor. +// ----------------------------------------------------------------------------- +// +TSessionHandler::TSessionHandler(MVtProtocolHandler* aProtocolHandler) : iProtocolHandler(aProtocolHandler) + { + __IF_DEBUG(Print(_L("VTProto: TSessionHandler::TSessionHandler<"))); + __IF_DEBUG(Print(_L("VTProto: TSessionHandler::TSessionHandler>"))); + } + +// ----------------------------------------------------------------------------- +// TSessionHandler::CommandCompletedL +// Handle an event that has been generated. +// ----------------------------------------------------------------------------- +// +void TSessionHandler::CommandCompletedL(const CPVCmdResponse& aResponse) + { + __IF_DEBUG(Print(_L("VTProto: TSessionHandler::CommandCompletedL<"))); + TVtCommandType cmdType = (TVtCommandType)aResponse.GetCmdType(); + TInt cmdId = (TInt)aResponse.GetCmdId(); + TInt cmdResponse = aResponse.GetCmdStatus(); + TVtCommandResponse commandRsp(cmdType, cmdId, cmdResponse); + iProtocolHandler->HandleSessionCommandEventL(commandRsp); + __IF_DEBUG(Print(_L("VTProto: TSessionHandler::CommandCompletedL>"))); + } + +// ----------------------------------------------------------------------------- +// TSessionHandler::HandleInformationalEventL +// Handle an informational event that has been generated. +// ----------------------------------------------------------------------------- +// +void TSessionHandler::HandleInformationalEventL(const CPVAsyncInformationalEvent& aEvent) + { + __IF_DEBUG(Print(_L("VTProto: TSessionHandler::HandleInformationalEventL<"))); + const TUint8* buffer = aEvent.GetLocalBuffer(); + TInt eventType = aEvent.GetEventType(); + TVtIndicationEvent vtEvent(eventType, buffer); + iProtocolHandler->HandleSessionInformationalEventL(vtEvent); + __IF_DEBUG(Print(_L("VTProto: TSessionHandler::HandleInformationalEventL>"))); + } + +// ----------------------------------------------------------------------------- +// TSessionHandler::HandleErrorEventL +// Handle an error event that has been generated. +// ----------------------------------------------------------------------------- +// +void TSessionHandler::HandleErrorEventL(const CPVAsyncErrorEvent& aEvent) + { + __IF_DEBUG(Print(_L("VTProto: TSessionHandler::HandleErrorEventL<"))); + TVtErrorEvent event(aEvent.GetEventType()); + iProtocolHandler->HandleSessionErrorEventL(event); + __IF_DEBUG(Print(_L("VTProto: TSessionHandler::HandleErrorEventL>"))); + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::CSessionCommand +// Constructor. +// ----------------------------------------------------------------------------- +// +CSessionCommand::CSessionCommand(TSessionHandler* aSessionHandler, MPV2WaySymbianInterface* aPv2Way) + : iPv2Way(aPv2Way), iSessionHandler(aSessionHandler) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::CSessionCommand<"))); + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::CSessionCommand>"))); + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::~CSessionComman +// Destructor. +// ----------------------------------------------------------------------------- +// +CSessionCommand::~CSessionCommand() + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::~CSessionCommand<"))); + delete iVideoSource; + delete iDisplaySink; + delete iSessionHandler; + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::~CSessionCommand>"))); + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::ConnectToProtocolL +// This function can be invoked only in the ESetup state. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::ConnectToProtocolL(MCommServer* aComm) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::ConnectToProtocolL"))); + TPVConnectOptions connectOptions; + connectOptions.iLoopbackMode = PV_LOOPBACK_NONE; +#ifdef _DEBUG + if ( DEBUG_CFG_BB_LOOPBACK ) + { + connectOptions.iLoopbackMode = PV_LOOPBACK_COMM; + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::ConnectToProtocolL Loopback COMM"))); + } + else if ( DEBUG_CFG_PV_LOOPBACK ) + { + connectOptions.iLoopbackMode = PV_LOOPBACK_MUX; + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::ConnectToProtocolL Loopback MUX"))); + } + else + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::ConnectToProtocolL Loopback NONE"))); + } +#endif + CCommServer* commServer = static_cast(aComm); + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::ConnectToProtocolL commServer %d"), commServer)); + return iPv2Way->ConnectL(connectOptions, commServer->iComm); + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::DisconnectFromProtocolL +// The Disconnect call is valid only when invoked in the EConnecting, and +// EConnected states. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::DisconnectFromProtocolL() + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::DisconnectFromProtocolL"))); + return iPv2Way->DisconnectL(); + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::ResetProtocolL +// This function is valid only in the ESetup and EInitializing state. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::ResetProtocolL() + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::ResetProtocolL"))); + return iPv2Way->ResetL(); + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::InitProtocolL +// This function is valid only in the EIdle state. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::InitProtocolL(TVtInitInfo& aInitInfo) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::InitProtocolL"))); + CPV2WayInitInfo initInfo; + initInfo.iMultiplexingDelayMs = KVtProtoMultiplexingDelay; + + if (aInitInfo.iAMRWBOn) + { + initInfo.iIncomingAudioFormats. + Append((TDesC8 *)&KVtAudioMIMETypeAMRWBIF2); + + initInfo.iOutgoingAudioFormats. + Append((TDesC8 *)&KVtAudioMIMETypeAMRWBIF2); + } + + initInfo.iIncomingAudioFormats. + Append((TDesC8 *)&KVtAudioMIMETypeAMRIF2); + + initInfo.iOutgoingAudioFormats. + Append((TDesC8 *)&KVtAudioMIMETypeAMRIF2); + + initInfo.iIncomingVideoFormats. + Append( (TDesC8 *) &KVtVideoMIMETypeH264 ); + + initInfo.iOutgoingVideoFormats. + Append( (TDesC8 *) &KVtVideoMIMETypeH264 ); + + if (!aInitInfo.iDisableMpeg4) + { + initInfo.iIncomingVideoFormats. + Append((TDesC8 *)&KVtVideoMIMETypeM4V); + + initInfo.iOutgoingVideoFormats. + Append((TDesC8 *)&KVtVideoMIMETypeM4V); + } + + initInfo.iIncomingVideoFormats. + Append((TDesC8 *)&KVtVideoMIMETypeH263); + + initInfo.iOutgoingVideoFormats. + Append((TDesC8 *)&KVtVideoMIMETypeH263); + + return iPv2Way->InitL(initInfo); + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::AddVideoSinkL +// Allows an application to provide a media sink for rendering an incoming media bitstream in a +// logical channel of communication with the peer. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::AddVideoSinkL(const TUint aChannelId, MVTVideoSink& aDataSink) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::AddVideoSinkL"))); + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::AddVideoSinkL aChannelId %d"), aChannelId)); + iDisplaySink =CDisplaySinkProxy::NewL(&aDataSink); + return iPv2Way->AddDataSinkL(aChannelId, *iDisplaySink); + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::AddVideoSourceL +// Allows an application to provide a media source to be associated with a logical channel +// of communication with the peer. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::AddVideoSourceL(const TUint aChannelId, MVTVideoSource& aDataSource) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::AddVideoSourceL"))); + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::AddVideoSourceL aChannelId %d"), aChannelId)); + iVideoSource = CVideoSourceProxy::NewL(&aDataSource); + return iPv2Way->AddDataSourceL(aChannelId, *iVideoSource); + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::AddAudioSourceL +// Allows an application to provide a media source to be associated with a logical channel +// of communication with the peer. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::AddAudioSourceL(const TUint aChannelId, MVTAudioSource &aDataSource) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::AddAudioSourceL"))); + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::AddAudioSourceL aChannelId %d"), aChannelId)); + CAudioSourceProxy* audioSourceProxy = static_cast(&aDataSource); + return iPv2Way->AddDataSourceL(aChannelId, *(audioSourceProxy->iAudioSource)); + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::AddAudioSinkL +// Allows an application to provide a media sink for rendering an incoming media bitstream in a +// logical channel of communication with the peer. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::AddAudioSinkL(const TUint aChannelId, MVTAudioSink &aDataSink) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::AddAudioSinkL"))); + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::AddAudioSinkL aChannelId %d"), aChannelId)); + CAudioSinkProxy* audioSinkProxy = static_cast(&aDataSink); + return iPv2Way->AddDataSinkL(aChannelId, *(audioSinkProxy->iAudioSink)); + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::PauseVideoL +// For an incoming track (MVTVideoSink) this function pauses sending +// media to the sink (output device) and stops the sink. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::PauseVideoL(MVTVideoSource& aTrack) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::PauseVideoL"))); + if (&aTrack == iVideoSource->VideoSource()) + { + return iPv2Way->PauseL(*iVideoSource); + } + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::PauseVideoL +// For an incoming track (MVtVideoSink) this function pauses sending +// media to the sink (output device) and stops the sink. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::PauseVideoL(MVTVideoSink& aTrack) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::PauseVideoL"))); + if (&aTrack == iDisplaySink->DisplaySink()) + { + return iPv2Way->PauseL(*iDisplaySink); + } + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::PauseAudioL +// For an incoming track (MVTAudioSource) this function pauses sending +// media to the sink (output device) and stops the sink. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::PauseAudioL(MVTAudioSource& aTrack) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::PauseAudioL"))); + CAudioSourceProxy* audioSourceProxy = static_cast(&aTrack); + return iPv2Way->PauseL(*(audioSourceProxy->iAudioSource)); + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::ResumeVideoL +// Resume a previously paused incoming or outgoing track. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::ResumeVideoL(MVTVideoSource& aTrack) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::ResumeVideoL"))); + if (&aTrack == iVideoSource->VideoSource()) + { + return iPv2Way->ResumeL(*iVideoSource); + } + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::ResumeVideoL +// Resume a previously paused incoming or outgoing track. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::ResumeVideoL(MVTVideoSink& aTrack) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::ResumeVideoL"))); + if (&aTrack == iDisplaySink->DisplaySink()) + { + return iPv2Way->ResumeL(*iDisplaySink); + } + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::ResumeAudioL +// Resume a previously paused incoming or outgoing track. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::ResumeAudioL(MVTAudioSource& aTrack) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::ResumeAudioL"))); + CAudioSourceProxy* audioSourceProxy = static_cast(&aTrack); + return iPv2Way->ResumeL(*(audioSourceProxy->iAudioSource)); + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::CancelAllCommandsL +// This API is to allow the user to cancel all pending requests. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::CancelAllCommandsL( ) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::CancelAllCommandsL"))); + return iPv2Way->CancelAllCommandsL(); + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::GetProtocolInterfaceL +// This API is to allow for extensibility of the protocol interface. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::GetProtocolInterfaceL(TVtConfigType aType, MVtProtocolCommand*& aProtocolCommand) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::GetProtocolInterfaceL<"))); + TInt commandId = 0; + if (aType == EVtH324Config) + { + CH324ConfigCommand* H324ConfigCommand = new (ELeave)CH324ConfigCommand(); + commandId = iPv2Way->QueryInterfaceL( + KPVUidH324ConfigInterface, + ( MPVInterface*& ) H324ConfigCommand->PVH324ConfigInterface(), + ( void* ) EVtGet324CtrlInterface ); + + aProtocolCommand = H324ConfigCommand; + } + else if (aType == EVtVideoEncoderConfig) + { + CVideoConfigCommand* videoConfigCommand = new (ELeave)CVideoConfigCommand(); + commandId = iPv2Way->QueryInterfaceL( + KPVUidVidEncConfigInterface, + ( MPVInterface*& ) videoConfigCommand->PVVideoEncoderInterface(), + ( void* ) EVtGetH263EncInterface ); + + aProtocolCommand = videoConfigCommand; + } + else + { + ; + } + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::GetProtocolInterfaceL aType %d, aProtocolCommand %d>"), aType, aProtocolCommand)); + return commandId; + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::DeleteProtocolInterfaceL +// This APIis to be used to release an interface that was previously obtained using +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::DeleteProtocolInterfaceL(TVtConfigType aType, MVtProtocolCommand* aProtocolCommand) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::DeleteProtocolInterfaceL<"))); + TInt commandId = 0; + if (aType == EVtH324Config) + { + CH324ConfigCommand* H324ConfigCommand = static_cast(aProtocolCommand); + commandId = iPv2Way->ReleaseInterfaceL(H324ConfigCommand->PVH324ConfigInterface()); + delete H324ConfigCommand; + } + else if (aType == EVtVideoEncoderConfig) + { + CVideoConfigCommand* videoConfigCommand = static_cast(aProtocolCommand); + commandId = iPv2Way->ReleaseInterfaceL(videoConfigCommand->PVVideoEncoderInterface()); + delete videoConfigCommand; + } + else + { + ; + } + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::DeleteProtocolInterfaceL aType, aProtocolCommand %d>"), aType, aProtocolCommand)); + return commandId; + } + +// end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocols/src/cvideoconfighandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocols/src/cvideoconfighandler.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,133 @@ +/* +* Copyright (c) 2004-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: +* +*/ + + +#include +#include +#include "mvtprotocolhandler.h" +#include "cvideoconfighandler.h" + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// ----------------------------------------------------------------------------- +// TVideoConfigHandler::TVideoConfigHandler +// Constructor. +// ----------------------------------------------------------------------------- +// +TVideoConfigHandler::TVideoConfigHandler(MVtProtocolHandler* aProtocolHandler) : iProtocolHandler(aProtocolHandler) + { + __IF_DEBUG(Print(_L("VTProto: TVideoConfigHandler::TVideoConfigHandler<"))); + __IF_DEBUG(Print(_L("VTProto: TVideoConfigHandler::TVideoConfigHandler>"))); + } + +// ----------------------------------------------------------------------------- +// TVideoConfigHandler::MPvMp4H263EncExtensionCommandCompletedL +// Handle an event that has been generated. +// ----------------------------------------------------------------------------- +// +void TVideoConfigHandler::MPvMp4H263EncExtensionCommandCompletedL(const CPVCmdResponse& aResponse) + { + __IF_DEBUG(Print(_L("VTProto: TVideoConfigHandler::MPvMp4H263EncExtensionCommandCompletedL<"))); + TVtCommandType cmdType = (TVtCommandType)aResponse.GetCmdType(); + TInt cmdId = aResponse.GetCmdId(); + TInt cmdResponse = aResponse.GetCmdStatus(); + TVtCommandResponse commandRsp(cmdType, cmdId, cmdResponse); + iProtocolHandler->HandleVideoEncoderCommandCompletedL(commandRsp); + __IF_DEBUG(Print(_L("VTProto: TVideoConfigHandler::MPvMp4H263EncExtensionCommandCompletedL>"))); + } + +// ----------------------------------------------------------------------------- +// TVideoConfigHandler::HandleMPvMp4H263EncExtensionInformationalEventL +// Handle an information event. +// ----------------------------------------------------------------------------- +// +void TVideoConfigHandler::HandleMPvMp4H263EncExtensionInformationalEventL(const CPVAsyncInformationalEvent& aEvent) + { + __IF_DEBUG(Print(_L("VTProto: TVideoConfigHandler::HandleMPvMp4H263EncExtensionInformationalEventL<"))); + const TUint8* buffer = aEvent.GetLocalBuffer(); + TInt eventType = aEvent.GetEventType(); + TVtIndicationEvent vtEvent(eventType, buffer); + iProtocolHandler->HandleVideoEncoderInformationalEventL(vtEvent); + __IF_DEBUG(Print(_L("VTProto: TVideoConfigHandler::HandleMPvMp4H263EncExtensionInformationalEventL>"))); + } + +// ----------------------------------------------------------------------------- +// CVideoConfigCommand::SetObserverL +// This API allows the user to specify separate observers for the extension interface. +// ----------------------------------------------------------------------------- +// +void CVideoConfigCommand::SetObserverL(MVtProtocolHandler* aHandler) + { + __IF_DEBUG(Print(_L("VTProto: CVideoConfigCommand::SetObserverL<"))); + iVideoConfigHandler = new (ELeave)TVideoConfigHandler(aHandler); + iH263Encoder->SetObserver(iVideoConfigHandler); + __IF_DEBUG(Print(_L("VTProto: CVideoConfigCommand::SetObserverL>"))); + } + +// ----------------------------------------------------------------------------- +// CVideoConfigCommand::SetIntraFrameInterval +// Sets the I-Frame refresh rate of the encoded output. +// ----------------------------------------------------------------------------- +// +TInt CVideoConfigCommand::SetIntraFrameInterval(TUint32 aIFrameInterval) + { + __IF_DEBUG(Print(_L("VTProto: CVideoConfigCommand::SetIntraFrameInterval"))); + __IF_DEBUG(Print(_L("VTProto: CVideoConfigCommand::SetIntraFrameInterval aIFrameInterval %d"), aIFrameInterval)); + return iH263Encoder->SetIFrameInterval(aIFrameInterval); + } + +// ----------------------------------------------------------------------------- +// CVideoConfigCommand::RequestNextIntraFrame +// Requests the encoder to encode the next frame as an I-Frame. +// ----------------------------------------------------------------------------- +// +TInt CVideoConfigCommand::RequestNextIntraFrame() + { + __IF_DEBUG(Print(_L("VTProto: CVideoConfigCommand::RequestNextIntraFrame"))); + return iH263Encoder->RequestIFrame(); + } + +// ----------------------------------------------------------------------------- +// CVideoConfigCommand::SetVideoFrameRate +// Sets the frame rate of encoded output for the specified layer. +// ----------------------------------------------------------------------------- +// +TInt CVideoConfigCommand::SetVideoFrameRate(TUint32 aFrameRate) + { + __IF_DEBUG(Print(_L("VTProto: CVideoConfigCommand::SetVideoFrameRate"))); + __IF_DEBUG(Print(_L("VTProto: CVideoConfigCommand::SetVideoFrameRate aFrameRate %d"), aFrameRate)); + return iH263Encoder->SetOutputFrameRate(aFrameRate); + } + + +// ----------------------------------------------------------------------------- +// CVideoConfigCommand::~CVideoConfigCommand +// Destructor. +// ----------------------------------------------------------------------------- +// +CVideoConfigCommand::~CVideoConfigCommand() + { + __IF_DEBUG(Print(_L("VTProto: CVideoConfigCommand::~CVideoConfigCommand"))); + delete iVideoConfigHandler; + __IF_DEBUG(Print(_L("VTProto: CVideoConfigCommand::~CVideoConfigCommand"))); + } + +// end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocols/src/cvtuserinput.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocols/src/cvtuserinput.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,132 @@ +/* +* Copyright (c) 2004-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: +* +*/ + + +#include +#include +#include "mvtprotocolhandler.h" +#include "cvtuserinput.h" + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// ----------------------------------------------------------------------------- +// CVTUserInputDtmf::ConstructL +// Constructor. +// ----------------------------------------------------------------------------- +// +void CVTUserInputDtmf::ConstructL(TUint8 aTone) + { + __IF_DEBUG(Print(_L("VTProto: CVTUserInputDtmf::ConstructL<"))); + iUII = CPVUserInputDtmfSymbian::NewL( aTone, EFalse, 0 ); + __IF_DEBUG(Print(_L("VTProto: CVTUserInputDtmf::ConstructL>"))); + } + +// ----------------------------------------------------------------------------- +// CVTUserInputDtmf::CVTUserInputDtmf +// Constructor. +// ----------------------------------------------------------------------------- +// +CVTUserInputDtmf* CVTUserInputDtmf::NewL(TUint8 aTone) + { + __IF_DEBUG(Print(_L("VTProto: CVTUserInputDtmf::NewL<"))); + CVTUserInputDtmf* self = new (ELeave)CVTUserInputDtmf(); + CleanupStack::PushL(self); + self->ConstructL(aTone); + CleanupStack::Pop(); + __IF_DEBUG(Print(_L("VTProto: CVTUserInputDtmf::NewL>"))); + return self; + } + +// ----------------------------------------------------------------------------- +// CVTUserInputDtmf::~CVTUserInputDtmf +// Destructor. +// ----------------------------------------------------------------------------- +// +CVTUserInputDtmf::~CVTUserInputDtmf() + { + __IF_DEBUG(Print(_L("VTProto: CVTUserInputDtmf::~CVTUserInputDtmf<"))); + delete iUII; + __IF_DEBUG(Print(_L("VTProto: CVTUserInputDtmf::~CVTUserInputDtmf>"))); + } + +// ----------------------------------------------------------------------------- +// CVTUserInputDtmf::GetType +// Virtual function to return the user input type +// ----------------------------------------------------------------------------- +// +TUserInputType CVTUserInputDtmf::GetType() + { + return EVtUiiDTMF; + } + +// ----------------------------------------------------------------------------- +// CVTUserInputDtmf::ConstructL +// Constructor. +// ----------------------------------------------------------------------------- +// +void CVTUserInputAlphanumeric::ConstructL(TUint8 aTone) + { + __IF_DEBUG(Print(_L("VTProto: CVTUserInputAlphanumeric::ConstructL<"))); + TBuf8<1> tone; + tone.Append( aTone ); + iUII = CPVUserInputAlphanumericSymbian::NewL( tone ); + __IF_DEBUG(Print(_L("VTProto: CVTUserInputAlphanumeric::ConstructL>"))); + } + +// ----------------------------------------------------------------------------- +// CVTUserInputAlphanumeric::CVTUserInputAlphanumeric +// Constructor. +// ----------------------------------------------------------------------------- +// +CVTUserInputAlphanumeric* CVTUserInputAlphanumeric::NewL(TUint8 aTone) + { + __IF_DEBUG(Print(_L("VTProto: CVTUserInputAlphanumeric::NewL<"))); + CVTUserInputAlphanumeric* self = new (ELeave)CVTUserInputAlphanumeric(); + CleanupStack::PushL(self); + self->ConstructL(aTone); + CleanupStack::Pop(); + __IF_DEBUG(Print(_L("VTProto: CVTUserInputAlphanumeric::NewL>"))); + return self; + } + +// ----------------------------------------------------------------------------- +// CVTUserInputAlphanumeric::~CVTUserInputAlphanumeric +// Destructor. +// ----------------------------------------------------------------------------- +// +CVTUserInputAlphanumeric::~CVTUserInputAlphanumeric() + { + __IF_DEBUG(Print(_L("VTProto: CVTUserInputAlphanumeric::~CVTUserInputAlphanumeric<"))); + delete iUII; + __IF_DEBUG(Print(_L("VTProto: CVTUserInputAlphanumeric::~CVTUserInputAlphanumeric>"))); + } + +// ----------------------------------------------------------------------------- +// CVTUserInputAlphanumeric::GetType +// Virtual function to return the user input type. +// ----------------------------------------------------------------------------- +// +TUserInputType CVTUserInputAlphanumeric::GetType() + { + return EVtUiiAlphaNumeric; + } + +// end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocols/src/vtprotocolfactory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocols/src/vtprotocolfactory.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,223 @@ +/* +* Copyright (c) 2004-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: +* +*/ + + +#include +#include +#include +#include +#include +#include "mvtprotocolhandler.h" +#include "cdatasourceproxy.h" +#include "cdatasinkproxy.h" +#include "csessionhandler.h" +#include "caudioconfighandler.h" +#include "cvtuserinput.h" +#include "ccommserver.h" + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif +// ----------------------------------------------------------------------------- +// VTProtocolFactory::CreateSessionCommandL +// Create one instance. +// ----------------------------------------------------------------------------- +// +EXPORT_C MVtSessionCommand* VTProtocolFactory::CreateSessionCommandL(MVtProtocolHandler* aProtocolHandler, TBool aEnableProxy, TVt3G324MSupported& a3G324MSupported) + { + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::CreateSessionCommandL<"))); + a3G324MSupported = EVt3G324MSupported; + TSessionHandler * sessionHandler = new (ELeave)TSessionHandler(aProtocolHandler); + CleanupStack::PushL(sessionHandler); + MPV2WaySymbianInterface *pv2Way = CPV2WayFactory::CreateTerminalL(sessionHandler, sessionHandler, sessionHandler, aEnableProxy ); + CSessionCommand* sessionCommand = new (ELeave)CSessionCommand(sessionHandler, pv2Way); + CleanupStack::Pop(); + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::CreateSessionCommandL sessionCommand %d>"), sessionCommand)); + return sessionCommand; + } + +// ----------------------------------------------------------------------------- +// VTProtocolFactory::DeleteSessionCommand +// This function allows the application to delete an instance of a terminal +// and reclaim all allocated resources. +// ----------------------------------------------------------------------------- +// +EXPORT_C void VTProtocolFactory::DeleteSessionCommand( MVtSessionCommand* aSessionCommand ) + { + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::DeleteSessionCommand<"))); + CSessionCommand* sessionCommand = static_cast(aSessionCommand); + CPV2WayFactory::DeleteTerminal( sessionCommand->iPv2Way ); + delete aSessionCommand; + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::DeleteSessionCommand>"))); + } + +// ----------------------------------------------------------------------------- +// VTProtocolFactory::CreateAudioSource +// Creates an instance of a DevSound audio data source. +// ----------------------------------------------------------------------------- +// +EXPORT_C MVTAudioSource* VTProtocolFactory::CreateAudioSource() + { + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::CreateAudioSource<"))); + TInt err( KErrNone ); + CAudioSourceProxy* audioSourceProxy = NULL; + TRAP (err, audioSourceProxy = new (ELeave) CAudioSourceProxy() ); + if (err != KErrNone) + { + return NULL; + } + audioSourceProxy->iAudioSource = CPVDevSoundAudioFactory::CreateDevSoundAudioDataSource(); + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::CreateAudioSource audioSourceProxy %d>"), audioSourceProxy)); + return audioSourceProxy; + } + +// ----------------------------------------------------------------------------- +// VTProtocolFactory::DeletAudioSource +// Deletes an instance of a DevSound audio data source. +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt VTProtocolFactory::DeletAudioSource(MVTAudioSource *aSource) + { + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::DeletAudioSource<"))); + CAudioSourceProxy* audioSourceProxy = static_cast(aSource); + CPVDevSoundAudioFactory::DeleteDevSoundAudioDataSource(audioSourceProxy->iAudioSource); + delete aSource; + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::DeletAudioSource>"))); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// VTProtocolFactory::CreateAudioSink +// Creates an instance of a DevSound audio data sink. +// ----------------------------------------------------------------------------- +// +EXPORT_C MVTAudioSink* VTProtocolFactory::CreateAudioSink() + { + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::CreateAudioSink<"))); + TInt err( KErrNone ); + CAudioSinkProxy* audioSinkProxy = NULL; + TRAP(err, audioSinkProxy = new (ELeave) CAudioSinkProxy() ); + if (err != KErrNone) + { + return NULL; + } + audioSinkProxy->iAudioSink = CPVDevSoundAudioFactory::CreateDevSoundAudioDataSink(); + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::CreateAudioSink audioSinkProxy %d>"), audioSinkProxy)); + return audioSinkProxy; + } + +// ----------------------------------------------------------------------------- +// VTProtocolFactory::DeleteAudioSink +// Deletes an instance of a DevSound audio data sink +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt VTProtocolFactory::DeleteAudioSink(MVTAudioSink *aSink) + { + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::DeleteAudioSink<"))); + CAudioSinkProxy* audioSinkProxy = static_cast(aSink); + CPVDevSoundAudioFactory::DeleteDevSoundAudioDataSink(audioSinkProxy->iAudioSink); + delete aSink; + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::DeleteAudioSink>"))); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// VTProtocolFactory::CreateCommServerL +// Creates an instance of a comm server of a particular name, to be used to +// initialize the terminal. +// ----------------------------------------------------------------------------- +// +EXPORT_C MCommServer* VTProtocolFactory::CreateCommServerL(const TDesC & aName, TBool aEnableBitReversal) + { + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::CreateCommServerL<"))); + CCommServer* commServer = new (ELeave)CCommServer(); + CleanupStack::PushL(commServer); + commServer->iComm = CPVCommFactory::CreateCommServerL(aName, aEnableBitReversal); + CleanupStack::Pop(); + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::CreateCommServerL commServer %d>"), commServer)); + return commServer; + } + +// ----------------------------------------------------------------------------- +// VTProtocolFactory::DeleteCommServerL +// This function allows the application to delete an instance of a comm server +// and reclaim all allocated resources. +// ----------------------------------------------------------------------------- +// +EXPORT_C void VTProtocolFactory::DeleteCommServerL(MCommServer* aCommServer) + { + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::DeleteCommServerL<"))); + CCommServer* commServer = static_cast(aCommServer); + CPVCommFactory::DeleteCommServerL(commServer->iComm); + delete aCommServer; + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::DeleteCommServerL>"))); + } + +// ----------------------------------------------------------------------------- +// VTProtocolFactory::CreateUserInputIndication +// Create instance . +// ----------------------------------------------------------------------------- +// +EXPORT_C MVTUserInput* VTProtocolFactory::CreateUserInputIndication(TUserInputType aUIIType, TUint8 aTone) + { + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::CreateUserInputIndication"))); + if ( aUIIType == EVtUiiDTMF ) + { + CVTUserInputDtmf* uii = CVTUserInputDtmf::NewL(aTone); + return uii; + } + else if (aUIIType == EVtUiiAlphaNumeric) + { + CVTUserInputAlphanumeric* uii = CVTUserInputAlphanumeric::NewL(aTone); + return uii; + } + else + { + return NULL; + } + + } + +// ----------------------------------------------------------------------------- +// VTProtocolFactory::DeleteUserInputIndication +// Delete instance. +// ----------------------------------------------------------------------------- +// +EXPORT_C void VTProtocolFactory::DeleteUserInputIndication(MVTUserInput* aUII) + { + delete aUII; + } + +// ----------------------------------------------------------------------------- +// VTProtocolFactory::GetAudioConfigCommandL +// Get one instance. +// ----------------------------------------------------------------------------- +// +EXPORT_C MVtAudioConfigCommand* VTProtocolFactory::GetAudioConfigCommandL(MVTAudioSink* aAudioSink) + { + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::GetAudioConfigCommandL<"))); + CAudioSinkProxy* audioSinkProxy = static_cast(aAudioSink); + MPVAudioOutputControl* audioCtrl = CPVDevSoundAudioFactory::GetDevSoundAudioOutputControl( + audioSinkProxy->iAudioSink, ETrue ); + CAudioConfigCommand* audioConfigCommand = new (ELeave)CAudioConfigCommand(audioCtrl); + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::GetAudioConfigCommandL audioConfigCommand %d>"), audioConfigCommand)); + return audioConfigCommand; + } + +// end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolsstub/bwins/videotelprotou.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolsstub/bwins/videotelprotou.def Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,13 @@ +EXPORTS + ?DeleteAudioSink@VTProtocolFactory@@SAHPAVMVTAudioSink@@@Z @ 1 NONAME ; int VTProtocolFactory::DeleteAudioSink(class MVTAudioSink *) + ?CreateAudioSink@VTProtocolFactory@@SAPAVMVTAudioSink@@XZ @ 2 NONAME ; class MVTAudioSink * VTProtocolFactory::CreateAudioSink(void) + ?CreateCommServerL@VTProtocolFactory@@SAPAVMCommServer@@ABVTDesC16@@H@Z @ 3 NONAME ; class MCommServer * VTProtocolFactory::CreateCommServerL(class TDesC16 const &, int) + ?CreateUserInputIndication@VTProtocolFactory@@SAPAVMVTUserInput@@W4TUserInputType@@E@Z @ 4 NONAME ; class MVTUserInput * VTProtocolFactory::CreateUserInputIndication(enum TUserInputType, unsigned char) + ?CreateSessionCommandL@VTProtocolFactory@@SAPAVMVtSessionCommand@@PAVMVtProtocolHandler@@HAAW4TVt3G324MSupported@@@Z @ 5 NONAME ; class MVtSessionCommand * VTProtocolFactory::CreateSessionCommandL(class MVtProtocolHandler *, int, enum TVt3G324MSupported &) + ?DeletAudioSource@VTProtocolFactory@@SAHPAVMVTAudioSource@@@Z @ 6 NONAME ; int VTProtocolFactory::DeletAudioSource(class MVTAudioSource *) + ?GetAudioConfigCommandL@VTProtocolFactory@@SAPAVMVtAudioConfigCommand@@PAVMVTAudioSink@@@Z @ 7 NONAME ; class MVtAudioConfigCommand * VTProtocolFactory::GetAudioConfigCommandL(class MVTAudioSink *) + ?CreateAudioSource@VTProtocolFactory@@SAPAVMVTAudioSource@@XZ @ 8 NONAME ; class MVTAudioSource * VTProtocolFactory::CreateAudioSource(void) + ?DeleteCommServerL@VTProtocolFactory@@SAXPAVMCommServer@@@Z @ 9 NONAME ; void VTProtocolFactory::DeleteCommServerL(class MCommServer *) + ?DeleteUserInputIndication@VTProtocolFactory@@SAXPAVMVTUserInput@@@Z @ 10 NONAME ; void VTProtocolFactory::DeleteUserInputIndication(class MVTUserInput *) + ?DeleteSessionCommand@VTProtocolFactory@@SAXPAVMVtSessionCommand@@@Z @ 11 NONAME ; void VTProtocolFactory::DeleteSessionCommand(class MVtSessionCommand *) + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolsstub/eabi/videotelprotou.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolsstub/eabi/videotelprotou.def Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,13 @@ +EXPORTS + _ZN17VTProtocolFactory15CreateAudioSinkEv @ 1 NONAME + _ZN17VTProtocolFactory15DeleteAudioSinkEP12MVTAudioSink @ 2 NONAME + _ZN17VTProtocolFactory16DeletAudioSourceEP14MVTAudioSource @ 3 NONAME + _ZN17VTProtocolFactory17CreateAudioSourceEv @ 4 NONAME + _ZN17VTProtocolFactory17CreateCommServerLERK7TDesC16i @ 5 NONAME + _ZN17VTProtocolFactory17DeleteCommServerLEP11MCommServer @ 6 NONAME + _ZN17VTProtocolFactory20DeleteSessionCommandEP17MVtSessionCommand @ 7 NONAME + _ZN17VTProtocolFactory21CreateSessionCommandLEP18MVtProtocolHandleriR18TVt3G324MSupported @ 8 NONAME + _ZN17VTProtocolFactory22GetAudioConfigCommandLEP12MVTAudioSink @ 9 NONAME + _ZN17VTProtocolFactory25CreateUserInputIndicationE14TUserInputTypeh @ 10 NONAME + _ZN17VTProtocolFactory25DeleteUserInputIndicationEP12MVTUserInput @ 11 NONAME + diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolsstub/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolsstub/group/bld.inf Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,36 @@ +/* +* Copyright (c) 2008 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 Telephony Protocol +* +*/ +#include + +PRJ_PLATFORMS +DEFAULT + +PRJ_TESTEXPORTS + +PRJ_EXPORTS + + +../inc/MVtProtocolHandler.h |../../inc/MVtProtocolHandler.h + + +PRJ_MMPFILES + +../Group/videotelproto.mmp + + + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolsstub/group/videotelproto.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolsstub/group/videotelproto.mmp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,65 @@ +/* +* Copyright (c) 2008 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 telephony protocol +* +*/ + +#include + +// Capability assignment. +CAPABILITY CAP_GENERAL_DLL + +// default vendor id +VENDORID VID_DEFAULT + +TARGET videotelproto.dll +TARGETTYPE dll +UID 0x1000008d 0x20021182 + + +SOURCEPATH ../src + +SOURCE cdatasinkproxy.cpp +SOURCE cdatasourceproxy.cpp +SOURCE caudioconfighandler.cpp +SOURCE ch324confighandler.cpp +SOURCE csessionhandler.cpp +SOURCE cvideoconfighandler.cpp +SOURCE cvtuserinput.cpp +SOURCE vtprotocolfactory.cpp + +DOCUMENT ../../group/bld.inf + +USERINCLUDE ../inc/ + + +APP_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE ../../inc +SYSTEMINCLUDE /epoc32/include/mmf/common +SYSTEMINCLUDE /epoc32/include/mmf/server + +LIBRARY euser.lib +LIBRARY ws32.lib + +LIBRARY commonengine.lib +LIBRARY MediaClientAudio.lib + + + +DEBUGLIBRARY vtlogger.lib + +LIBRARY MMFDevSound.lib + + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolsstub/inc/caudioconfighandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolsstub/inc/caudioconfighandler.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,86 @@ +/* +* Copyright (c) 2008 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: Audio configuration interface +* +*/ + +#ifndef CAUDIOCONFIGHANDLER_H +#define CAUDIOCONFIGHANDLER_H +NONSHARABLE_CLASS( TAudioConfigHandler ) + { + public: + /** + * Constructor. + */ + TAudioConfigHandler( MVtProtocolHandler* aProtocolHandler); + private: + MVtProtocolHandler* iProtocolHandler; + }; + +NONSHARABLE_CLASS( CAudioConfigCommand ) : public CBase, + public MVtAudioConfigCommand + { + public: + + /** + * Constructor. + */ + CAudioConfigCommand(); + + /** + * Destructor. + */ + ~CAudioConfigCommand(); + + /** + * Method to set the playback volume to the specified value. + * + * This is a pure virtual function that each derived class must implement. + * It is also an asynchronous function which will be answered with a callback. + * + * @param aNewVolume + * An input parameter to hold the value for the requested playback volume. + * + * @returns TInt + * Returns a command ID that can be used to identify a command completion result with corresponding request. + */ + virtual TInt SetAudioVolumeL(TInt aVolume); + + /** + * Method to get the maximum valid value for the playback volume. + * + * This is a pure virtual function that each derived class must implement. + * It is also an asynchronous function which will be answered with a callback. + * + * @param aMaxVolume + * An output parameter to hold the value for the maximum valid playback volume. + * Note that the parameter should not be used until the callback indicates that the + * method has completed. + * + * @returns TInt + * Returns a command ID that can be used to identify a command completion result with corresponding request. + */ + virtual TInt GetMaxAudioVolumeL(TInt& aMaxVolume); + + /** + * This API allows the user to specify observers for the 324m interface. + * + * @param aHandler + **/ + virtual void SetObserverL(MVtProtocolHandler* aHandler); + private: + TAudioConfigHandler* iAudioConfigHandler; + }; +#endif +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolsstub/inc/ccommserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolsstub/inc/ccommserver.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,25 @@ +/* +* Copyright (c) 2008 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: Comm server interface +* +*/ + +#ifndef CCOMMSERVER_H +#define CCOMMSERVER_H +NONSHARABLE_CLASS( CCommServer ) : public CBase, + public MCommServer + { + }; +#endif +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolsstub/inc/cdatasinkproxy.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolsstub/inc/cdatasinkproxy.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,53 @@ +/* +* Copyright (c) 2008 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: Data Sink Proxy interface +* +*/ + +#ifndef CDATASINKPROXY_H +#define CDATASINKPROXY_H + +NONSHARABLE_CLASS( CDisplaySinkProxy ) : public CBase + { + public: + /** + * Constructor. + */ + CDisplaySinkProxy(MVTVideoSink* aDisplaySink); + + /** + * ConstructL + */ + void ConstructL(); + + /** + * NewL + */ + static CDisplaySinkProxy* NewL(MVTVideoSink* aDisplaySink); + /** + * Get pointer object of data sink. + * @return member variant:iDisplaySink + */ + MVTVideoSink* DisplaySink() { return iDisplaySink; } + private: + MVTVideoSink* iDisplaySink; + }; + +NONSHARABLE_CLASS( CAudioSinkProxy ) : public CBase, + public MVTAudioSink + { + }; + +#endif +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolsstub/inc/cdatasourceproxy.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolsstub/inc/cdatasourceproxy.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2008 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: Data Source proxy interface +* +*/ + +#ifndef CDATASOURCEPROXY_H +#define CDATASOURCEPROXY_H + +NONSHARABLE_CLASS( CVideoSourceProxy ) : public CBase + { + public: //new + /** + * Constructor. + */ + CVideoSourceProxy(MVTVideoSource* aVideoSource); + /** + * ConstructL. + */ + void ConstructL( ); + + /** + * NewL. + */ + static CVideoSourceProxy* NewL(MVTVideoSource* aVideoSource); + + /** + * Get member variant. + * @return memeber variant:iVideoSource + */ + MVTVideoSource* VideoSource() { return iVideoSource; } + private: + MVTVideoSource* iVideoSource; + }; + +NONSHARABLE_CLASS( CAudioSourceProxy ) : public CBase, + public MVTAudioSource + { + }; +#endif +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolsstub/inc/ch324confighandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolsstub/inc/ch324confighandler.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,110 @@ +/* +* Copyright (c) 2008 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: H324M configuration interface +* +*/ + +#ifndef CH324ConfigHandler_H +#define CH324ConfigHandler_H +NONSHARABLE_CLASS( TH324ConfigHandler ) + { + public: + + /** + * Constructor. + */ + TH324ConfigHandler(MVtProtocolHandler* aProtocolHandler); + + private: + MVtProtocolHandler* iProtocolHandler; + }; + +NONSHARABLE_CLASS( CH324ConfigCommand ): public CBase, + public MVtH324ConfigCommand + { + public: + /** + * Destructor. + */ + ~CH324ConfigCommand(); + + /** + * Sets the vendor identification data. This does not cause the stack to issue a vendor identifiation request. + * Set to NULL to disable sending vendor id. If set to a valid parameter before Connect, it will cause the stack + * to automatically send it along with the TCS message. + * @param cc + * T35 Country code + * @param ext + * T35 Extension + * @param mc + * T35 Manufacturer code + * @param aProduct + * Product number + * @param aVersion + * Version number + **/ + virtual TInt SetVendorId(TUint8 cc, TUint8 ext, TUint32 mc, const TDesC8* aProduct, const TDesC8* aVersion); + + /** + * This API allows the user to send a videoTemporalSpatialTradeOff command to the peer. + * It is a request to the remote encoder to adjust its encoding in accordance with the tradeoff value. + * A value of 0 indicates a high spatial resolution and a value of 31 indicates a high frame rate. + * The values from 0 to 31 indicate monotonically a higher frame rate. Actual values do not correspond + * to precise values of spatial resolution or frame rate. + * + **/ + virtual TInt SendVideoTemporalSpatialTradeoffCommand(TUint aLogicalChannel, TUint8 aTradeoff); + + /** + * This API allows the user to send a videoTemporalSpatialTradeOff command to the peer. + * It is an indication to the remote decoder that the local encoder has adjusted its encoding parameters + * according to the tradeoff value. + * A value of 0 indicates a high spatial resolution and a value of 31 indicates a high frame rate. + * The values from 0 to 31 indicate monotonically a higher frame rate. Actual values do not correspond + * to precise values of spatial resolution or frame rate. + * + **/ + virtual TInt SendVideoTemporalSpatialTradeoffIndication(TUint aLogicalChannel, TUint8 aTradeoff); + + /** + * This API allows the user to specify the supported resolutions for video for transmit and receive. + * + **/ + virtual TInt SetSupportedResolutions( ); + /** + * This API allows the user to set options for fast call setup procedures + **/ + virtual TInt SetFastCsupOptions( ); + + /** + * Causes the protocol to send the specified user input to the remote terminal using + * control channel. The user input can be either DTMF ot Alphanumeric + * @param user_input A pointer to MVTUserInput + * @returns A unique command id for asynchronous completion + **/ + virtual TInt SendUserInputMessageL(MVTUserInput& user_input); + + /** + * This API allows the user to specify observers for the 324m interface. + * + * @param aHandler the observer for command status and unsolicited informational events + **/ + virtual void SetObserverL(MVtProtocolHandler* aHandler); + + private: + TH324ConfigHandler* iH324ConfigHandler; + }; +#endif +// End of File + \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolsstub/inc/csessionhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolsstub/inc/csessionhandler.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,223 @@ +/* +* Copyright (c) 2008 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: Session command interface +* +*/ + +#ifndef CSESSIOHANDLER_H +#define CSESSIOHANDLER_H +NONSHARABLE_CLASS( TSessionHandler ) + { + public: + /** + * Constructor. + */ + TSessionHandler(MVtProtocolHandler* aProtocolHandler); + private: + MVtProtocolHandler* iProtocolHandler; + }; + +NONSHARABLE_CLASS( CSessionCommand ): public CBase, + public MVtSessionCommand + { + public: + /** + * Contructor. + */ + CSessionCommand(TSessionHandler* aSessionHandler); + + /** + * Destructor. + */ + ~CSessionCommand(); + + /** + * This function is valid only in the EIdle state. It is a no-op when + * invoked in any other state. It causes the protocol to transition + * to the ESetup state. The terminal remains in the EInitializing state during + * the transition. + * + * + * @param aInitInfo + * A reference to a TVtInitInfo structure which set Mona on and off + * + * @leave This method can leave with one of the following error codes + * KErrNoMemory if the SDK failed to allocate memory during this operation + * @returns A unique command id for asynchronous completion + **/ + virtual TInt InitProtocolL(TVtInitInfo& aInitInfo); + + /** + * For an incoming track (MVTVideoSink) this function pauses sending + * media to the sink (output device) and stops the sink. It then does the protocol + * negotiations with the remote terminal to pause the logical channel for + * the specified track. + * + * For outgoing, it pauses the sending of media from the source and calls Stop() on the + * source. It also performs any necessary protocol negotiations with the remote terminal. + * EVtCommandPause will be sent to the observer when the processing completes. + * + * @returns A unique command id for asynchronous completion + **/ + virtual TInt PauseVideoL(MVTVideoSource& aDataSource); + virtual TInt PauseVideoL(MVTVideoSink& aDataSink); + virtual TInt PauseAudioL(MVTAudioSource& aAudioSource); + + /** + * Resume a previously paused incoming or outgoing track. For incoming, + * this function starts resumes playing out the media to the appropriate + * sink based on the current settings. For outgoing it resumes encoding + * and sending media from the source. + * + * EVtCommandResume will be invoked will be invoked on the observer when the processing completes. + * + * @returns A unique command id for asynchronous completion + **/ + virtual TInt ResumeVideoL(MVTVideoSource& aDataSource); + virtual TInt ResumeVideoL(MVTVideoSink& aDataSink); + virtual TInt ResumeAudioL(MVTAudioSource& aAudioSource); + + /** + * This function is valid only in the ESetup and EInitializing state. It is a + * no-op when invoked in the EIdle state + * + * It causes the protocol to transition back to the EIdle state. The + * terminal remains in the EResetting state during the transition. + * + * While resetting, the protocol de-allocates all resources resources that + * had been previously allocated. When it completes, ResetComplete is called + * and the protocol reverts to the EIdle state. + * + * @leave This method can leave with one of the following error codes + * KErrNoMemory if the SDK failed to allocate memory during this operation + * @returns A unique command id for asynchronous completion + **/ + virtual TInt ResetProtocolL(); + + /** + * This function can be invoked only in the ESetup state. The terminal starts connecting with the remote + * terminal based on the specified options and capabilities. + * The EVtCommandConnect command completion event will be passed to the observer + * when connect completes. + * Details about the negotiated session may be obtained by calling the GetSessionParamsL API. + * GetSessionParamsL may be called after call setup is started to get the list of available channels + * and their capabilities. + * Incoming tracks may be opened before ConnectL completes and will be indicated via the + * EVtIndicationIncommingTrack event. + * + * @param aComm + * An optional pointer to a comm server to provide comm source and sink end-points. + * @returns A unique command id for asynchronous completion + **/ + virtual TInt ConnectToProtocolL(MCommServer* aComm); + + /** + * Allows an application to provide a media source to be associated with a logical channel + * of communication with the peer. Sources should be added after the EVtIndicationOutgoingTrack + * indication is received for a newly established logical channel. The media type and + * channel id associated with the logical channel are specified as part of the indication. + * This function accepts a MVtVideoSource which provides additional functionality + * for advertizing capability and exposing configuration APIs. + * Data sources could be of the following types: + * a)raw media sources like camera, microphone etc. + * b)sources of compressed data like file, gateway component etc. + * + * @param aChannelId + * Indicates the channel id to be associated with this source. + * @param aDataSource + * reference to the data source + * @leave This method can leave with one of the following error codes + * KErrNotSupported if the format of the sources/sinks is incomtible with what the SDK can handle + * KPVErrInvalidState if invoked in the incorrect state + * KErrNoMemory if the SDK failed to allocate memory during this operation + * @return A unique command id for asynchronous completion + */ + virtual TInt AddVideoSourceL(const TUint aChannelId, MVTVideoSource &aDataSource); + virtual TInt AddAudioSourceL(const TUint aChannelId, MVTAudioSource &aDataSource); + + /** + * Allows an application to provide a media sink for rendering an incoming media bitstream in a + * logical channel of communication with the peer. + * AddDataSinkL can be called only for established incoming logical channels identified by a unique + * channel id. + * Regular incoming channels are established by the peer and are + * indicated using the EVtIndicationIncomingTrack indication. + * This function takes in PV extension to MVtVideoSink or MVtAudioSink which provides additional functionality + * for advertizing capability and exposing configuration APIs. + * EVtCommandAddDataSink event is sent to the observer on completion of this call. + * + * @param aChannelId + * Indicates the channel id to be associated with this sink. + * @param aDataSink The data sink to be added + * + * @return A unique command id for asynchronous completion + **/ + virtual TInt AddVideoSinkL(const TUint aChannelId, MVTVideoSink &aDataSink); + virtual TInt AddAudioSinkL(const TUint aChannelId, MVTAudioSink &aDataSink); + + /** + * This API is to allow the user to cancel all pending requests. The current request being + * processed, if any, will also be aborted. + * EVtCommandCancelAllCommands will be passed to the command observer on completion. + * @returns A unique command id for asynchronous completion + **/ + virtual TInt CancelAllCommandsL( ); + + /** + * The Disconnect call is valid only when invoked in the EConnecting, and + * EConnected states. It causes the terminal to transition to the + * EDisconnecting state. All the media tracks both incoming and outgoing + * will be closed on invoking Disconnect. On completion, the terminal + * goes to the ESetup state. + * + * It is a no-op when called in any other state. + * + * This is an asynchronous request. The EvtCommandDisconnect event will be + * sent to the observer when the request processing is complete. This + * is the only event the Phone application should expect after calling + * Disconnect. + * + * @returns A unique command id for asynchronous completion + **/ + virtual TInt DisconnectFromProtocolL(); + + /** + * This API is to allow for extensibility of the protocol interface. + * It allows a caller to ask for an instance of a particular interface object to be returned. + * The mechanism is analogous to the COM IUnknown method. The interfaces are identified with + * an interface ID that is a UUID as in DCE and a pointer to the interface object is + * returned if it is supported. Otherwise the returned pointer is NULL. + * @param aType + * @param aProtocolCommand + * @exception not_supported + * leaves if the specified interface id is not supported. + **/ + virtual TInt GetProtocolInterfaceL(TVtConfigType aType, MVtProtocolCommand*& aProtocolCommand); + + /** + * This APIis to be used to release an interface that was previously obtained using + * QueryInterfaceL. + * @param aType + * @param + * @exception not_supported + * leaves if the specified interface id is not supported. + **/ + virtual TInt DeleteProtocolInterfaceL(TVtConfigType aType, MVtProtocolCommand* aProtocolCommand); + private: + CVideoSourceProxy* iVideoSource; + CDisplaySinkProxy* iDisplaySink; + TSessionHandler* iSessionHandler; + }; +#endif +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolsstub/inc/cvideoconfighandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolsstub/inc/cvideoconfighandler.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,77 @@ +/* +* Copyright (c) 2008 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 configuration interface +* +*/ + +#ifndef CVideoConfigHandler_H +#define CVideoConfigHandler_H +NONSHARABLE_CLASS( TVideoConfigHandler ) + { + public: + + /** + * Constructor. + */ + TVideoConfigHandler(MVtProtocolHandler* aProtocolHandler); + + private: + MVtProtocolHandler* iProtocolHandler; + }; + +NONSHARABLE_CLASS( CVideoConfigCommand ) : public CBase, + public MVtVideoConfigCommand + { + public: + /** + * Destructor. + */ + ~CVideoConfigCommand(); + + /** + * Sets the I-Frame refresh rate of the encoded output. + * + * @param aIFrameInterval I-Frame rate in seconds per I-Frame + * @return True if successful, else false + */ + virtual TInt SetIntraFrameInterval(TUint32 aIFrameInterval); + + /** + * Requests the encoder to encode the next frame as an I-Frame. This menthod is valid + * only when the node is in EPVMFNodeStarted state. If successful, the next encoded + * frame will be an I-Frame. + * + * @return True for success, else false + */ + virtual TInt RequestNextIntraFrame(); + + /** + * Sets the frame rate of encoded output for the specified layer. + * @param aFrameRate Frame rate for the specified layer in frames per second. + * @return True if successful, else false. + */ + virtual TInt SetVideoFrameRate(TUint32 aFrameRate); + + /** + * This API allows the user to specify separate observers for the extension interface. + * + * @param aHandler the observer for unsolicited informational events + **/ + virtual void SetObserverL(MVtProtocolHandler* aHandler); + + private: + TVideoConfigHandler* iVideoConfigHandler; + }; +#endif +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolsstub/inc/cvtuserinput.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolsstub/inc/cvtuserinput.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,68 @@ +/* +* Copyright (c) 2008 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: User input interface +* +*/ + +#ifndef CVTUSERINPUT_H +#define CVTUSERINPUT_H +NONSHARABLE_CLASS( CVTUserInputDtmf ) : public CBase, + public MVTUserInput + { + public: + /** + * ConstructL. + */ + void ConstructL(TUint8 aTone); + /** + * NewL. + */ + static CVTUserInputDtmf* NewL(TUint8 aTone); + + /** + * Destructor. + */ + ~CVTUserInputDtmf(); + + /** + * Virtual function to return the user input type + **/ + virtual TUserInputType GetType(); + }; + +NONSHARABLE_CLASS( CVTUserInputAlphanumeric ) : public CBase, + public MVTUserInput + { + public: + /** + * ConstructL. + */ + void ConstructL(TUint8 aTone); + /** + * NewL. + */ + static CVTUserInputAlphanumeric* NewL(TUint8 aTone); + + /** + * Destructor. + */ + ~CVTUserInputAlphanumeric(); + + /** + * Virtual function to return the user input type + **/ + virtual TUserInputType GetType(); + }; +#endif +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolsstub/inc/mvtprotocolhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolsstub/inc/mvtprotocolhandler.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,1124 @@ +/* +* Copyright (c) 2008 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 Telephony Protocol interface +* +*/ + +#ifndef MVTENGMEDIAHANDLER_H +#define MVTENGMEDIAHANDLER_H + +// INCLUDES +#include +#include +#include +#include + +typedef TInt TVtCommandId; +typedef TInt TVtCommandStatus; +typedef TDesC8 TVtMIMEType; + +const TUid KVTUidYUVFrameBuffer = {0xFFFFFF0d}; +const TInt KVtUidDataSrcPrime = 0xFFFFFF08; +const TInt KVtUidDataSrcPlay = 0xFFFFFF09; +const TInt KVtUidDataSrcPause = 0xFFFFFF0A; +const TInt KVtUidDataSrcStop = 0xFFFFFF0B; + +_LIT8(KVtVideoMIMETypeYUV420, "/video/x-pv/raw/yuv420"); + +enum TVt3G324MSupported + { + EVt3G324MMissing, + EVt3G324MSupported + }; + +enum TVtConfigType + { + EVtH324Config, + EVtVideoEncoderConfig + }; + +enum TVtCommandType { + EVtCommandInit, + EVtCommandGetSDKInfo, + EVtCommandGetProtocolState = 3, + EVtCommandReset, + EVtCommandAddDataSource = 6, + EVtCommandRemoveDataSource, + EVtCommandAddDataSink, + EVtCommandRemoveDataSink, + EVtCommandConnect, + EVtCommandDisconnect, + EVtCommandPause, + EVtCommandResume, + EVtCommandGetProtocolInterface =20, + EVtCommandDeleteProtocolInterface, + EVtCommandCancelAllCommands + }; + +enum TVtIndicationType + { + EVtIndicationVideoSpatialTamporalTradeOffCommand, + EVtIndicationVideoSpatialTamporalTradeOffIndication, + EVtIndicationUserInputCapability = 6, + EVtIndicationIncomingTrack = 41, + EVtIndicationOutgoingTrack, + EVtIndicationDisconnect, + EVtIndicationClosingTrack, + EVtIndicationCloseTrack, + EVtIndicationPauseTrack, + EVtIndicationResumeTrack + }; + +enum TVtMediaType + { + EVtAudio = 1, + EVtVideo, + EVtControl, + EVtData, + EVtUserInput, + EVtMediaNone + }; + +enum TVtAudioOutputControlCommand + { + EVtAudioOutputControlGetMaxVolume, + EVtAudioOutputControlGetVolume, + EVtAudioOutputControlSetVolume, + EVtAudioOutputControlGetBalance, + EVtAudioOutputControlSetBalance + }; + +const TUint8 EVtIncoming = 1; + +enum TUserInputType + { + EVtUiiDTMF, + EVtUiiAlphaNumeric + }; + +struct TVtInitInfo + { + TBool iAMRWBOn; + TBool iDisableMpeg4; + }; + +struct TVtIndicationEvent + { + public: + /** + * Constructor. + */ + TVtIndicationEvent(TInt aEventType, const TUint8 *aLocalBuffer) : iEventType(aEventType), iLocalBuffer(aLocalBuffer) + {} + public: + TInt iEventType; + const TUint8 *iLocalBuffer; + }; + +struct TVtCommandResponse + { + public: + /** + * Constructor. + */ + TVtCommandResponse(TVtCommandType aCmdType, TInt aCmdId, TInt iCmdStatus) : iCmdType(aCmdType), iCmdId(aCmdId), iCmdStatus(iCmdStatus) + {} + public: + TVtCommandType iCmdType; + TInt iCmdId; + TInt iCmdStatus; + }; + +struct TVtErrorEvent + { + public: + /** + * Constructor. + */ + TVtErrorEvent(TInt aEventType) : iEventType(aEventType) {} + public: + TInt iEventType; + }; + +struct TVtMMFDataBuffer + { + public: + /** + * Constructor. + */ + TVtMMFDataBuffer(CMMFBuffer* aMmfBuffer,TSize aFrameSize, TPtr8& aPtr) : iMmfBuffer(aMmfBuffer), iFrameSize(aFrameSize), iPtr(aPtr) {} + + /** + * Get the YUV frame size. + * @return The frame size, in pixels + */ + TSize GetFrameSize() {return iFrameSize;} + + /** + * Get MMF buffer. + * @return the MMF buffer + */ + CMMFBuffer* GetMMFBuffer() {return iMmfBuffer;} + + /** + * Get MMF buffer. + * @return the MMF buffer + */ + const CMMFBuffer* GetMMFBuffer() const {return iMmfBuffer;} + + /** + * @return Returns a reference to the data buffer + **/ + TPtr8& Data() {return iPtr;} + + /** + * @return Returns the frame size of the contained buffer. + **/ + const TSize GetFrameSize() const {return iFrameSize;} + + /** + * @return Returns a reference to the data buffer + **/ + const TPtr8& Data() const {return iPtr;} + private: + CMMFBuffer* iMmfBuffer; + TSize iFrameSize; + TPtr8& iPtr; + }; + +class MVTVideoInput + { + public: + + /** + * Set the video frame format. This must be from the list of supported formats. + * @param "aFormat" The mime string describing the video frame format. + * @exception Can leave with one of the system wide error codes + */ + virtual void SetFormatL(const TDesC8& aFormat) {} + + /** + * Set the video frame rate. This must be within the range of supported frame rates + * for the current frame size. + * @param "aFrameRate" The video frame rate to set. + * @exception Can leave with one of the system wide error codes + */ + virtual void SetFrameRateL(TReal32 aFrameRate) {} + + /** + * Set the video frame size + * @param "aSize" The video frame size, in pixels + * @exception Can leave with one of the system wide error codes + */ + virtual void SetVideoFrameSizeL(const TSize& aSize) {} + + /** + * Get the video frame size + * @param "aSize" The video frame size, in pixels + * @exception Can leave with one of the system wide error codes + */ + virtual void GetVideoFrameSizeL(TSize& aSize) const {} + + /** + * This API returns multimedias type supported by the data source/sink - + * Audio, Video, Data etc. Each supported type is indicated by a MIME type structure. + * @return + **/ + virtual const RArray& GetMultimediaTypesL() const {} + }; + +class MVTVideoOutput + { + public: + + /** + * Sets the data format using MIME string. + * @param aFormat The format as a MIME string. + **/ + virtual void SetFormatL(const TDesC8& aFormat) {} + + /** + * Set the video frame size + * @param "aSize" The video frame size, in pixels + * @exception Can leave with one of the system wide error codes + **/ + virtual void SetVideoFrameSizeL(const TSize& aSize) {} + + /** + * Get the video frame size + * @param "aSize" The video frame size, in pixels + * @exception Can leave with one of the system wide error codes + **/ + virtual void GetVideoFrameSizeL(TSize& aSize) const {} + + /** + * This API returns multimedias type supported by the data source/sink - + * Audio, Video, Data etc. Each supported type is indicated by a MIME type structure. + * @return + **/ + virtual const RArray& GetMultimediaTypesL() const {} + }; + +//This class is empty +class MVTAudioSource + { + }; + +//This class is empty +class MVTAudioSink + { + }; + +class MVTVideoSource; +class MVTVideoSink : public MVTVideoOutput + { + public: + /** + * Constructor. + */ + MVTVideoSink(TUid aType): iDataSinkType(aType) {} + + /** + * Method called by a data source to request the data sink to empty aBuffer of data. + * + * This is a pure virtual function that each derived class must implement. + * This method is used when a data sink is passively waiting for requests from a supplier ie a data source + * to empty a buffer. The data sink must call the BufferEmptiedL member on aSupplier when it has emptied + * the buffer of it's data - the data sink can either make this callback synchronously or asynchronously. + * + * @param "aBuffer" + * The full buffer that needs emptying of it's data + * + * @param "aSupplier" + * The data source that supplied the data. The data sink needs this to make the BufferEmptiedL + * callback on aSupplier to indicate to the data source that the data sink has finished with the buffer. + * + * @param "aMediaId" + * This identifies the type of media eg audio or video and the stream id. + * This parameter is required in cases where the source can supply data + * of more than one media type and/or multiple strams of data + */ + virtual void EmptyBufferL( + TVtMMFDataBuffer aDataBuffer, + MVTVideoSource* aSupplier, + TMediaId aMediaId ) {} + + /** + * Method called by a data source to pass back an filled buffer to the sink + * + * This is a pure virtual function that each derived class must implement. + * This method is used as the callback when the data sink actively requests a supplier ie a data source + * to fill a buffer by calling the data sources FillBufferL. + * When the data sink gets this callback it knows that the buffer has been filled and is ready to be emptied + * + * @param "aBuffer" + * The buffer that has been filled by a data source and is now available for processing + */ + virtual void BufferFilledL( CMMFBuffer* aBuffer ) = 0; + + /** + * Method to indicate whether the data sink can create a buffer. + * + * This is a pure virtual function that each derived class must implement. + * + * @return ETrue if the data sink can create a buffer else EFalse + */ + virtual TBool CanCreateSinkBuffer() {return EFalse;} + + /** + * Returns a buffer created by the data sink + * + * This is a pure virtual function that each derived class must implement. + * + * @param "aMediaId" + * This identifies the type of media eg audio or video and the stream id. + * This parameter is required in cases where the source can supply data + * of more than one media type and/or multiple strams of data. + * + * @param "aReference" + * This must be written to by the method to indicate whether the created buffer is + * a 'reference' buffer. A 'reference' buffer is a buffer that is owned by the sink + * and should be used in preference to the source buffer provided the source buffer + * is also not a reference buffer. + * . + * @return The created buffer + */ + virtual CMMFBuffer* CreateSinkBufferL( + TMediaId aMediaId, + TBool &aReference ) {return NULL;} + + /** + * Method to 'logon' the data sink to the same thread that sink will be consuming data in. + * + * This method may be required as the thread that the data sink was created in is not always + * the same thread that the data transfer will take place in. Therefore any thread specific + * initialisation needs to be performed in the SinkThreadLogon rather than in the creation + * of the data sink. + * + * This is a virtual function that a derrived data sink can implement if any thread specific + * initialisation is required and/or the data sink can create any asynchronous events. + * + * + * @param "aEventHandler" + * This is an MAsyncEventHandler to handle asynchronous events that occur during the + * transfer of multimedia data. The event handler must be in the same thread as the data transfer + * thread - hence the reason it is passed in the SinkThreadLogon as opposed to say the constructor. + * + * + * @return KErrNone if successful, otherwise a system wide error code. + */ + virtual TInt SinkThreadLogon( MAsyncEventHandler& aEventHandler ) {return KErrNone;} + + /** + * Method to 'logoff' the data sink from the same thread that sink consumes data in. + * + * This method may be required as the thread that the data sink is deleted in may not be + * the same thread that the data transfer took place in. Therefore any thread specific + * releasing of resources needs to be performed in the SinkThreadLogoff rather than in the destructor + * + * This is a virtual function that a derrived data sink can implement if any thread specific + * releasing of resources is required. + */ + virtual void SinkThreadLogoff() {} + + /** + * Method to 'prime' the data sink + * + * This is a virtual function that a derrived data sink can implement if + * any data sink specific 'priming' is required + */ + virtual TInt SinkPrimeL() {return 0;} + + /** + * Method to 'play' the data sink + * + * This is a virtual function that a derrived data sink can implement if + * any data sink specific action is required prior to 'playing'ie the start of data transfer + */ + virtual TInt SinkPlayL() {return 0;} + + /** + * Method to 'pause' the data sink + * + * This is a virtual function that a derrived data sink can implement if + * any data sink specific action is required to 'pause' + */ + virtual TInt SinkPauseL() {return 0;} + + /** + * Method to 'stop' the data sink + * + * This is a virtual function that a derrived data sink can implement if + * any data sink specific action is required to 'stop' + */ + virtual TInt SinkStopL() {return 0;} + private: + TUid iDataSinkType; + }; + +class MVTVideoSource : public MVTVideoInput + { + public: + + /** + * Constructor. + */ + MVTVideoSource(TUid aType): iDataSourceType(aType) {} + + /** + * Method called by a data sink to request the data source to fill aBuffer with data. + * + * This is a pure virtual function that each derived class must implement. + * This method is used when a data source is passively waiting for requests from a consumer ie a data sink + * to fill a buffer. The data source must call the BufferFilledL member on aConsumer when it has filled + * the buffer with data - the data source can either make this callback synchronously or asynchronously. + * + * @param "aBuffer" + * The buffer that needs filling with data + * + * @param "aConsumer" + * The data sink that consumes the data. The data source needs this to make the BufferFilledL + * callback on aConsumer when the data source has completed filling the aBuffer. + * + * @param "aMediaId" + * This identifies the type of media eg audio or video and the stream id. + * This parameter is required in cases where the source can supply data + * of more than one media type and/or multiple strams of data eg a multimedia file + */ + virtual void FillBufferL( + CMMFBuffer* aBuffer, + MVTVideoSink* aConsumer, + TMediaId aMediaId ) {} + + /** + * Method called by a data sink to pass back an emptied buffer to the source + * + * This is a pure virtual function that each derived class must implement. + * This method is used as the callback when the data source actively requests a consumer ie a data sink + * to empty a buffer by calling the data sinks EmptyBufferL. + * When the data source gets this callback it knows that the buffer has been emptied and can be reused + * + * @param "aBuffer" + * The buffer that has been emptied by a data sink and is now available for reuse + */ + virtual void BufferEmptiedL( CMMFBuffer* aBuffer ) = 0; + + /** + * Method to indicate whether the data source can create a buffer. + * + * This is a pure virtual function that each derived class must implement. + * + * @return ETrue if the data source can create a buffer else EFalse + */ + virtual TBool CanCreateSourceBuffer() {return EFalse;} + + /** + * Returns a buffer created by the data source + * + * This is a pure virtual function that each derived class must implement. + * + * @param "aMediaId" + * This identifies the type of media eg audio or video and the stream id. + * This parameter is required in cases where the source can supply data + * of more than one media type and/or multiple strams of data eg a multimedia file + * + * @param "aReference" + * This must be written to by the method to indicate whether the created buffer is + * a 'reference' buffer. A 'reference' buffer is a buffer that is owned by the source + * and should be used in preference to the sink buffer provided the sink buffer + * is also not a reference buffer + * . + * @return The created buffer + */ + virtual CMMFBuffer* CreateSourceBufferL( + TMediaId aMediaId, + TBool &aReference ) {return NULL;} + + /** + * Returns a buffer created by the data source + * + * This is a virtual function that a derived class can implement. + * This can be used in preference to the above CreateSourceBufferL method in cases where + * the source buffer creation has a dependancy on the sink buffer + * + * @param "aMediaId" + * This identifies the type of media eg audio or video and the stream id. + * This parameter is required in cases where the source can supply data + * of more than one media type and/or multiple strams of data eg a multimedia file + * + * @param "aSinkBuffer" + * The sink buffer the nature of which may influence the creation of the source buffer + * + * @param "aReference" + * This must be written to by the method to indicate whether the created buffer is + * a 'reference' buffer. A 'reference' buffer is a buffer that is owned by the source + * and should be used in preference to the sink buffer provided the sink buffer is not a reference buffer + * . + * @return The created buffer + */ + virtual CMMFBuffer* CreateSourceBufferL( + TMediaId aMediaId, + CMMFBuffer& aSinkBuffer, + TBool &aReference ) {return NULL;} + + /** + * Method to 'logon' the data source to the same thread that source will be supplying data in. + * + * This method may be required as the thread that the data source was created in is not always + * the same thread that the data transfer will take place in. Therefore any thread specific + * initialisation needs to be performed in the SourceThreadLogon rather than in the creation + * of the data source. + * + * This is a virtual function that a derrived data source can implement if any thread specific + * initialisation is required and/or the data source can create any asynchronous events. + * + * + * @param "aEventHandler" + * This is an MAsyncEventHandler to handle asynchronous events that occur during the + * transfer of multimedia data. The event handler must be in the same thread as the data transfer + * thread - hence the reason it is passed in the SourceThreadLogon as opposed to say the constructor. + * + * + * @return KErrNone if successful, otherwise a system wide error code. + */ + virtual TInt SourceThreadLogon( MAsyncEventHandler& aEventHandler ) {return KErrNone;} + + /** + * Method to 'logoff' the data source from the same thread that source supplies data in. + * + * This method may be required as the thread that the data source is deleted in may not be + * the same thread that the data transfer took place in. Therefore any thread specific + * releasing of resources needs to be performed in the SourceThreadLogoff rather than in the destructor + * + * This is a virtual function that a derrived data source can implement if any thread specific + * releasing of resources is required. + */ + virtual void SourceThreadLogoff() {} + + /** + * Method to 'prime' the data source + * + * This is a virtual function that a derrived data source can implement if + * any data source specific 'priming' is required + */ + virtual TInt SourcePrimeL() {return 0;} + + /** + * Method to 'play' the data source + * + * This is a virtual function that a derrived data source can implement if + * any data source specific action is required prior to 'playing'ie the start of data transfer + */ + virtual TInt SourcePlayL() {return 0;} + + /** + * Method to 'pause' the data source + * + * This is a virtual function that a derrived data source can implement if + * any data source specific action is required to 'pause' + */ + virtual TInt SourcePauseL() {return 0;} + + /** + * Method to 'stop' the data source + * + * This is a virtual function that a derrived data source can implement if + * any data source specific action is required to 'stop' + */ + virtual TInt SourceStopL() {return 0;} + private: + TUid iDataSourceType; + }; + +class MCommServer + { + }; + +class MVtProtocolCommand + { + public: + enum TVtProtocolState + { + EIdle, + EInitializing, + ESetup, + EConnecting, + EConnected, + EDisconnecting, + EResetting + }; + }; + +class MVtProtocolHandler + { + public: + + /** + * Handle an event that has been generated. + * + * @param "aResponse" "The response to a previously issued command." + */ + virtual void HandleSessionCommandEventL(const TVtCommandResponse& aResponse) = 0; + + /** + * Handle an informational event that has been generated. + * + * @param "aEvent" "The event to be handled." + */ + virtual void HandleSessionInformationalEventL(const TVtIndicationEvent& aEvent) = 0; + + /** + * Handle an error event that has been generated. + * + * @param "aEvent" "The event to be handled." + */ + virtual void HandleSessionErrorEventL(const TVtErrorEvent& aEvent) = 0; + + /** + * Signals completion of the audio output control command. + * @param aId The command id of the completed command. + * @param aCmd The command type. + * @param aContextData The context data passed in with the command. + * @param aStatus The command completion status. + **/ + virtual void HandleAudioOutputControlCommandComplete(TInt aId, TVtAudioOutputControlCommand aCmd, TAny *aContextData ,TInt aStatus) = 0; + /** + * Handle an event that has been generated. + * + * @param "aResponse" "The response to a previously issued command." + */ + virtual void HandleVideoEncoderCommandCompletedL(const TVtCommandResponse& aResponse) = 0; + + /** + * Handle an event that has been generated. + * + * @param "aEvent" "The event to be handled." + */ + virtual void HandleVideoEncoderInformationalEventL(const TVtIndicationEvent& aEvent) = 0; + + /** + * Handle an event that has been generated. + * + * @param "aResponse" "The response to a previously issued command." + */ + virtual void HandleH324MConfigCommandCompletedL(const TVtCommandResponse& aResponse) = 0; + + /** + * Handle an event that has been generated. + * + * @param "aEvent" "The event to be handled." + */ + virtual void HandleH324MConfigInformationalEventL(const TVtIndicationEvent& aEvent) = 0; + virtual ~MVtProtocolHandler() {} + }; + + +class MVtSessionCommand : public MVtProtocolCommand + { + public: + /** + * This function is valid only in the EIdle state. It is a no-op when + * invoked in any other state. It causes the protocol to transition + * to the ESetup state. The terminal remains in the EInitializing state during + * the transition. + * + * + * @param aInitInfo + * A reference to a TVtInitInfo structure which set Mona on and off + * + * @leave This method can leave with one of the following error codes + * KErrNoMemory if the SDK failed to allocate memory during this operation + * @returns A unique command id for asynchronous completion + **/ + virtual TInt InitProtocolL(TVtInitInfo& aInitInfo) = 0; + + /** + * For an incoming track (MVTVideoSink) this function pauses sending + * media to the sink (output device) and stops the sink. It then does the protocol + * negotiations with the remote terminal to pause the logical channel for + * the specified track. + * + * For outgoing, it pauses the sending of media from the source and calls Stop() on the + * source. It also performs any necessary protocol negotiations with the remote terminal. + * EVtCommandPause will be sent to the observer when the processing completes. + * + * @returns A unique command id for asynchronous completion + **/ + virtual TInt PauseVideoL(MVTVideoSource& aDataSource) = 0; + virtual TInt PauseVideoL(MVTVideoSink& aDataSink) = 0; + virtual TInt PauseAudioL(MVTAudioSource& aAudioSource) = 0; + + /** + * Resume a previously paused incoming or outgoing track. For incoming, + * this function starts resumes playing out the media to the appropriate + * sink based on the current settings. For outgoing it resumes encoding + * and sending media from the source. + * EVtCommandResume will be invoked will be invoked on the observer when the processing completes. + * + * @returns A unique command id for asynchronous completion + **/ + virtual TInt ResumeVideoL(MVTVideoSource& aDataSource) = 0; + virtual TInt ResumeVideoL(MVTVideoSink& aDataSink) = 0; + virtual TInt ResumeAudioL(MVTAudioSource& aAudioSource) = 0; + + /** + * This function is valid only in the ESetup and EInitializing state. It is a + * no-op when invoked in the EIdle state + * + * It causes the protocol to transition back to the EIdle state. The + * terminal remains in the EResetting state during the transition. + * + * While resetting, the protocol de-allocates all resources resources that + * had been previously allocated. When it completes, ResetComplete is called + * and the protocol reverts to the EIdle state. + * + * @leave This method can leave with one of the following error codes + * KErrNoMemory if the SDK failed to allocate memory during this operation + * @returns A unique command id for asynchronous completion + **/ + virtual TInt ResetProtocolL() = 0; + + /** + * This function can be invoked only in the ESetup state. The terminal starts connecting with the remote + * terminal based on the specified options and capabilities. + * The EVtCommandConnect command completion event will be passed to the observer + * when connect completes. + * Details about the negotiated session may be obtained by calling the GetSessionParamsL API. + * GetSessionParamsL may be called after call setup is started to get the list of available channels + * and their capabilities. + * Incoming tracks may be opened before ConnectL completes and will be indicated via the + * EVtIndicationIncommingTrack event. + * + * @param aComm + * An optional pointer to a comm server to provide comm source and sink end-points. + * @returns A unique command id for asynchronous completion + **/ + virtual TInt ConnectToProtocolL(MCommServer* aComm) = 0; + + /** + * Allows an application to provide a media source to be associated with a logical channel + * of communication with the peer. Sources should be added after the EVtIndicationOutgoingTrack + * indication is received for a newly established logical channel. The media type and + * channel id associated with the logical channel are specified as part of the indication. + * This function accepts a MVtVideoSource which provides additional functionality + * for advertizing capability and exposing configuration APIs. + * Data sources could be of the following types: + * a)raw media sources like camera, microphone etc. + * b)sources of compressed data like file, gateway component etc. + * + * @param aChannelId + * Indicates the channel id to be associated with this source. + * @param aDataSource + * reference to the data source + * @leave This method can leave with one of the following error codes + * KErrNotSupported if the format of the sources/sinks is incomtible with what the SDK can handle + * KErrNoMemory if the SDK failed to allocate memory during this operation + * @return A unique command id for asynchronous completion + */ + virtual TInt AddVideoSourceL(const TUint aChannelId, MVTVideoSource &aDataSource) = 0; + virtual TInt AddAudioSourceL(const TUint aChannelId, MVTAudioSource &aDataSource) = 0; + + /** + * Allows an application to provide a media sink for rendering an incoming media bitstream in a + * logical channel of communication with the peer. + * AddDataSinkL can be called only for established incoming logical channels identified by a unique + * channel id. + * Regular incoming channels are established by the peer and are + * indicated using the EVtIndicationIncomingTrack indication. + * This function takes in PV extension to MVtVideoSink or MVtAudioSink which provides additional functionality + * for advertizing capability and exposing configuration APIs. + * EVtCommandAddDataSink event is sent to the observer on completion of this call. + * + * @param aChannelId + * Indicates the channel id to be associated with this sink. + * @param aDataSink The data sink to be added + * + * @return A unique command id for asynchronous completion + **/ + virtual TInt AddVideoSinkL(const TUint aChannelId, MVTVideoSink &aDataSink) = 0; + virtual TInt AddAudioSinkL(const TUint aChannelId, MVTAudioSink &aDataSink) = 0; + + /** + * This API is to allow the user to cancel all pending requests. The current request being + * processed, if any, will also be aborted. + * EVtCommandCancelAllCommands will be passed to the command observer on completion. + * @returns A unique command id for asynchronous completion + **/ + virtual TInt CancelAllCommandsL( ) = 0; + + /** + * The Disconnect call is valid only when invoked in the EConnecting, and + * EConnected states. It causes the terminal to transition to the + * EDisconnecting state. All the media tracks both incoming and outgoing + * will be closed on invoking Disconnect. On completion, the terminal + * goes to the ESetup state. + * + * It is a no-op when called in any other state. + * + * This is an asynchronous request. The EvtCommandDisconnect event will be + * sent to the observer when the request processing is complete. This + * is the only event the Phone application should expect after calling + * Disconnect. + * + * @returns A unique command id for asynchronous completion + **/ + virtual TInt DisconnectFromProtocolL() = 0; + + /** + * This API is to allow for extensibility of the protocol interface. + * It allows a caller to ask for an instance of a particular interface object to be returned. + * The mechanism is analogous to the COM IUnknown method. The interfaces are identified with + * an interface ID that is a UUID as in DCE and a pointer to the interface object is + * returned if it is supported. Otherwise the returned pointer is NULL. + * @param aType + * @param aProtocolCommand + * @exception not_supported + * leaves if the specified interface id is not supported. + **/ + virtual TInt GetProtocolInterfaceL(TVtConfigType aType, MVtProtocolCommand*& aProtocolCommand) = 0; + + /** + * This APIis to be used to release an interface that was previously obtained using + * QueryInterfaceL. + * @param aType + * @param + * @exception not_supported + * leaves if the specified interface id is not supported. + **/ + virtual TInt DeleteProtocolInterfaceL(TVtConfigType aType, MVtProtocolCommand*) = 0; + + /** + * Destructor. + */ + virtual ~MVtSessionCommand() {} + }; + +class MVTUserInput + { + public: + + /** + * @returns Returns the user input type. + **/ + virtual TUserInputType GetType() = 0; + virtual ~MVTUserInput() {} + }; + +class MVtH324ConfigCommand : public MVtProtocolCommand + { + public: + + /** + * This API allows the user to specify observers for the 324m interface. + * + * @param aHandler the observer for command status and unsolicited informational events + **/ + virtual void SetObserverL(MVtProtocolHandler* aHandler) = 0; + + /** + * Sets the vendor identification data. This does not cause the stack to issue a vendor identifiation request. + * Set to NULL to disable sending vendor id. If set to a valid parameter before Connect, it will cause the stack + * to automatically send it along with the TCS message. + * @param cc + * T35 Country code + * @param ext + * T35 Extension + * @param mc + * T35 Manufacturer code + * @param aProduct + * Product number + * @param aVersion + * Version number + **/ + virtual TInt SetVendorId(TUint8 cc, TUint8 ext, TUint32 mc, const TDesC8* aProduct, const TDesC8* aVersion) = 0; + /** + * This API allows the user to send a videoTemporalSpatialTradeOff command to the peer. + * It is a request to the remote encoder to adjust its encoding in accordance with the tradeoff value. + * A value of 0 indicates a high spatial resolution and a value of 31 indicates a high frame rate. + * The values from 0 to 31 indicate monotonically a higher frame rate. Actual values do not correspond + * to precise values of spatial resolution or frame rate. + * + **/ + virtual TInt SendVideoTemporalSpatialTradeoffCommand(TUint aLogicalChannel, TUint8 aTradeoff)=0; + + /** + * This API allows the user to send a videoTemporalSpatialTradeOff command to the peer. + * It is an indication to the remote decoder that the local encoder has adjusted its encoding parameters + * according to the tradeoff value. + * A value of 0 indicates a high spatial resolution and a value of 31 indicates a high frame rate. + * The values from 0 to 31 indicate monotonically a higher frame rate. Actual values do not correspond + * to precise values of spatial resolution or frame rate. + * + **/ + virtual TInt SendVideoTemporalSpatialTradeoffIndication(TUint aLogicalChannel, TUint8 aTradeoff)=0; + + /** + * This API allows the user to specify the supported resolutions for video for transmit and receive. + * + **/ + virtual TInt SetSupportedResolutions( ) = 0; + + /** + * This API allows the user to set options for fast call setup procedures + **/ + + virtual TInt SetFastCsupOptions( ) = 0; + + /** + * Causes the protocol to send the specified user input to the remote terminal using + * control channel. The user input can be either DTMF ot Alphanumeric + * @param user_input A pointer to MVTUserInput + * @returns A unique command id for asynchronous completion + **/ + virtual TInt SendUserInputMessageL(MVTUserInput& user_input) = 0; + }; + +class MVtVideoConfigCommand : public MVtProtocolCommand + { + public: + + /** + * This API allows the user to specify separate observers for the extension interface. + * + * @param aHandler the observer for unsolicited informational events + **/ + virtual void SetObserverL(MVtProtocolHandler* aHandler) = 0; + + /** + * Sets the I-Frame refresh rate of the encoded output. + * + * @param aIFrameInterval I-Frame rate in seconds per I-Frame + * @return True if successful, else false + */ + virtual TInt SetIntraFrameInterval(TUint32 aIFrameInterval) = 0; + + /** + * Requests the encoder to encode the next frame as an I-Frame. If successful, the next encoded + * frame will be an I-Frame. + * + * @return True for success, else false + */ + virtual TInt RequestNextIntraFrame() = 0; + + /** + * Sets the frame rate of encoded output for the specified layer. + * @param aFrameRate Frame rate for the specified layer in frames per second. + * @return True if successful, else false. + */ + virtual TInt SetVideoFrameRate(TUint32 aFrameRate) = 0; + }; + +class MVtAudioConfigCommand : public MVtProtocolCommand + { + public: + + /** + * This API allows the user to specify observers for the 324m interface. + * + * @param aHandler + **/ + virtual void SetObserverL(MVtProtocolHandler* aHandler) = 0; + + /** + * Method to set the playback volume to the specified value. + * + * This is a pure virtual function that each derived class must implement. + * It is also an asynchronous function which will be answered with a callback. + * + * @param aNewVolume + * An input parameter to hold the value for the requested playback volume. + * + * @returns Returns a command ID that can be used to identify a command completion result with corresponding request. + */ + virtual TInt SetAudioVolumeL(TInt aVolume) = 0; + + /** + * Method to get the maximum valid value for the playback volume. + * + * This is a pure virtual function that each derived class must implement. + * It is also an asynchronous function which will be answered with a callback. + * + * @param aMaxVolume + * An output parameter to hold the value for the maximum valid playback volume. + * Note that the parameter should not be used until the callback indicates that the + * method has completed. + * + * @returns Returns a command ID that can be used to identify a command completion result with corresponding request. + */ + virtual TInt GetMaxAudioVolumeL(TInt& aMaxVolume) = 0; + }; + +class VTProtocolFactory + { + public: + + /** + * Create one instance. + */ + IMPORT_C static MVtSessionCommand* CreateSessionCommandL(MVtProtocolHandler* aProtocolHandler, TBool aEnableProxy, TVt3G324MSupported& a3G324MSupported); + + /** + * This function allows the application to delete an instance of a terminal + * and reclaim all allocated resources. A terminal should be deleted only in + * the EIdle state. An attempt to delete a terminal in any other state will + * result in unpredictable behavior. + * + * @param terminal the terminal to be deleted. + * + **/ + IMPORT_C static void DeleteSessionCommand( MVtSessionCommand* aSessionCommand ); + + /** + * Creates an instance of a DevSound audio data source. + * + * @param None + * + * @returns A pointer to the interface + **/ + IMPORT_C static MVTAudioSource* CreateAudioSource(); + + /** + * Deletes an instance of a DevSound audio data source + * that was previously created with CreateAudioSource(); + * + * @param aSource The audio data source to be deleted. + * + * @returns status + **/ + IMPORT_C static TInt DeletAudioSource(MVTAudioSource *aSource); + + /** + * Creates an instance of a DevSound audio data sink. + * + * @param None + * + * @returns A pointer to the interface + **/ + IMPORT_C static MVTAudioSink* CreateAudioSink(); + + /** + * Deletes an instance of a DevSound audio data sink + * that was previously created with CreateAudioSink(); + * + * @param The audio data sink to be deleted. + * + * @returns status + **/ + IMPORT_C static TInt DeleteAudioSink(MVTAudioSink *aSink); + + /** + * Creates an instance of a comm server of a particular name, to be used to + * initialize the terminal. + * + * + * @returns A pointer to a terminal or leaves if the type is invalid or the system is out of resources + **/ + IMPORT_C static MCommServer* CreateCommServerL(const TDesC & aName, TBool aEnableBitReversal=EFalse); + + /** + * This function allows the application to delete an instance of a comm server + * and reclaim all allocated resources. A comm server should be deleted only when the + * protocol is in the EIdle state. An attempt to delete a comm server in any other state + * could result in memory corruption within the protocol. This function will leave with + * KErrInUse if the comm server is still in use. However it will not check the state of the + * protocol that is using the comm server. + * + * @param aCommServer the comm server to be deleted. + * + * @returns a status code indicating success or failure + **/ + IMPORT_C static void DeleteCommServerL(MCommServer* aCommServer); + + /** + * Create instance. + * @param aUIITyep + * @param aTone + */ + IMPORT_C static MVTUserInput* CreateUserInputIndication(TUserInputType aUIIType, TUint8 aTone); + + /** + * Delete instance. + * @param aUII + */ + IMPORT_C static void DeleteUserInputIndication(MVTUserInput* aUII); + + /** + * + * @param aAudioSink + */ + IMPORT_C static MVtAudioConfigCommand* GetAudioConfigCommandL(MVTAudioSink* aAudioSink); + }; + +#endif +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolsstub/src/caudioconfighandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolsstub/src/caudioconfighandler.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,97 @@ +/* +* Copyright (c) 2008 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: Audio configuration implementation +* +*/ + +#include "mvtprotocolhandler.h" +#include "caudioconfighandler.h" + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// ----------------------------------------------------------------------------- +// TAudioConfigHandler::TAudioConfigHandler +// Constructor. +// ----------------------------------------------------------------------------- +// +TAudioConfigHandler::TAudioConfigHandler(MVtProtocolHandler* aProtocolHandler) : iProtocolHandler(aProtocolHandler) + { + __IF_DEBUG(Print(_L("VTProto: TAudioConfigHandler::TAudioConfigHandler<"))); + __IF_DEBUG(Print(_L("VTProto: TAudioConfigHandler::TAudioConfigHandler>"))); + } + +// ----------------------------------------------------------------------------- +// CAudioConfigCommand::CAudioConfigCommand +// Constructor. +// ----------------------------------------------------------------------------- +// +CAudioConfigCommand::CAudioConfigCommand() + { + __IF_DEBUG(Print(_L("VTProto: CAudioConfigCommand::CAudioConfigCommand<"))); + __IF_DEBUG(Print(_L("VTProto: CAudioConfigCommand::CAudioConfigCommand>"))); + } + +// ----------------------------------------------------------------------------- +// CAudioConfigCommand::SetObserverL +// This API allows the user to specify observers for the 324m interface. +// ----------------------------------------------------------------------------- +// +void CAudioConfigCommand::SetObserverL(MVtProtocolHandler* aHandler) + { + __IF_DEBUG(Print(_L("VTProto: CAudioConfigCommand::SetObserverL<"))); + iAudioConfigHandler = new (ELeave)TAudioConfigHandler(aHandler); + __IF_DEBUG(Print(_L("VTProto: CAudioConfigCommand::SetObserverL>"))); + } + +// ----------------------------------------------------------------------------- +// CAudioConfigCommand::SetAudioVolumeL +// Method to set the playback volume to the specified value. +// ----------------------------------------------------------------------------- +// +TInt CAudioConfigCommand::SetAudioVolumeL(TInt aVolume) + { + __IF_DEBUG(Print(_L("VTProto: CAudioConfigCommand::SetAudioVolumeL"))); + __IF_DEBUG(Print(_L("VTProto: CAudioConfigCommand::SetAudioVolumeL aVolume %d"), aVolume)); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CAudioConfigCommand::GetMaxAudioVolumeL +// Method to get the maximum valid value for the playback volume. +// ----------------------------------------------------------------------------- +// +TInt CAudioConfigCommand::GetMaxAudioVolumeL(TInt& aMaxVolume) + { + __IF_DEBUG(Print(_L("VTProto: CAudioConfigCommand::GetMaxAudioVolumeL"))); + __IF_DEBUG(Print(_L("VTProto: CAudioConfigCommand::GetMaxAudioVolumeL aMaxVolume %d"), aMaxVolume)); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CAudioConfigCommand::~CAudioConfigCommand +// Destructor. +// ----------------------------------------------------------------------------- +// +CAudioConfigCommand::~CAudioConfigCommand() + { + __IF_DEBUG(Print(_L("VTProto: CAudioConfigCommand::~CAudioConfigCommand>"))); + delete iAudioConfigHandler; + __IF_DEBUG(Print(_L("VTProto: CAudioConfigCommand::~CAudioConfigCommand"))); + } +// End of File + \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolsstub/src/cdatasinkproxy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolsstub/src/cdatasinkproxy.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,63 @@ +/* +* Copyright (c) 2008 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: Data sink proxy implementation +* +*/ + +#include "mvtprotocolhandler.h" +#include "cdatasinkproxy.h" + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::CDisplaySinkProxy +// Constructor. +// ----------------------------------------------------------------------------- +// +CDisplaySinkProxy::CDisplaySinkProxy(MVTVideoSink* aDisplaySink) : iDisplaySink(aDisplaySink) + { + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::CDisplaySinkProxy<" ) )); + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::CDisplaySinkProxy iDisplaySink %d>" ), iDisplaySink)); + } + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::ConstructL +// ----------------------------------------------------------------------------- +// +void CDisplaySinkProxy::ConstructL() + { + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::ConstructL<" ) )); + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::ConstructL>" ) )); + } + + +// ----------------------------------------------------------------------------- +// CDisplaySinkProxy::NewL +// ----------------------------------------------------------------------------- +// +CDisplaySinkProxy* CDisplaySinkProxy::NewL(MVTVideoSink* aDisplaySink) + { + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::NewL<" ) )); + CDisplaySinkProxy* self = new (ELeave)CDisplaySinkProxy(aDisplaySink); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + __IF_DEBUG(Print( _L( "VTProto: CDisplaySinkProxy::NewL>" ) )); + return self; + } +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolsstub/src/cdatasourceproxy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolsstub/src/cdatasourceproxy.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,62 @@ +/* +* Copyright (c) 2008 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: Data source proxy implementation +* +*/ + +#include "mvtprotocolhandler.h" +#include "cdatasourceproxy.h" + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::CVideoSourceProxy +// Constructor. +// ----------------------------------------------------------------------------- +// +CVideoSourceProxy::CVideoSourceProxy(MVTVideoSource* aDataSource) : iVideoSource(aDataSource) + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::CVideoSourceProxy<"))); + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::CVideoSourceProxy iVideoSource %d>"), iVideoSource)); + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::ConstructL +// ----------------------------------------------------------------------------- +// +void CVideoSourceProxy::ConstructL() + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::ConstructL<"))); + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::ConstructL>"))); + } + +// ----------------------------------------------------------------------------- +// CVideoSourceProxy::NewL +// ----------------------------------------------------------------------------- +// +CVideoSourceProxy* CVideoSourceProxy::NewL(MVTVideoSource* aDataSource) + { + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::NewL<"))); + CVideoSourceProxy* self = new (ELeave)CVideoSourceProxy(aDataSource); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + __IF_DEBUG(Print(_L("VTProto: CVideoSourceProxy::NewL>"))); + return self; + } +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolsstub/src/ch324confighandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolsstub/src/ch324confighandler.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,135 @@ +/* +* Copyright (c) 2008 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: H324 configuration implementation +* +*/ + + +#include "mvtprotocolhandler.h" +#include "ch324confighandler.h" +#include "cvtuserinput.h" + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + + +// ----------------------------------------------------------------------------- +// TH324ConfigHandler::TH324ConfigHandler +// Constructor. +// ----------------------------------------------------------------------------- +// +TH324ConfigHandler::TH324ConfigHandler(MVtProtocolHandler* aProtocolHandler) : iProtocolHandler(aProtocolHandler) + { + __IF_DEBUG(Print(_L("VTProto: TH324ConfigHandler::TH324ConfigHandler<"))); + __IF_DEBUG(Print(_L("VTProto: TH324ConfigHandler::TH324ConfigHandler>"))); + } + +// ----------------------------------------------------------------------------- +// CH324ConfigCommand::SetVendorId +// Sets the vendor identification data. +// ----------------------------------------------------------------------------- +// +TInt CH324ConfigCommand::SetVendorId(TUint8 cc, TUint8 ext, TUint32 mc, const TDesC8* aProduct, const TDesC8* aVersion) + { + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::SetVendorId"))); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CH324ConfigCommand::SendVideoTemporalSpatialTradeoffCommand +// This API allows the user to send a videoTemporalSpatialTradeOff command to the peer. +// ----------------------------------------------------------------------------- +// +TInt CH324ConfigCommand::SendVideoTemporalSpatialTradeoffCommand(TUint aLogicalChannel, TUint8 aTradeoff) + { + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::SendVideoTemporalSpatialTradeoffCommand"))); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CH324ConfigCommand::SendVideoTemporalSpatialTradeoffIndication +// This API allows the user to send a videoTemporalSpatialTradeOff command to the peer. +// ----------------------------------------------------------------------------- +// +TInt CH324ConfigCommand::SendVideoTemporalSpatialTradeoffIndication(TUint aLogicalChannel, TUint8 aTradeoff) + { + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::SendVideoTemporalSpatialTradeoffIndication"))); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CH324ConfigCommand::SetVideoResolutions +// This API allows the user to specify the supported resolutions for video for transmit and receive. +// ----------------------------------------------------------------------------- +// +TInt CH324ConfigCommand::SetSupportedResolutions() + { + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::SetSupportedResolutions"))); + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CH324ConfigCommand::SetFastCsupOptions +// This API allows the user to set options for fast call setup procedures. +// ----------------------------------------------------------------------------- +// +TInt CH324ConfigCommand::SetFastCsupOptions( ) + { + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::SetFastCsupOptions"))); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CH324ConfigCommand::SendUserInputMessageL +// Causes the vt2way to send the specified user input to the remote terminal using +// control channel. +// ----------------------------------------------------------------------------- +// +TInt CH324ConfigCommand::SendUserInputMessageL(MVTUserInput& user_input) + { + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::SendUserInputMessageL<"))); + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::SendUserInputMessageL>"))); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CH324ConfigCommand::SetObserverL +// This API allows the user to specify observers for the 324m interface. +// ----------------------------------------------------------------------------- +// +void CH324ConfigCommand::SetObserverL(MVtProtocolHandler* aHandler) + { + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::SetObserverL<"))); + iH324ConfigHandler = new (ELeave)TH324ConfigHandler(aHandler); + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::SetObserverL observer %d"), iH324ConfigHandler)); + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::SetObserverL>"))); + } + +// ----------------------------------------------------------------------------- +// CH324ConfigCommand::~CH324ConfigCommand +// Destructor. +// ----------------------------------------------------------------------------- +// +CH324ConfigCommand::~CH324ConfigCommand() + { + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::~CH324ConfigCommand<"))); + delete iH324ConfigHandler; + __IF_DEBUG(Print(_L("VTProto: CH324ConfigCommand::~CH324ConfigCommand>"))); + } + +// end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolsstub/src/csessionhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolsstub/src/csessionhandler.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,314 @@ +/* +* Copyright (c) 2008 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: Session command implementation +* +*/ + +#include "mvtprotocolhandler.h" +#include "cdatasinkproxy.h" +#include "cdatasourceproxy.h" +#include "csessionhandler.h" +#include "ccommserver.h" +#include "ch324confighandler.h" +#include "cvideoconfighandler.h" +#include "caudioconfighandler.h" + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// ----------------------------------------------------------------------------- +// TSessionHandler::TSessionHandler +// Constructor. +// ----------------------------------------------------------------------------- +// +TSessionHandler::TSessionHandler(MVtProtocolHandler* aProtocolHandler) : iProtocolHandler(aProtocolHandler) + { + __IF_DEBUG(Print(_L("VTProto: TSessionHandler::TSessionHandler<"))); + __IF_DEBUG(Print(_L("VTProto: TSessionHandler::TSessionHandler>"))); + } + + +// ----------------------------------------------------------------------------- +// CSessionCommand::CSessionCommand +// Constructor. +// ----------------------------------------------------------------------------- +// +CSessionCommand::CSessionCommand(TSessionHandler* aSessionHandler) + : iSessionHandler(aSessionHandler) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::CSessionCommand<"))); + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::CSessionCommand>"))); + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::~CSessionComman +// Destructor. +// ----------------------------------------------------------------------------- +// +CSessionCommand::~CSessionCommand() + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::~CSessionCommand<"))); + delete iVideoSource; + delete iDisplaySink; + delete iSessionHandler; + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::~CSessionCommand>"))); + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::ConnectToProtocolL +// This function can be invoked only in the ESetup state. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::ConnectToProtocolL(MCommServer* aComm) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::ConnectToProtocolL"))); + CCommServer* commServer = static_cast(aComm); + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::ConnectToProtocolL commServer %d"), commServer)); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::DisconnectFromProtocolL +// The Disconnect call is valid only when invoked in the EConnecting, and +// EConnected states. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::DisconnectFromProtocolL() + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::DisconnectFromProtocolL"))); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::ResetProtocolL +// This function is valid only in the ESetup and EInitializing state. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::ResetProtocolL() + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::ResetProtocolL"))); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::InitProtocolL +// This function is valid only in the EIdle state. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::InitProtocolL(TVtInitInfo& aInitInfo) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::InitProtocolL"))); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::AddVideoSinkL +// Allows an application to provide a media sink for rendering an incoming media bitstream in a +// logical channel of communication with the peer. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::AddVideoSinkL(const TUint aChannelId, MVTVideoSink& aDataSink) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::AddVideoSinkL"))); + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::AddVideoSinkL aChannelId %d"), aChannelId)); + iDisplaySink =CDisplaySinkProxy::NewL(&aDataSink); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::AddVideoSourceL +// Allows an application to provide a media source to be associated with a logical channel +// of communication with the peer. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::AddVideoSourceL(const TUint aChannelId, MVTVideoSource& aDataSource) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::AddVideoSourceL"))); + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::AddVideoSourceL aChannelId %d"), aChannelId)); + iVideoSource = CVideoSourceProxy::NewL(&aDataSource); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::AddAudioSourceL +// Allows an application to provide a media source to be associated with a logical channel +// of communication with the peer. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::AddAudioSourceL(const TUint aChannelId, MVTAudioSource &aDataSource) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::AddAudioSourceL"))); + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::AddAudioSourceL aChannelId %d"), aChannelId)); + CAudioSourceProxy* audioSourceProxy = static_cast(&aDataSource); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::AddAudioSinkL +// Allows an application to provide a media sink for rendering an incoming media bitstream in a +// logical channel of communication with the peer. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::AddAudioSinkL(const TUint aChannelId, MVTAudioSink &aDataSink) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::AddAudioSinkL"))); + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::AddAudioSinkL aChannelId %d"), aChannelId)); + CAudioSinkProxy* audioSinkProxy = static_cast(&aDataSink); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::PauseVideoL +// For an incoming track (MVTVideoSink) this function pauses sending +// media to the sink (output device) and stops the sink. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::PauseVideoL(MVTVideoSource& aTrack) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::PauseVideoL"))); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::PauseVideoL +// For an incoming track (MVtVideoSink) this function pauses sending +// media to the sink (output device) and stops the sink. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::PauseVideoL(MVTVideoSink& aTrack) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::PauseVideoL"))); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::PauseAudioL +// For an incoming track (MVTAudioSource) this function pauses sending +// media to the sink (output device) and stops the sink. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::PauseAudioL(MVTAudioSource& aTrack) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::PauseAudioL"))); + CAudioSourceProxy* audioSourceProxy = static_cast(&aTrack); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::ResumeVideoL +// Resume a previously paused incoming or outgoing track. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::ResumeVideoL(MVTVideoSource& aTrack) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::ResumeVideoL"))); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::ResumeVideoL +// Resume a previously paused incoming or outgoing track. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::ResumeVideoL(MVTVideoSink& aTrack) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::ResumeVideoL"))); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::ResumeAudioL +// Resume a previously paused incoming or outgoing track. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::ResumeAudioL(MVTAudioSource& aTrack) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::ResumeAudioL"))); + CAudioSourceProxy* audioSourceProxy = static_cast(&aTrack); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::CancelAllCommandsL +// This API is to allow the user to cancel all pending requests. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::CancelAllCommandsL( ) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::CancelAllCommandsL"))); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::GetProtocolInterfaceL +// This API is to allow for extensibility of the protocol interface. +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::GetProtocolInterfaceL(TVtConfigType aType, MVtProtocolCommand*& aProtocolCommand) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::GetProtocolInterfaceL<"))); + TInt commandId = 0; + if (aType == EVtH324Config) + { + CH324ConfigCommand* H324ConfigCommand = new (ELeave)CH324ConfigCommand(); + + aProtocolCommand = H324ConfigCommand; + } + else if (aType == EVtVideoEncoderConfig) + { + CVideoConfigCommand* videoConfigCommand = new (ELeave)CVideoConfigCommand(); + + aProtocolCommand = videoConfigCommand; + } + else + { + ; + } + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::GetProtocolInterfaceL aType %d, aProtocolCommand %d>"), aType, aProtocolCommand)); + return commandId; + } + +// ----------------------------------------------------------------------------- +// CSessionCommand::DeleteProtocolInterfaceL +// This APIis to be used to release an interface that was previously obtained using +// ----------------------------------------------------------------------------- +// +TInt CSessionCommand::DeleteProtocolInterfaceL(TVtConfigType aType, MVtProtocolCommand* aProtocolCommand) + { + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::DeleteProtocolInterfaceL<"))); + TInt commandId = 0; + if (aType == EVtH324Config) + { + CH324ConfigCommand* H324ConfigCommand = static_cast(aProtocolCommand); + + delete H324ConfigCommand; + } + else if (aType == EVtVideoEncoderConfig) + { + CVideoConfigCommand* videoConfigCommand = static_cast(aProtocolCommand); + + delete videoConfigCommand; + } + else + { + ; + } + __IF_DEBUG(Print(_L("VTProto: CSessionCommand::DeleteProtocolInterfaceL aType, aProtocolCommand %d>"), aType, aProtocolCommand)); + return commandId; + } + +// end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolsstub/src/cvideoconfighandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolsstub/src/cvideoconfighandler.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,98 @@ +/* +* Copyright (c) 2008 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 configuration implementation +* +*/ + +#include "mvtprotocolhandler.h" +#include "cvideoconfighandler.h" + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// ----------------------------------------------------------------------------- +// TVideoConfigHandler::TVideoConfigHandler +// Constructor. +// ----------------------------------------------------------------------------- +// +TVideoConfigHandler::TVideoConfigHandler(MVtProtocolHandler* aProtocolHandler) : iProtocolHandler(aProtocolHandler) + { + __IF_DEBUG(Print(_L("VTProto: TVideoConfigHandler::TVideoConfigHandler<"))); + __IF_DEBUG(Print(_L("VTProto: TVideoConfigHandler::TVideoConfigHandler>"))); + } + +// ----------------------------------------------------------------------------- +// CVideoConfigCommand::SetObserverL +// This API allows the user to specify separate observers for the extension interface. +// ----------------------------------------------------------------------------- +// +void CVideoConfigCommand::SetObserverL(MVtProtocolHandler* aHandler) + { + __IF_DEBUG(Print(_L("VTProto: CVideoConfigCommand::SetObserverL<"))); + iVideoConfigHandler = new (ELeave)TVideoConfigHandler(aHandler); + __IF_DEBUG(Print(_L("VTProto: CVideoConfigCommand::SetObserverL>"))); + } + +// ----------------------------------------------------------------------------- +// CVideoConfigCommand::SetIntraFrameInterval +// Sets the I-Frame refresh rate of the encoded output. +// ----------------------------------------------------------------------------- +// +TInt CVideoConfigCommand::SetIntraFrameInterval(TUint32 aIFrameInterval) + { + __IF_DEBUG(Print(_L("VTProto: CVideoConfigCommand::SetIntraFrameInterval"))); + __IF_DEBUG(Print(_L("VTProto: CVideoConfigCommand::SetIntraFrameInterval aIFrameInterval %d"), aIFrameInterval)); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVideoConfigCommand::RequestNextIntraFrame +// Requests the encoder to encode the next frame as an I-Frame. +// ----------------------------------------------------------------------------- +// +TInt CVideoConfigCommand::RequestNextIntraFrame() + { + __IF_DEBUG(Print(_L("VTProto: CVideoConfigCommand::RequestNextIntraFrame"))); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CVideoConfigCommand::SetVideoFrameRate +// Sets the frame rate of encoded output for the specified layer. +// ----------------------------------------------------------------------------- +// +TInt CVideoConfigCommand::SetVideoFrameRate(TUint32 aFrameRate) + { + __IF_DEBUG(Print(_L("VTProto: CVideoConfigCommand::SetVideoFrameRate"))); + __IF_DEBUG(Print(_L("VTProto: CVideoConfigCommand::SetVideoFrameRate aFrameRate %d"), aFrameRate)); + return KErrNone; + } + + +// ----------------------------------------------------------------------------- +// CVideoConfigCommand::~CVideoConfigCommand +// Destructor. +// ----------------------------------------------------------------------------- +// +CVideoConfigCommand::~CVideoConfigCommand() + { + __IF_DEBUG(Print(_L("VTProto: CVideoConfigCommand::~CVideoConfigCommand"))); + delete iVideoConfigHandler; + __IF_DEBUG(Print(_L("VTProto: CVideoConfigCommand::~CVideoConfigCommand"))); + } + +// end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolsstub/src/cvtuserinput.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolsstub/src/cvtuserinput.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,122 @@ +/* +* Copyright (c) 2008 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: VT User input implementation +* +*/ + +#include "mvtprotocolhandler.h" +#include "cvtuserinput.h" + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif + +// ----------------------------------------------------------------------------- +// CVTUserInputDtmf::ConstructL +// Constructor. +// ----------------------------------------------------------------------------- +// +void CVTUserInputDtmf::ConstructL(TUint8 aTone) + { + __IF_DEBUG(Print(_L("VTProto: CVTUserInputDtmf::ConstructL<"))); + __IF_DEBUG(Print(_L("VTProto: CVTUserInputDtmf::ConstructL>"))); + } + +// ----------------------------------------------------------------------------- +// CVTUserInputDtmf::CVTUserInputDtmf +// Constructor. +// ----------------------------------------------------------------------------- +// +CVTUserInputDtmf* CVTUserInputDtmf::NewL(TUint8 aTone) + { + __IF_DEBUG(Print(_L("VTProto: CVTUserInputDtmf::NewL<"))); + CVTUserInputDtmf* self = new (ELeave)CVTUserInputDtmf(); + CleanupStack::PushL(self); + self->ConstructL(aTone); + CleanupStack::Pop(); + __IF_DEBUG(Print(_L("VTProto: CVTUserInputDtmf::NewL>"))); + return self; + } + +// ----------------------------------------------------------------------------- +// CVTUserInputDtmf::~CVTUserInputDtmf +// Destructor. +// ----------------------------------------------------------------------------- +// +CVTUserInputDtmf::~CVTUserInputDtmf() + { + __IF_DEBUG(Print(_L("VTProto: CVTUserInputDtmf::~CVTUserInputDtmf<"))); + __IF_DEBUG(Print(_L("VTProto: CVTUserInputDtmf::~CVTUserInputDtmf>"))); + } + +// ----------------------------------------------------------------------------- +// CVTUserInputDtmf::GetType +// Virtual function to return the user input type +// ----------------------------------------------------------------------------- +// +TUserInputType CVTUserInputDtmf::GetType() + { + return EVtUiiDTMF; + } + +// ----------------------------------------------------------------------------- +// CVTUserInputDtmf::ConstructL +// Constructor. +// ----------------------------------------------------------------------------- +// +void CVTUserInputAlphanumeric::ConstructL(TUint8 aTone) + { + __IF_DEBUG(Print(_L("VTProto: CVTUserInputAlphanumeric::ConstructL<"))); + __IF_DEBUG(Print(_L("VTProto: CVTUserInputAlphanumeric::ConstructL>"))); + } + +// ----------------------------------------------------------------------------- +// CVTUserInputAlphanumeric::CVTUserInputAlphanumeric +// Constructor. +// ----------------------------------------------------------------------------- +// +CVTUserInputAlphanumeric* CVTUserInputAlphanumeric::NewL(TUint8 aTone) + { + __IF_DEBUG(Print(_L("VTProto: CVTUserInputAlphanumeric::NewL<"))); + CVTUserInputAlphanumeric* self = new (ELeave)CVTUserInputAlphanumeric(); + CleanupStack::PushL(self); + self->ConstructL(aTone); + CleanupStack::Pop(); + __IF_DEBUG(Print(_L("VTProto: CVTUserInputAlphanumeric::NewL>"))); + return self; + } + +// ----------------------------------------------------------------------------- +// CVTUserInputAlphanumeric::~CVTUserInputAlphanumeric +// Destructor. +// ----------------------------------------------------------------------------- +// +CVTUserInputAlphanumeric::~CVTUserInputAlphanumeric() + { + __IF_DEBUG(Print(_L("VTProto: CVTUserInputAlphanumeric::~CVTUserInputAlphanumeric<"))); + __IF_DEBUG(Print(_L("VTProto: CVTUserInputAlphanumeric::~CVTUserInputAlphanumeric>"))); + } + +// ----------------------------------------------------------------------------- +// CVTUserInputAlphanumeric::GetType +// Virtual function to return the user input type. +// ----------------------------------------------------------------------------- +// +TUserInputType CVTUserInputAlphanumeric::GetType() + { + return EVtUiiAlphaNumeric; + } +// end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtprotocolsstub/src/vtprotocolfactory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolsstub/src/vtprotocolfactory.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,208 @@ +/* +* Copyright (c) 2008 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: Protocol factory implementation +* +*/ + +#include "mvtprotocolhandler.h" +#include "cdatasourceproxy.h" +#include "cdatasinkproxy.h" +#include "csessionhandler.h" +#include "caudioconfighandler.h" +#include "cvtuserinput.h" +#include "ccommserver.h" + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif +// ----------------------------------------------------------------------------- +// VTProtocolFactory::CreateSessionCommandL +// Create one instance. +// ----------------------------------------------------------------------------- +// +EXPORT_C MVtSessionCommand* VTProtocolFactory::CreateSessionCommandL(MVtProtocolHandler* aProtocolHandler, TBool aEnableProxy, TVt3G324MSupported& a3G324MSupported) + { + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::CreateSessionCommandL<"))); + a3G324MSupported = EVt3G324MMissing; + TSessionHandler * sessionHandler = new (ELeave)TSessionHandler(aProtocolHandler); + CleanupStack::PushL(sessionHandler); + CSessionCommand* sessionCommand = new (ELeave)CSessionCommand(sessionHandler); + CleanupStack::Pop(); + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::CreateSessionCommandL sessionCommand %d>"), sessionCommand)); + return sessionCommand; + } + +// ----------------------------------------------------------------------------- +// VTProtocolFactory::DeleteSessionCommand +// This function allows the application to delete an instance of a terminal +// and reclaim all allocated resources. +// ----------------------------------------------------------------------------- +// +EXPORT_C void VTProtocolFactory::DeleteSessionCommand( MVtSessionCommand* aSessionCommand ) + { + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::DeleteSessionCommand<"))); + CSessionCommand* sessionCommand = static_cast(aSessionCommand); + delete aSessionCommand; + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::DeleteSessionCommand>"))); + } + +// ----------------------------------------------------------------------------- +// VTProtocolFactory::CreateAudioSource +// Creates an instance of a DevSound audio data source. +// ----------------------------------------------------------------------------- +// +EXPORT_C MVTAudioSource* VTProtocolFactory::CreateAudioSource() + { + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::CreateAudioSource<"))); + TInt err( KErrNone ); + CAudioSourceProxy* audioSourceProxy = NULL; + TRAP (err, audioSourceProxy = new (ELeave) CAudioSourceProxy() ); + if (err != KErrNone) + { + return NULL; + } + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::CreateAudioSource audioSourceProxy %d>"), audioSourceProxy)); + return audioSourceProxy; + } + +// ----------------------------------------------------------------------------- +// VTProtocolFactory::DeletAudioSource +// Deletes an instance of a DevSound audio data source. +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt VTProtocolFactory::DeletAudioSource(MVTAudioSource *aSource) + { + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::DeletAudioSource<"))); + CAudioSourceProxy* audioSourceProxy = static_cast(aSource); + delete aSource; + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::DeletAudioSource>"))); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// VTProtocolFactory::CreateAudioSink +// Creates an instance of a DevSound audio data sink. +// ----------------------------------------------------------------------------- +// +EXPORT_C MVTAudioSink* VTProtocolFactory::CreateAudioSink() + { + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::CreateAudioSink<"))); + TInt err( KErrNone ); + CAudioSinkProxy* audioSinkProxy = NULL; + TRAP(err, audioSinkProxy = new (ELeave) CAudioSinkProxy() ); + if (err != KErrNone) + { + return NULL; + } + + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::CreateAudioSink audioSinkProxy %d>"), audioSinkProxy)); + return audioSinkProxy; + } + +// ----------------------------------------------------------------------------- +// VTProtocolFactory::DeleteAudioSink +// Deletes an instance of a DevSound audio data sink +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt VTProtocolFactory::DeleteAudioSink(MVTAudioSink *aSink) + { + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::DeleteAudioSink<"))); + CAudioSinkProxy* audioSinkProxy = static_cast(aSink); + delete aSink; + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::DeleteAudioSink>"))); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// VTProtocolFactory::CreateCommServerL +// Creates an instance of a comm server of a particular name, to be used to +// initialize the terminal. +// ----------------------------------------------------------------------------- +// +EXPORT_C MCommServer* VTProtocolFactory::CreateCommServerL(const TDesC & aName, TBool aEnableBitReversal) + { + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::CreateCommServerL<"))); + CCommServer* commServer = new (ELeave)CCommServer(); + CleanupStack::PushL(commServer); + CleanupStack::Pop(); + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::CreateCommServerL commServer %d>"), commServer)); + return commServer; + } + +// ----------------------------------------------------------------------------- +// VTProtocolFactory::DeleteCommServerL +// This function allows the application to delete an instance of a comm server +// and reclaim all allocated resources. +// ----------------------------------------------------------------------------- +// +EXPORT_C void VTProtocolFactory::DeleteCommServerL(MCommServer* aCommServer) + { + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::DeleteCommServerL<"))); + CCommServer* commServer = static_cast(aCommServer); + delete aCommServer; + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::DeleteCommServerL>"))); + } + +// ----------------------------------------------------------------------------- +// VTProtocolFactory::CreateUserInputIndication +// Create instance . +// ----------------------------------------------------------------------------- +// +EXPORT_C MVTUserInput* VTProtocolFactory::CreateUserInputIndication(TUserInputType aUIIType, TUint8 aTone) + { + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::CreateUserInputIndication"))); + if (aUIIType == EVtUiiDTMF) + { + CVTUserInputDtmf* uii = CVTUserInputDtmf::NewL(aTone); + return uii; + } + else if (aUIIType == EVtUiiAlphaNumeric) + { + CVTUserInputAlphanumeric* uii = CVTUserInputAlphanumeric::NewL(aTone); + return uii; + } + else + { + return NULL; + } + + } + +// ----------------------------------------------------------------------------- +// VTProtocolFactory::DeleteUserInputIndication +// Delete instance. +// ----------------------------------------------------------------------------- +// +EXPORT_C void VTProtocolFactory::DeleteUserInputIndication(MVTUserInput* aUII) + { + delete aUII; + } + +// ----------------------------------------------------------------------------- +// VTProtocolFactory::GetAudioConfigCommandL +// Get one instance. +// ----------------------------------------------------------------------------- +// +EXPORT_C MVtAudioConfigCommand* VTProtocolFactory::GetAudioConfigCommandL(MVTAudioSink* aAudioSink) + { + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::GetAudioConfigCommandL<"))); + CAudioSinkProxy* audioSinkProxy = static_cast(aAudioSink); + CAudioConfigCommand* audioConfigCommand = new (ELeave)CAudioConfigCommand(); + __IF_DEBUG(Print(_L("VTProto: VTProtocolFactory::GetAudioConfigCommandL audioConfigCommand %d>"), audioConfigCommand)); + return audioConfigCommand; + } + +// end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtapp/cenrep/keys_s60videotelephony.xls Binary file vtuis/lcvtapp/cenrep/keys_s60videotelephony.xls has changed diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtapp/conf/s60videotelephony.confml Binary file vtuis/lcvtapp/conf/s60videotelephony.confml has changed diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtapp/conf/s60videotelephony_102072D0.crml Binary file vtuis/lcvtapp/conf/s60videotelephony_102072D0.crml has changed diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtapp/conf/s60videotelephony_10281872.crml Binary file vtuis/lcvtapp/conf/s60videotelephony_10281872.crml has changed diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtapp/data/videotelui_stub.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtapp/data/videotelui_stub.pkg Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,31 @@ +; +; Copyright (c) 2009 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: +; +; Languages +&EN + +; Header +#{"videotelui"}, (0x101F8681), 1, 0, 0, TYPE=SA + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + +;Files +""-"z:\sys\bin\videotelui.exe" +""-"z:\resource\apps\videotelui.rsc" +""-"z:\private\10003a3f\import\apps\videotelui_reg.rsc" \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtapp/data/videotelui_stub.sis Binary file vtuis/lcvtapp/data/videotelui_stub.sis has changed diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtapp/inc/VideoTelephonyInternalCRKeys.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtapp/inc/VideoTelephonyInternalCRKeys.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,119 @@ +/* +* Copyright (c) 2008 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 Telephony internal Central Repository keys +* +*/ + + +#ifndef VIDEOTELEPHONYINTERNALCRKEYS_H +#define VIDEOTELEPHONYINTERNALCRKEYS_H + +#include + +/** +* Video Telephony Variation API +* Keys under this category are used in defining video telephony variation. +*/ +const TUid KCRUidVTVariation = {0x102072D0}; + +/** +* Video Telephony Local Variation Flags. Values are defined in +* VideoTelephonyVariant.hrh. +*/ +const TUint32 KVTLocalVariationFlags = 0x00000001; + +/** +* Video Telephony Configuration API +* Keys under this category are used for configuring video call behaviour. +* @since S60 3.1 +*/ +const TUid KCRUidVTConfiguration = {0x10281872}; + +/** +* This key controls minimum, normal and maximum frame rate for video encoder. +* Integer values in the string are between 0 and 31 separated by space. +* Example for key value is "5 10 5". +*/ +const TUint32 KVTVideoFrameRates = 0x00000001; + +/** +* Defines layout (screen orientation) used by Video Telephone application +* per active camera. Each camera has one of the following configurations: +* 1) "LS" = Landscape +* 2) "PR" = Portrait +* 3) "OL" = Obey device layout (normal operation) +* Camera values are: +* 1) "C1" = VT primary camera (inwards) +* 2) "C2" = VT secondary camera (outwards) +* Example value (portrait for cam1, landscape for cam2): C1:PR C2:LS +*/ +const TUint32 KVTCameraLayout = 0x00000002; + +/** +* Lists implementation UIDs for MPEG4, H.263 and H.264 encoders for video +* telephony in hexadecimal separated by space +*/ +const TUint32 KVTVideoEncoderUIDs = 0x00000003; + +/** +* Lists implementation UIDs for MPEG4, H.263 and H.264 decoders for video +* telephony in hexadecimal separated by space +*/ +const TUint32 KVTVideoDecoderUIDs = 0x00000004; + +/** +* Lists implementation UIDs for AMR-NB and future audio encoders for video +* telephony (in hex, separated by space) +*/ +const TUint32 KVTAudioEncoderUIDs = 0x00000005; + +/** +* Lists implementation UIDs for AMR-NB and future audio decoders for video +* telephony (in hex, separated by space) +*/ +const TUint32 KVTAudioDecoderUIDs = 0x00000006; + +/** +* Lists processing delay for MPEG4, H.263 and H.264 encoders for video +* telephony in unsigned 32-bit integers separated by space +*/ +const TUint32 KVTVideoEncoderDelay = 0x00000007; + +/** +* Lists processing delay for MPEG4, H.263 and H.264 decoders for video +* telephony in unsigned 32-bit integers separated by space +*/ +const TUint32 KVTVideoDecoderDelay = 0x00000008; + +/** +* Lists processing delay for AMR-NB and future audio encoders for video +* telephony (in unsigned 32-bit integers, separated by space) +*/ +const TUint32 KVTAudioEncoderDelay = 0x00000009; + +/** +* Lists processing delay for AMR-NB and future audio decoders for video +* telephony (in unsigned 32-bit integers, separated by space) +*/ +const TUint32 KVTAudioDecoderDelay = 0x0000000A; + +/* +* Defines number of toolbar buttons. Three buttons is minimum +* and seven is maximum. +*/ +const TUint32 KVTToolbarCommands = 0x0000000B; + +#endif // VIDEOTELEPHONYINTERNALCRKEYS_H + +// End of file \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtapp/inc/VideoTelephonyVariant.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtapp/inc/VideoTelephonyVariant.hrh Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,60 @@ +/* +* Copyright (c) 2008 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: Bit flag definitions for VT local variation. +* +*/ + + +#ifndef VIDEOTELEPHONYVARIANT_HRH +#define VIDEOTELEPHONYVARIANT_HRH + + +/** +* KVTLVFlagScalingMethodENearest defines whether the video image is +* scaled using Nearest algorithm, which is fast, but quality is low. +* When the flag is set ENearest is used. +* @since S60 v2.8 +*/ +#define KVTLVFlagScalingMethodENearest 0x00000001 + +/** +* KVTLVFlagScalingMethodEBilinear defines whether the video image is +* scaled using Bilinear algorithm, which offers the best quality, but in a +* slow way. When the flag is set Bilinear is used. +* @since S60 v2.8 +*/ +#define KVTLVFlagScalingMethodEBilinear 0x00000002 + +/** +* KVTLVFlagEnableBitReversal defines if bit order should be +* reversed in PV. +* When the flag is set bit order is reversed. +*/ +#define KVTLVFlagEnableBitReversal 0x00000004 + +/** +* KVTLVFlagEnableAMR_WB defines if AMR wideband is supported in video calls. +* @since S60 v5.0 +*/ +#define KVTLVFlagEnableAMR_WB 0x00000008 + +/** +* KVTLVFlagSupportMpeg4 defines whether the PV should support Mepg4. +* @since S60 v5.0 +*/ +#define KVTLVFlagDisableMpeg4 0x00000010 + +#endif // VIDEOTELEPHONYVARIANT_HRH + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtapp/lcapplication.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtapp/lcapplication.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,55 @@ +/* +* Copyright (c) 2008 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: +* +*/ +//USER +#include "lcapplication.h" +#include "cvtlogger.h" + +LcHbApplication* LcHbApplication::self = 0; + +// ----------------------------------------------------------------------------- +// LcHbApplication::LcHbApplication +// ----------------------------------------------------------------------------- +// +LcHbApplication::LcHbApplication(int &argc, char *argv[]) : + HbApplication(argc, argv) +{ + __VTPRINT( DEBUG_GEN, "LcHbApplication::LcHbApplication()"); + self = this; +} + +// ----------------------------------------------------------------------------- +// LcHbApplication::~LcHbApplication +// ----------------------------------------------------------------------------- +// +LcHbApplication::~LcHbApplication() +{ + self = 0; +} + +// ----------------------------------------------------------------------------- +// LcHbApplication::quit +// ----------------------------------------------------------------------------- +// +void LcHbApplication::quit() +{ + __VTPRINT( DEBUG_GEN, "LcHbApplication::quit()"); + if (self) { + emit self->handleQuit(); + } +} + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtapp/lcapplication.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtapp/lcapplication.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,44 @@ +/* +* Copyright (c) 2008 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: +* +*/ +#ifndef LCAPPLICATION_H +#define LCAPPLICATION_H + +#include + +class LcHbApplication : public HbApplication +{ +Q_OBJECT +public: + + LcHbApplication(int &argc, char *argv[]); + ~LcHbApplication(); + +signals: + + void handleQuit(); + +public slots: + + //from QCoreApplication + static void quit(); + +private: //data + + static LcHbApplication* self; +}; + +#endif //LCAPPLICATION_H diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtapp/lcvtapp.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtapp/lcvtapp.pro Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,46 @@ +# +# Copyright (c) 2009 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: +# +# + +TEMPLATE = app +TARGET = videotelui +CONFIG += hb +TRANSLATIONS = video_telephone.ts + +INCLUDEPATH += ../../inc +# Input +HEADERS += lcapplication.h +SOURCES += lcapplication.cpp main.cpp + +symbian: { + + :BLD_INF_RULES.prj_exports += "$${LITERAL_HASH}include " + :BLD_INF_RULES.prj_exports += "./rom/videotelui.iby CORE_APP_LAYER_IBY_EXPORT_PATH(videotelui.iby)" + :BLD_INF_RULES.prj_exports += "./rom/videoteluiResources.iby LANGUAGE_APP_LAYER_IBY_EXPORT_PATH(videoteluiResources.iby)" + :BLD_INF_RULES.prj_exports += "./conf/s60videotelephony.confml APP_LAYER_CONFML(s60videotelephony.confml)" + :BLD_INF_RULES.prj_exports += "./conf/s60videotelephony_102072D0.crml APP_LAYER_CRML(s60videotelephony_102072D0.crml)" + :BLD_INF_RULES.prj_exports += "./conf/s60videotelephony_10281872.crml APP_LAYER_CRML(s60videotelephony_10281872.crml)" + :BLD_INF_RULES.prj_exports += "./inc/VideoTelephonyVariant.hrh |../../inc/videotelephonyvariant.hrh" + :BLD_INF_RULES.prj_exports += "./inc/VideoTelephonyInternalCRKeys.h |../../inc/videotelephonyinternalcrkeys.h" + :BLD_INF_RULES.prj_exports += "./data/videotelui_stub.sis /epoc32/data/z/system/install/videotelui_stub.sis" + + TARGET.UID2 = 0x100039CE + TARGET.UID3 = 0x101F8681 + TARGET.VID = 0x101FB657 + TARGET.CAPABILITY = CAP_APPLICATION NetworkControl SwEvent Location MultimediaDD CommDD + LIBS += -llivecommsui -lvtlogger -lapgrfx -lcone + RSS_RULES += "hidden = KAppIsHidden;" +} diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtapp/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtapp/main.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,73 @@ +/* +* Copyright (c) 2008 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: +* +*/ +//SYSTEM +#include +#include +#include +#include +#include + +//USER +#include "cvtlogger.h" +#include "lcapplication.h" + + +int main(int argc, char *argv[]) +{ + LcHbApplication app(argc, argv); + CVtLogger::Initialize(); // Cannot do before app creation as activescheduler is installed at that stage + __VTPRINT2(CVtLogger::ELogToFile, "videotelui.exe::main entered: argc=%d ",argc); + if (argc > 0) + { + QString arg1Str(QString::fromUtf8(argv[0])); + TPtrC arg1(arg1Str.utf16()); + CVtLogger::Print(CVtLogger::ELogToFile,arg1); + } + + //Load application-specific translator + QString lang = QLocale::system().name(); + QString path = "z:/resource/qt/translations/"; + QTranslator translator; + if ( translator.load( path + "video_telephone_" + lang + ".qm") ){ + app.installTranslator(&translator); + } else { + __VTPRINT( DEBUG_GEN, "videotelui.exe::main, couldn't load translation" ); + } + + // Temporarily set VT as system app as otherwise GOOM memory releasing will shut + // down the process when running low on graphics mem. + CApaWindowGroupName* wgName = CApaWindowGroupName::NewLC(CEikonEnv::Static()->WsSession()); + wgName->SetSystem(ETrue); // Allow only application with PowerManagement cap to shut us down + wgName->SetCaptionL(_L("Videotelephony")); + wgName->SetAppUid(TUid::Uid(0x101F8681)); + wgName->SetWindowGroupName(CEikonEnv::Static()->RootWin()); + CleanupStack::PopAndDestroy(); + + QString engineName("Videotelephony"); + QString applicationName("Video Telephone"); + + LcViewManager viewManager(engineName,applicationName); + + QObject::connect( &app, SIGNAL( handleQuit() ), + &viewManager, SLOT( terminateSession() ), + Qt::QueuedConnection ); + + int err = app.exec(); + __VTPRINT2(CVtLogger::ELogToFile, "videotelui.exe::main returns %d ",err); + CVtLogger::Uninitialize(); + return err; +} diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtapp/rom/videotelui.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtapp/rom/videotelui.iby Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2008 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: IBY file + * +*/ + + +#ifndef __VIDEOTELUI_IBY__ +#define __VIDEOTELUI_IBY__ + +REM Video Telephone application + +#ifdef __CS_VIDEO_TELEPHONY + +file=ABI_DIR\urel\videotelui.exe PROGRAMS_DIR\videotelui.exe +data=DATAZ_\private\10003a3f\import\apps\videotelui_reg.rsc \private\10003a3f\import\apps\videotelui_reg.rsc + +// Enabler for eclipsing ROM binaries +data=ZSYSTEM\install\videotelui_stub.sis system\install\videotelui_stub.sis + +#endif // __CS_VIDEO_TELEPHONY +#endif diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtapp/rom/videoteluiResources.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtapp/rom/videoteluiResources.iby Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,29 @@ +/* +* Copyright (c) 2008 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: IBY file + * +*/ + + +#ifndef __VIDEOTELUI_RESOURCES_IBY__ +#define __VIDEOTELUI_RESOURCES_IBY__ + +#include + +#ifdef __CS_VIDEO_TELEPHONY +data=DATAZ_\APP_RESOURCE_DIR\videotelui.rsc APP_RESOURCE_DIR\videotelui.rsc +data=DATAZ_\QT_TRANSLATIONS_DIR\video_telephone.qm QT_TRANSLATIONS_DIR\video_telephone.qm +#endif // __CS_VIDEO_TELEPHONY + +#endif \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/data/F0112235.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/data/F0112235.rss Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,45 @@ +/* +* ============================================================================== +* Name : F0112234.rss +* Part of : +* Description : +* Version : +* +* Copyright © 2004 Nokia Corporation. +* This material, including documentation and any related +* computer programs, is protected by copyright controlled by +* Nokia Corporation. All rights are reserved. Copying, +* including reproducing, storing, adapting or translating, any +* or all of this material requires the prior written consent of +* Nokia Corporation. This material also contains confidential +* information which may not be disclosed to others without the +* prior written consent of Nokia Corporation. +* ============================================================================== +*/ +#include "registryinfov2.rh" + +RESOURCE REGISTRY_INFO theInfo + { + resource_format_version = RESOURCE_FORMAT_VERSION_2; + // UID for the DLL + dll_uid = 0xF0112235; + // Declare array of interface info + interfaces = + { + INTERFACE_INFO + { + // UID of interface that is implemented + interface_uid = 0x20021340; + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = 0x20021342; + version_no = 1; + default_data = "Videotelephony"; + rom_only = 0; + } + }; + } + }; + } diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/data/lcvtplugin.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/data/lcvtplugin.pkg Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,16 @@ +; Languages +; +&EN + +; Header +#{"lcvtplugin patch"}, (0xF0112235), 1, 0, 0, TYPE=PU + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + +;Files +"\epoc32\release\armv5\udeb\lcvtengineplugin.dll" - "!:\sys\bin\lcvtengineplugin.dll" +"\epoc32\data\Z\Resource\Plugins\lcvtengineplugin.RSC"-"!:\resource\plugins\lcvtengineplugin.RSC" diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/data/lcvtplugin_stub.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/data/lcvtplugin_stub.pkg Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,30 @@ +; +; Copyright (c) 2009 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: +; +; Languages +&EN + +; Header +#{"lcvtplugin"}, (0xF0112235), 1, 0, 0, TYPE=SA + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + +;Files +""-"Z:\sys\bin\lcvtengineplugin.dll" +""-"Z:\resource\plugins\lcvtengineplugin.RSC" \ No newline at end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/data/lcvtplugin_stub.sis Binary file vtuis/lcvtplugin/data/lcvtplugin_stub.sis has changed diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/group/bld.inf Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,9 @@ +#include + +PRJ_EXPORTS +// Export IBY files +../rom/lcvt.iby CORE_APP_LAYER_IBY_EXPORT_PATH(lcvt.iby) +../data/lcvtplugin_stub.sis /epoc32/data/z/system/install/lcvtplugin_stub.sis + +PRJ_MMPFILES +lcvt.mmp diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/group/lcvt.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/group/lcvt.mmp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,93 @@ +/* +* ============================================================================== +* Name : lcvt.mmp +* Part of : +* Description : +* Version : +* +* Copyright © 2006 Nokia Corporation. +* This material, including documentation and any related +* computer programs, is protected by copyright controlled by +* Nokia Corporation. All rights are reserved. Copying, +* including reproducing, storing, adapting or translating, any +* or all of this material requires the prior written consent of +* Nokia Corporation. This material also contains confidential +* information which may not be disclosed to others without the +* prior written consent of Nokia Corporation. +* ============================================================================== +*/ + +#include + +// Capability assignment. +CAPABILITY CAP_GENERAL_DLL + +// Vendor ID assignment. +VENDORID VID_DEFAULT + +TARGET lcvtengineplugin.dll +TARGETTYPE PLUGIN + +EPOCALLOWDLLDATA + +UID 0x10009D8D 0xF0112235 + +USERINCLUDE ../inc/base +USERINCLUDE ../inc/common +USERINCLUDE ../inc/control +USERINCLUDE ../inc/states +APP_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE /epoc32/include/ecom +SYSTEMINCLUDE ../../../inc + + +SOURCEPATH ../src/base +SOURCE dllmain.cpp clcvtengine.cpp clcvtsession.cpp clcvtcmdexecutor.cpp clcvtactiveexec.cpp clcvtappshutter.cpp + +SOURCEPATH ../src/common +SOURCE lcvtutility.cpp tlcvtstates.cpp tlcvtaudiostate.cpp tlcvtmediastate.cpp + +SOURCEPATH ../src/control +SOURCE tlcvtcamerahandler.cpp clcvtlocalvideoplayer.cpp clcvtremotevideoplayer.cpp clcvtvideoplayerbase.cpp + +SOURCEPATH ../src/states +SOURCE tlcvtstatebase.cpp tlcvtstatestarting.cpp tlcvtstaterunning.cpp tlcvtstateresetting.cpp + + +SOURCEPATH ../data +START RESOURCE F0112235.rss +TARGET lcvtengineplugin.rsc +END + + +LIBRARY euser.lib +LIBRARY ecom.lib +LIBRARY flogger.lib +LIBRARY centralrepository.lib +LIBRARY featmgr.lib +LIBRARY ws32.lib +LIBRARY efsrv.lib +LIBRARY estor.lib +LIBRARY fbscli.lib +LIBRARY gdi.lib + +LIBRARY eikcore.lib +LIBRARY apparc.lib +LIBRARY cone.lib +LIBRARY eikcoctl.lib +LIBRARY apgrfx.lib +LIBRARY eikdlg.lib +LIBRARY bitgdi.lib +LIBRARY egul.lib + +LIBRARY aknlayout.lib +LIBRARY aknlayout2.lib +LIBRARY avkon.lib +LIBRARY aknskins.lib +LIBRARY aknnotify.lib + + +LIBRARY videoteleng.lib +DEBUGLIBRARY vtlogger.lib + +LIBRARY phoneclient.lib diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/base/clcvtactiveexec.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/base/clcvtactiveexec.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,169 @@ +/* +* Copyright (c) 2008 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: Asynchronous execution class for LC VT plugin. +* +*/ + + + +#ifndef CLCVTACTIVEEXEC_H +#define CLCVTACTIVEEXEC_H + +// INCLUDES +#include + +// FORWARD DECLARATIONS +class CLcVtActiveExec; + +// CLASS DECLARATION + +/** +* Interface for asynchronous execution. +* +* @since Series 60 2.6 +*/ +class MLcVtActiveExec + { + public: // New functions + + /** + * Starts execution of a command. + * @param aActiveExec active executor. + * @param aState state based on which execution can be started. + * @param aNextState next state. + * @param aRequest request status, which should be used if operation is + * asynchronous. + * @return ETrue if operation was synchronous, otherwise EFalse. + */ + virtual TBool ActiveExecExecuteL( + CLcVtActiveExec& aActiveExec, + const TInt aState, + TInt& aNextState, + TRequestStatus& aRequest ) = 0; + + /** + * Decide whether to continue or not. + * @param aActiveExec active executor. + * @param aState current state, should be updated to new state. + * @param aError error code. + * @return ETrue if continued, EFalse if stopped. + */ + virtual TBool ActiveExecContinue( + CLcVtActiveExec& aActiveExec, + TInt& aState, + const TInt aError ) = 0; + + /** + * Cancels operation of specific state. + * @param aActiveExec active executor. + * @param aState state. + */ + virtual void ActiveExecCancel( + CLcVtActiveExec& aActiveExec, + const TInt aState ) = 0; + + /** + * Informs that operation has been finished. + * @param aActiveExec active executor. + * @param aInitialState initial state. + */ + virtual void ActiveExecDone( + CLcVtActiveExec& aActiveExec, + const TInt aInitialState ) = 0; + + }; + +/** +* Asynchronous execution class for LC VT plugin. +* +* @since Series 60 2.6 +*/ +class CLcVtActiveExec + : public CActive + { + public: // Constructors and destructor + + /** + * Constructor. + * @param aPriority priority of the active object. + */ + CLcVtActiveExec( + const TInt aPriority ); + + /** + * Destructor. + */ + ~CLcVtActiveExec(); + + public: // New functions + + /** + * Starts execution. + * @param aStartState initial state. + * @param aExec executor. + */ + void Start( + TInt aStartState, + MLcVtActiveExec& aExec ); + + /** + * Initial state of currently + * active operation. + * + * @return initial state, or KErrNotFound if no operation ongoing. + */ + TInt InitialState() const; + + /** + * Returns request status. + * @return request status. + */ + TInt RequestStatus() const; + + protected: // Functions from base classes + + /** + * @see CActive::RunL. + */ + virtual void RunL(); + + /** + * @see CActive::DoCancel. + */ + virtual void DoCancel(); + + /** + * @see CActive::RunError. + */ + virtual TInt RunError( TInt aError ); + + private: + + // Ref to active executor. + MLcVtActiveExec* iActiveExec; + + // Initial state. + TInt iInitialState; + + // Current state. + TInt iCurrentState; + + // Next state. + TInt iNextState; + + }; + +#endif // CLCVTACTIVEEXEC_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/base/clcvtappshutter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/base/clcvtappshutter.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,175 @@ +/* +* Copyright (c) 2008 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: Class responsible for application exit. +* +*/ + + +#ifndef C_VTUIAPPSHUTTER_H +#define C_VTUIAPPSHUTTER_H + +#include + +#include +#include +#include + +class CAsyncCallBack; +class MLcVtShutterObserver; +class MLcVtStateContext; + +/** +* Shutdown service for the application. This is singleton +* which deletes itself when shutdown is complete. +* +* @since S60 v3.2 +*/ +class CLcVtAppShutter : public CBase + { +public: + + /** + * Returns the instance of application shutter. + * + * @param aComms for sending call ending related commands to Phone. + * @param aObserver observer informed when shutdown is completed. + * @return the application shutter + */ + static CLcVtAppShutter* InstanceL( + MLcVtShutterObserver& aObserver ); + + /** + * Starts shutdown. + */ + void StartShutdown(); + + /** + * Starts shutdown because emergency call was requested by the user. + * If supplied number is detected other than emergency number this method + * leaves KErrArgument. + * @param aStateContext for accessing emergency number and local + * variation. + */ + void ShutdownWithEmergencyCallL( MLcVtStateContext& aStateContext ); + + /** + * Callback from emergency caller. + */ + void EmergencyCallDoneL(); + +private: + + /** + * Exits the application if no pending shutdown preparation + * is ongoing. Deletes itself as last action. + */ + void ShutdownIfReadyAndDestroy(); + + + /** + * Enques async callback. + */ + void EnqueCallbackL( TCallBack& aCallback ); + + /** + * Asynch callback handling response to emergency call creation. + */ + static TInt EmergencyResponseCallback( TAny* aAny ); + + /** C++ constructor */ + CLcVtAppShutter( MLcVtShutterObserver& aObserver ); + + /** destructor */ + ~CLcVtAppShutter(); + +private: // for making shutdown with emergency call + class CEmergencyCaller : public CBase, private MPhCltEmergencyCallObserver + { + public: + /** + * Dials emergency call. Object destroys itself when + * response is received. + */ + static CEmergencyCaller* DialEmergencyL( + CLcVtAppShutter& aObserver, + MLcVtStateContext& aStateContext ); + + // Destructor + ~CEmergencyCaller(); + + private: // C++ constructor + + CEmergencyCaller( + CLcVtAppShutter& aObserver, + MLcVtStateContext& aStateContext ); + + /** + * 2nd phase constructor + */ + void ConstructL(); + + public: // from MPhCltEmergencyCallObserver + /** + * @see MPhCltEmergencyCallObserver::HandleEmergencyDialL + */ + virtual void HandleEmergencyDialL( const TInt aStatus ); + + private: // Data + + // Emergency number + TPhCltTelephoneNumber iNumber; + + // Phone Server session + RPhCltServer iServer; + + // Emergency call handler + CPhCltEmergencyCall* iEmergency; + + // Observer for callback + CLcVtAppShutter& iObserver; + + // State context for gettin entered numbers and local variation + MLcVtStateContext& iStateContext; + }; +private: // Data + + /** + * Guard flags for completing shutdown. + * All must be cleared before shutdown + * can be completed. + */ + enum TShutterFlags + { + /** Waiting for call on StartShutdown() */ + EShutterWaitingStart, + /** Waiting for callback on emegency call request */ + EShutterWaitingEmergencyCallback, + }; + + // Asynch callback + CAsyncCallBack* iCallback; + + // guard flags + TBitFlags8 iPendingStateFlags; + + // Observer to notify when application exit + // is allowed. + MLcVtShutterObserver& iObserver; + + // Handles emergency call dialling + CEmergencyCaller* iEmergencyCaller; + + }; + +#endif // C_VTUIAPPSHUTTER_H diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/base/clcvtcmdexecutor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/base/clcvtcmdexecutor.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,137 @@ +/* +* Copyright (c) 2008 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: Class for command execution for Video Telephone application. +* +*/ + +#ifndef CLCVTCMDEXECUTOR_H_ +#define CLCVTCMDEXECUTOR_H_ + +// INCLUDES +#include +#include + +// FORWARD DECLARATIONS +class MVtEngCommandHandler; +class MLcVtEngineCommandManager; + +// CLASS DECLARATION + +/** +* Class for command execution for Video Telephone application. +* +* @since Series 60 2.6 +*/ +class CLcVtCmdExecutor + : public CBase, + private MVtEngCommandObserver + { + public: // Constructors and destructor + + /** + * Constructor. + * + * @param aSelfPtr optional pointer to itself. + * @param aCommandHandler command handler. + * @param aCommandManager command manager. + */ + CLcVtCmdExecutor( + CLcVtCmdExecutor** aSelfPtr, + MVtEngCommandHandler& aCommandHandler, + MLcVtEngineCommandManager& aCommandManager ); + + /** + * Destructor. + */ + ~CLcVtCmdExecutor(); + + public: // New functions + + /** + * Executes command. + * @param aCommandId command identifier. + * @param aParams parameters. + * @param aRequest request status, optional. + */ + void ExecuteCmdL( + const TVtEngCommandId aCommandId, + TDesC8* aParams, + TRequestStatus* aRequest ); + + /** + * @see MVtEngCommandObserver::HandleVTCommandPerformedL. + */ + virtual void HandleVTCommandPerformedL( + TVtEngCommandId aCommand, + const TInt aError ); + + protected: // New functions + + /** + * Completes dialog with error. + * Note: this method will delete the dialog. + * @param aError error code. + */ + void Complete( const TInt aError ); + + private: + /** + * Handles execution failure. + * @param aResult error code. + */ + void HandleExecuteFailed( TInt aResult ); + + private: + + // Inner class. + class CActiveCmd; + + // Friend. + friend class CActiveCmd; + + //pointer to itself + CLcVtCmdExecutor** iSelfPtr; + + // Error code. + TInt* iError; + + // Request status. + TRequestStatus* iRequest; + + // Ref to command handler. + MVtEngCommandHandler& iCommandHandler; + + // Ref to command manager. + MLcVtEngineCommandManager& iCommandManager; + + // Command to be executed. + TVtEngCommandId iCommand; + + // Owned parameters. + HBufC8* iCommandParams; + + // ETrue if command has been completed. + TBool iCommandCompleted; + + // Owned active object to perform the command. + CActiveCmd* iActiveCmd; + + // ActiveSheduler Waiter inside CLcVtCmdExecutor + CActiveSchedulerWait iWait; + + }; + + + +#endif /* CLCVTCMDEXECUTOR_H_ */ diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/base/clcvtengine.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/base/clcvtengine.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,61 @@ +/* +* Copyright (c) 2008 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: LiveComm Videotelephony Plugin Class +* +*/ + +#ifndef CLCVTENGINE_H +#define CLCVTENGINE_H + +#include +#include + +class CLcVtSession; +class MLcSessionObserver; +class MLcUiProvider; +class MLcSession; + +class CLcVtEngine : public CLcEngine + { +public: + + /** + * Static constructor + * + * @param aParams ECom instantiation parameters + * @return An initialized instance of this class. + */ + static CLcVtEngine* NewL( TAny* aParams ); + + ~CLcVtEngine(); + +public: // From CLcEngine + + MLcSession& Session(); + + TBool IsFeatureSupported( TLcFeature aLcFeature ); + +private: + void ConstructL(); + CLcVtEngine(); + +private: + + CLcVtSession* iSession; + + }; + +#endif // CLCVTENGINE_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/base/clcvtsession.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/base/clcvtsession.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,569 @@ +/* +* ========================================================================== +* Name : lcvtsession.h +* Description : +* Version : +* +* Copyright ?2005 Nokia Corporation. +* This material, including documentation and any related +* computer programs, is protected by copyright controlled by +* Nokia Corporation. All rights are reserved. Copying, +* including reproducing, storing, adapting or translating, any +* or all of this material requires the prior written consent of +* Nokia Corporation. This material also contains confidential +* information which may not be disclosed to others without the +* prior written consent of Nokia Corporation. +* ========================================================================== +*/ + +#ifndef LCVTSESSION_H +#define LCVTSESSION_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + + +#include "tlcvtcamerahandler.h" +#include "clcvtactiveexec.h" +#include "tlcvtstatebase.h" + +#define NGA_VIDEO_RENDER + +class CVtEngModel; +class CLcVtLocalVideoPlayer; +class CLcVtRemoteVideoPlayer; +class TLcVtStates; +class CLcVtCmdExecutor; + + +class CLcVtSession : public CBase, + public MLcSession, + public MLcAudioControl, + public MLcVtActiveExec, + public MLcVtStateContext + { +public: + + static CLcVtSession* NewL(); + + ~CLcVtSession(); + +public: // From MLcSession + + TLcSessionState LcSessionState() const; + + void EstablishLcSessionL(); + + void TerminateLcSessionL(); + + void SetLcSessionObserver( MLcSessionObserver* aObserver ); + + void SetLcUiProvider( MLcUiProvider* aUiProvider ); + + TBool IsBackgroundStartup(); + + MLcVideoPlayer* RemoteVideoPlayer(); + + MLcVideoPlayer* LocalVideoPlayer(); + + const TDesC& LocalDisplayName(); + + const TDesC& RemoteDisplayName(); + + TInt SetParameter( TInt aId, TInt aValue ); + + TInt ParameterValue( TInt aId ); + + TInt SetForegroundStatus( TBool aIsForeground ); + + const TDesC& RemoteDetails(); + + void UpdateLcSessionL(); + + TBool SendDialTone( TChar aKey ); + +public: // from MLcAudioControl + + TBool IsLcAudioMutedL(); + + void MuteLcAudioL( TBool aMute ); + + TBool IsLcMicMutedL(); + + void MuteLcMicL( TBool aMute ); + + TBool IsEnablingLcLoudspeakerAllowed(); + + void EnableLcLoudspeakerL( TBool aEnabled ); + + TBool IsLcLoudspeakerEnabled(); + + TInt LcVolumeL(); + + void SetLcVolumeL( TInt aValue ); + + void IncreaseLcVolumeL(); + + void DecreaseLcVolumeL(); + +public: //from MLcVtActiveExec + /** + * @see MLcVtActiveExec::ActiveExecExecuteL. + */ + TBool ActiveExecExecuteL( + CLcVtActiveExec& aActiveExec, + const TInt aState, + TInt& aNextState, + TRequestStatus& aRequest ); + + /** + * @see MLcVtActiveExec::ActiveExecContinue. + */ + TBool ActiveExecContinue( + CLcVtActiveExec& aActiveExec, + TInt& aState, + const TInt aError ); + + /** + * @see MLcVtActiveExec::ActiveExecCancel. + */ + void ActiveExecCancel( + CLcVtActiveExec& aActiveExec, + const TInt aState ); + + /** + * @see MLcVtActiveExec::ActiveExecDone. + */ + virtual void ActiveExecDone( + CLcVtActiveExec& aActiveExec, + const TInt aInitialState ); + +public: //new function + /** + * @see MLcVtActiveExec::ActiveExecExecuteL. + */ + TBool ActiveExecInitExecuteL( + const TInt aState, + TInt& aNextState, + TRequestStatus& aRequest ); + + /** + * @see MLcVtActiveExec::ActiveExecContinue. + */ + TBool ActiveExecInitContinue( + TInt& aState, + const TInt aError ); + + /** + * @see MLcVtActiveExec::ActiveExecCancel. + */ + void ActiveExecInitCancel( + const TInt aState ); + + /** + * @see MLcVtActiveExec::ActiveExecDone. + */ + void ActiveExecInitDone( + const TInt aInitialState ); + + /** + * Executes command taking no parameters. + * @param aCommand command to be performed. + * @param aRequest request status. + */ + void ActiveExecInitExecuteCommandL( + const TVtEngCommandId aCommand, + TRequestStatus& aRequest ); + + /** + * Executes command taking no parameters. + * @param aCommand command to be performed. + * @param aParam command parameters. + * @param aRequest request status. + */ + template < class T > + void ActiveExecInitExecuteCommandL( + const TVtEngCommandId aCommand, + T& aParam, + TRequestStatus& aRequest ); + + /** + * Executes prepare viewfinder command. + * @param aRequest request status to be completed when finished. + */ + void ActiveExecInitPrepareViewFinderL( + TRequestStatus& aRequest ); + + /** + * Executes prepare remote render command. + * @param aRequest request status to be completed when finished. + */ + void ActiveExecInitPrepareRemoteRenderL( + TRequestStatus& aRequest ); + + /** + * Executes 'prepare camera' command. + * @param aSource source to be prepared. + * @param aRequest request status. + */ + void ActiveExecInitPrepareCameraL( + const MVtEngMedia::TMediaSource aSource, + TRequestStatus& aRequest ); + + /** + * Executes 'set source' command. + * @param aSource source to be selected. + * @param aRequest request status. + */ + void ActiveExecInitSetSourceL( + const MVtEngMedia::TMediaSource aSource, + TRequestStatus& aRequest ); + + /** + * Performs a command without any parameters. + * @param aCommand command to be performed. + */ + void ExecuteCmdL( const TVtEngCommandId aCommand ); + + /** + * Performs a command with a parameter. + * @param aCommmand command to be performed. + * @param aParam parameter. + */ + template< class T > + void ExecuteCmdL( + const TVtEngCommandId aCommand, + T& aParam ); + + // ASYNCHRONOUS EXECUTION: + + /** + * Performs a command without any parameters. + * @param aExecutorPtr pointer to which returned value is stored. + * @param aCommand command to be performed. + * @param aStatus request status. + * @return dialog. + */ + CLcVtCmdExecutor* ExecuteCmdAsyncL( + CLcVtCmdExecutor** aExecutorPtr, + const TVtEngCommandId aCommand, + TRequestStatus& aStatus ); + + /** + * Performs a command with a parameter. + * @param aExecutorPtr pointer to which returned value is stored. + * @param aCommmand command to be performed. + * @param aParam parameter. + * @param aStatus request status. + * @return dialog. + */ + template< class T > + CLcVtCmdExecutor* ExecuteCmdAsyncL( + CLcVtCmdExecutor** aExecutorPtr, + const TVtEngCommandId aCommand, + T& aParam, + TRequestStatus& aStatus ); + + /** + * Performs a command. + * @param aExecutorPtr pointer to which returned value is stored. + * @param aCommand command. + * @param aParams parameter, optional. + * @param aStatus request status. + * @return dialog. + */ + CLcVtCmdExecutor* DoExecuteCmdAsyncL( + CLcVtCmdExecutor** aExecutorPtr, + const TVtEngCommandId aCommand, + TDesC8* aParams, + TRequestStatus& aStatus ); + + /** + * Executes command in TRAP harnness. + * @param aCommand command identifier. + * @param aParam optional, parameters. + * @return error code. + */ + TInt Execute( const TVtEngCommandId aCommand, TDesC8* aParam ); + + /** + * Handles layout changes basically calling HandleLayoutChangedL + * in trap harness. + * @return error code. + */ + //TInt HandleLayoutChanged(); + + /** + * Handles layout changes. + */ + void HandleLayoutChangedL(); + +public: //from MLcVtStateContext + + /** @see MLcVtStateContext::StartupPhase1L */ + void StartupPhase1L(); + + /** @see MLcVtStateContext::ShutdownL */ + void ShutdownL(); + + /** @see MLcVtStateContext::StartupPhase2L */ + void StartupPhase2L(); + + /** @see MLcVtStateContext::ChangeApplicationFocus */ + void ChangeApplicationFocus( const TBool aForeground ); + + /** @see MLcVtStateContext::ChangeState */ + void ChangeState( TLcVtStateBase* aState ); + + /** @see MLcVtStateContext::StartTone */ + //void StartDtmfTone( const TChar& aTone ); + + /** @see MLcVtStateContext::StopTone */ + //void StopDtmfTone(); + + /** @see MLcVtStateContext::Model */ + CVtEngModel& Model(); + + /** @see MLcVtStateContext::NumberSource*/ + TDesC* NumberSource() const; + + /** @see MLcVtStateContext::RefreshL */ + void RefreshL( const TInt aRefreshFlags ); + + /** @see MLcVtStateContext::RefreshStatesL */ + void RefreshStatesL(); + + /** @see MLcVtStateContext::DoExecuteCmdL */ + void DoExecuteCmdL( + const TVtEngCommandId aCommand, + TDesC8* aParams ); + + /** @see MLcVtStateContext::DoHandleLayoutChangedL */ + void DoHandleLayoutChangedL(); + + /** From MLcVtShutterObserver via MLcVtStateContext + * Exits the application. + */ + void HandleShutdownReady(); + + /** @see MLcVtStateContext::SetCallIdL */ + void SetCallIdL( const TInt aCallId ); + + /** @see MLcVtStateContext::SetCallNameL */ + TBool SetCallNameL( const TDesC& aName ); + + /** @see MLcVtStateContext::SetCallNumberL */ + void SetCallNumberL( const TDesC& aNumber ); + + /** @see MLcVtStateContext::StartShutdown */ + void StartShutdown(); + +public: //new functions + + /** + * Static async callback for handling layout change. + */ + //static TInt DelayedHandleLayoutChanged( TAny* aPtr ); + + /** + * Callback function to exit. + * @param aAny pointer to instance of this class. + * @return KErrNone always. + */ + static TInt DoExit( TAny* aAny ); + + /** + * Close UI Application. + */ + void CloseApp(); + + /** + * Handles engine reset. + */ + void HandleEngineResetL(); + + /** + * Handle plugin command. + */ + void HandleCommandL(const TInt acommand); + + /** + * Sets given zoom step, if it allowed. + * @param aZoomStep New zoom step to be set. + */ + void SetZoomFactorL( TInt aZoomStep ); + + /** + * Updates rendering parameters. + */ + void UpdateRenderingParametersL(); + + inline TLcVtStates& LcVtStates(); + +#ifndef NGA_VIDEO_RENDER + void vtHandleFrameL( CFbsBitmap* aBitmap ); +#endif + TBool IsFeatureSupported( CLcEngine::TLcFeature aLcFeature ); + + +private: + CLcVtSession(); + + void ConstructL(); + +#ifndef NGA_VIDEO_RENDER + /** + * connect to font & bitmap server. + */ + void ConnectFbsServerL(); + + /** + * disconnect from font & bitmap server. + */ + void DisconnectFbsServer(); +#endif + + // COMMAND HANDLING + + /** + * Enables audio (unmute microphone). + */ + void CmdEnableAudioL(); + + /** + * Disables audio (mute microphone). + */ + void CmdDisableAudioL(); + + /** + * Switches used camera. + * @param aPrimaryCamera ETrue if primary camera is to be selected, + * EFalse if secondary camera is to be selected. + */ + void CmdUseCameraL( const TBool aPrimaryCamera ); + + /** + * Activates loudspeaker. + */ + void CmdActivateLoudspeakerL(); + + /** + * Deactivates loudspeaker. + */ + void CmdDeactivateLoudspeakerL(); + + /** + * Enables video. + */ + void CmdEnableVideoL(); + + /** + * Disables video. + */ + void CmdDisableVideoL(); + +#ifdef NGA_VIDEO_RENDER + void CreateVideoWindowsL(); + void DestroyVideoWindows(); +#endif + +private: + class CEventObserver; + +private: +#ifdef NGA_VIDEO_RENDER + RWindow* iRemoteVideoWindow; + RWindow* iLocalVideoWindow; +#else + CFbsBitmap* iDummy; + CWindowGc* iGc; + TBool iFbsStarted; + RWsSession* iWsSession; + CWsScreenDevice* iWsSessionScreenDev; + RWindowGroup *iRootWin; +#endif + // Owned event observer. + CEventObserver* iEventObserver; + // Engine model. + CVtEngModel* iModel; + // plugin states (media, audio, boolean variables) + TLcVtStates* iLcVtStates; + + TVtCameraHandler iCameraHandler; + CLcVtLocalVideoPlayer* iLocalVideoPlayer; + CLcVtRemoteVideoPlayer* iRemoteVideoPlayer; + + MLcSessionObserver* iObserver; + MLcUiProvider* iUiProvider; + + TLcSessionState iSessionState; + + // Owned active executor for initialisation / uninitialisation. + CLcVtActiveExec* iActiveExec; + + CLcVtCmdExecutor* iCmdExecutor; + + // Reference to request status. + TRequestStatus* iShutdownRequest; + + TLcVtStateBase* iState; + + // ASync callback. + CAsyncCallBack* iAsyncCallback; + + // Async callback for layout change + //CAsyncCallBack* iLayoutChangeCallback; + + // DTMF tone, used as parameter to KVtEngStartDtmfTone. + TPckgBuf< TChar > iDtmfTone; + + TBool iLoudspeakerEnabled; + TBool iMute; + + RWindow* iMainWindow; + + RWsSession iRwSession; + RWindowGroup* iRwGroup; + CWsScreenDevice* iDev; + + HBufC* iRemoteDisplayName; + HBufC* iRemoteDetails; + + }; + + +TLcVtStates& CLcVtSession::LcVtStates() + { + return *iLcVtStates; + } +#endif // LCVTSESSION_H + +// end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/base/lcvtplugincommand.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/base/lcvtplugincommand.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,48 @@ +/* +* Copyright (c) 2008 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: Plguin command +* +*/ + +#ifndef LCVTPLUGINCOMMAND_H_ +#define LCVTPLUGINCOMMAND_H_ + +enum + { + // End active call + EPluginCmdEndActiveCall = 5000, + // Switch to voice call + EPluginCmdCreateVoice, + // Create a emergency call + EPluginCmdDialEmergency, + // Enable video + EPluginCmdEnableVideo, + // Enable audio + EPluginCmdEnableAudio, + // Disable video + EPluginCmdDisableVideo, + // Disable audio + EPluginCmdDisableAudio, + // Use primary camera + EPluginCmdUsePrimaryCamera, + // Use secondary camera + EPluginCmdUseSecondaryCamera, + // Active Loudspeaker + EPluginCmdActivateLoudspeaker, + // Deactive Loudspeaker + EPluginCmdDeactivateLoudspeaker + }; + + +#endif /* LCVTPLUGINCOMMAND_H_ */ diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/base/mlcvtenginecommandmanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/base/mlcvtenginecommandmanager.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,43 @@ +/* + * mlcvtenginecommandmanager.h + * + * Created on: Jun 29, 2009 + * Author: z51wang + */ + +#ifndef M_LCVTENGINECOMMANDMANAGER_H +#define M_LCVTENGINECOMMANDMANAGER_H + +// INCLUDES +#include + +// FORWARD DECLARATIONS +class MVtEngCommandObserver; + +// CLASS DECLARATION + +/** +* Command manager class for Video Telephone application. +* +* @since Series 60 2.6 +*/ +class MLcVtEngineCommandManager + { + public: // New functions + + /** + * Adds observer. + * @param aObserver observer to be added. + */ + virtual void AddObserverL( MVtEngCommandObserver& aObserver ) = 0; + + /** + * Removes observer. + * @param aObserver observer to be removed. + */ + virtual void RemoveObserver( MVtEngCommandObserver& aObserver ) = 0; + + }; + + +#endif /* M_LCVTENGINECOMMANDMANAGER_H */ diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/base/mlcvtshutterobserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/base/mlcvtshutterobserver.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,38 @@ +/* +* Copyright (c) 2008 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: Interface for reporting application shutdown readiness. +* +*/ + + +#ifndef M_MLCVTSHUTTEROBSERVER_H +#define M_MLCVTSHUTTEROBSERVER_H + + +/** +* Observer interface for reporting shutdown readiness. +* +* @since S60 v3.2 +*/ +class MLcVtShutterObserver + { +public: + + /** + * Called when application can exit. + */ + virtual void HandleShutdownReady() = 0; + }; + +#endif // M_MLCVTSHUTTEROBSERVER_H diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/base/mlcvtstatecontext.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/base/mlcvtstatecontext.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,158 @@ +/* +* Copyright (c) 2008 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: Interface for state objects to request application services. +* +*/ + + +#ifndef M_MLCVTSTATECONTEXT_H +#define M_MLCVTSTATECONTEXT_H + +#include +#include +#include "mlcvtshutterobserver.h" + +class TLcVtStateBase; +class CVtEngModel; + +/** +* Provides service interface for vt plugin state objects. +* +* @since S60 v3.2 +*/ +class MLcVtStateContext : public MLcVtShutterObserver + { + public: + + /** + * Starts first phase of startup when prepare is received. + */ + virtual void StartupPhase1L() = 0; + + /** + * Starts application shutdown. + */ + virtual void ShutdownL() = 0; + + /** + * Starts second phase of startup. + */ + virtual void StartupPhase2L() = 0; + + /** + * Sets application to foreground and background. + * @param aForeground ETrue => foreground, EFalse => background + */ + virtual void ChangeApplicationFocus( const TBool aForeground ) = 0; + + /** + * Changes current application state. + * @param aState new state + */ + virtual void ChangeState( TLcVtStateBase* aState ) = 0; + + /** + * Starts DTMF tone. + * @param aTone DTMF tone. + */ + //virtual void StartDtmfTone( const TChar& aTone ) = 0; + + /** + * Stops tarts DTMF tone. + */ + //virtual void StopDtmfTone() = 0; + + /** + * Returns model. + * @return model + */ + virtual CVtEngModel& Model() = 0; + + /** + * Returns source containing numbers typed by the user. + * @return number soure + */ + virtual TDesC* NumberSource() const = 0; + + /** + * Executes engine command. + * @param aCommand command id + * @param aParams command params + */ + virtual void DoExecuteCmdL( const TVtEngCommandId aCommand, + TDesC8* aParams ) = 0; + + /** + * Refreshes application UI. + * @param aRefreshFlags identifies what to refresh + */ + virtual void RefreshL( const TInt aRefreshFlags ) = 0; + + /** + * Updates engine states. + */ + virtual void RefreshStatesL() = 0; + + /** + * Handles layout change. + */ + //virtual void DoHandleLayoutChangedL() = 0; + + /** + * Sets call id. + */ + virtual void SetCallIdL( const TInt aCallId ) = 0; + + /** + * Sets display text of remote end. + */ + virtual TBool SetCallNameL( const TDesC& aName ) = 0; + + /** + * Sets call number text of remote end. + */ + virtual void SetCallNumberL( const TDesC& aNumber ) = 0; + + /** + * Start shutdown process + */ + virtual void StartShutdown() = 0; + + + /** + * Refresh flags + */ + enum TRefreshFlags + { + /** Navipane is refreshed */ + ENaviPane = 0x01, + /** Softkeys are refreshed */ + ESoftkeys = 0x02, + /** Refreshes blind (video availability) status */ + EBlind = 0x04, + /** Refreshes state sync with call handling */ + ESynchronise = 0x08, + /** Refreshes internal states (media etc) */ + EUiStates = 0x10, + /** Refreshes everything */ + EAll = ENaviPane | + ESoftkeys | + EBlind | + ESynchronise | + EUiStates + }; + }; + + +#endif // M_MLCVTSTATECONTEXT_H diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/common/lcvtutility.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/common/lcvtutility.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,166 @@ +/* +* Copyright (c) 2008 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: Utility methods for Video Telephone application. +* +*/ + + + +#ifndef LCVTUTILITY_H +#define LCVTUTILITY_H + +// INCLUDES +#include +#include +#include +#include + +// FORWARD DECLARATIONS + +// CLASS DECLARATION + +/** +* Utility methods for Video Telephone application. +* +* @since Series 60 2.6 +*/ +class LcVtUtility + { + public: // New functions + + /** + * Enumerates audio routing masks. + */ + enum TAudioRoutingMask + { + // Deactivate loudspeaker. + EDeactivateLoudspeaker = (1<<0), + // Activate loudspeaker. + EActivateLoudspeaker = (1<<1), + // Deactivate BT handsfree. + EDeactivateBtHandsfree = (1<<2), + // Activate BT handsfree. + EActivateBtHandsfree = (1<<3) + }; + + /** + * Gets audio routing availabilities. + * @param aAudio audio instance. + * @param aAvailable availability bitmap. + */ + static void GetAudioRoutingAvailability( + MVtEngAudio& aAudio, + TInt& aAvailable ); + + /** + * Gets outgoing media state. + * @param aMedia media instance. + * @param aAvailable availability bitmap. + */ + static void GetOutgoingMediaState( + MVtEngMedia& aMedia, + TInt& aAvailable ); + + /** + * Gets incoming media state. + * @param aMedia media instance. + * @param aAvailable availability bitmap. + */ + static void GetIncomingMediaState( + MVtEngMedia& aMedia, + TInt& aAvailable ); + + /** + * Checks if media has still image. + * @param aMedia media instance. + * @return ETrue if media has still image. + */ + static TBool HasStillImage( + MVtEngMedia& aMedia ); + + /** + * Gets freeze's current status. + * @param aMedia media instance. + * @return ETrue if active provider is frozen, EFalse otherwise. + */ + static TBool GetFreezeState( + MVtEngMedia& aMedia ); + + /** + * Checks if freeze is supported. + * @param aMedia media instance. + * @return ETrue if freeze is supported. + */ + static TBool IsFreezeSupported( + MVtEngMedia& aMedia ); + + /** + * Gets current local video quality setting. + * @param aMedia media instance. + * @param aVideoQuality Current local video quality settings. + */ + static void GetVideoQuality( + MVtEngMedia& aMedia, + MVtEngMedia::TVideoQuality& aVideoQuality ); + /** + * Gets current object sharing state. + * @param aMedia media instance. + * @param aShareObjectState contains current object sharing state on + * return. + */ + static void GetObjectSharingState( MVtEngMedia& aMedia, + MVtEngMedia::TShareObjectState& aShareObjectState ); + + /** + * Checks if zooming is allowed. + * @param aMedia media instance. + * @return ETrue if allowed, EFalse otherwise. + */ + static TBool IsZoomAllowed( + MVtEngMedia& aMedia ); + + /** + * Checks if the device has cameras currently attached. + * @param aMedia media instance. + * @return ETrue if there are cameras available. + */ + static TBool HasCameras( MVtEngMedia& aMedia ); + + /** + * Checks if the character is DTMF enabled. + * @param aChar The character. + * @return ETrue if this character is DTMF character. + */ + static TBool IsDTMFCharacter( const TChar aChar ); + + private: + + /** + * Checks if audio routing is available. + * @param aAudio audio instance. + * @param aCurrent current speaker. + * @param aSource source speaker. + * @param aTarget target speaker. + */ + static TBool IsAudioRoutingAvailable( + MVtEngAudio& aAudio, + const MVtEngAudio::TAudioRoutingState aCurrent, + const MVtEngAudio::TAudioRoutingState aSource, + const MVtEngAudio::TAudioRoutingState aTarget ); + + }; + +#endif // LCVTUTILITY_H + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/common/tlcvtaudiostate.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/common/tlcvtaudiostate.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,121 @@ +/* +* Copyright (c) 2008 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: Audio state class definition. +* +*/ + + +#ifndef T_LCVTAUDIOSTATE_H +#define T_LCVTAUDIOSTATE_H + +#include + +#include "tlcvtflagcontainer.h" + +class CVtEngModel; + +/** + * TLcVtAudioState + * + * Contains status information about video telephony audio. + * + * @since S60 v3.2 + */ +NONSHARABLE_CLASS( TLcVtAudioState ) : public TLcVtUpdateableFlagContainer + { +public: + + /** + * Constructor + * + * @param aModel Reference to VT engine model. + */ + inline TLcVtAudioState( CVtEngModel& aModel ); + + /** + * Return whether audio is enabled or not. + * + * @return ETrue if audio is enabled EFalse otherwise. + */ + inline TBool IsAudio() const; + + /** + * Return whether BT handsfree can be activated or not. + * + * @return ETrue if BT handsfree can be activated EFalse otherwise. + */ + inline TBool CanActivateBtHf() const; + + /** + * Return whether BT handsfree can be deactivated or not. + * + * @return ETrue if BT handsfree can be deactivated EFalse otherwise. + */ + inline TBool CanDeactivateBtHf() const; + + /** + * Return whether loudspeaker can be activated or not. + * + * @return ETrue if loudpseaker can be activated EFalse otherwise. + */ + inline TBool CanActivateLoudspeaker() const; + + /** + * Return whether loudspeaker can be deactivated or not. + * + * @return ETrue if loudspeaker can be deactivated EFalse otherwise. + */ + inline TBool CanDeactivateLoudspeaker() const; + + /** + * Return whether or not audio is permanently stopped. + * + * @return ETrue if audio is permanently stopped. + */ + inline TBool IsAudioPermanentlyStopped() const; + +private: // from TVtUpdateableFlagContainer + + /** + * @see TVtUpdateableFlagContainer::UpdateFlags + */ + void UpdateFlags(); + +private: + + // Enumeration for audio state flags. + enum TFlags + { + /** Is set if audio is currently enabled. */ + EIsAudio = ( 1<<0 ), + /** Is set if BT handsfree can be activated. */ + ECanActivateBtHf = ( 1<<1 ), + /** Is set if BT handsfree can be deactivated. */ + ECanDeactivateBtHf = ( 1<<2 ), + /** Is set if loudspeaker can be activated. */ + ECanActivateLoudspeaker = ( 1<<3 ), + /** Is set if loudspeaker can be deactivated. */ + ECanDeactivateLoudspeaker = ( 1<<4 ), + /** Set if audio is permanently stopped */ + EIsAudioPermanentlyStopped = ( 1<<5 ) + }; + + // Reference to engine model instance + CVtEngModel& iModel; + + }; + +#include "tlcvtaudiostate.inl" + +#endif // T_LCVTAUDIOSTATE_H diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/common/tlcvtaudiostate.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/common/tlcvtaudiostate.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,80 @@ +/* +* Copyright (c) 2008 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: Audio state class inline methods. +* +*/ + + +// ----------------------------------------------------------------------------- +// TLcVtAudioState::TLcVtAudioState +// ----------------------------------------------------------------------------- +// +TLcVtAudioState::TLcVtAudioState( CVtEngModel& aModel ) +: iModel( aModel ) + { + } + +// ----------------------------------------------------------------------------- +// TLcVtAudioState::IsAudio +// ----------------------------------------------------------------------------- +// +TBool TLcVtAudioState::IsAudio() const + { + return IsFlag( EIsAudio ); + } + +// ----------------------------------------------------------------------------- +// TLcVtAudioState::CanActivateBtHf +// ----------------------------------------------------------------------------- +// +TBool TLcVtAudioState::CanActivateBtHf() const + { + return IsFlag( ECanActivateBtHf ); + } + +// ----------------------------------------------------------------------------- +// TLcVtAudioState::CanDeactivateBtHf +// ----------------------------------------------------------------------------- +// +TBool TLcVtAudioState::CanDeactivateBtHf() const + { + return IsFlag( ECanDeactivateBtHf ); + } + +// ----------------------------------------------------------------------------- +// TLcVtAudioState::CanActivateLoudspeaker +// ----------------------------------------------------------------------------- +// +TBool TLcVtAudioState::CanActivateLoudspeaker() const + { + return IsFlag( ECanActivateLoudspeaker ); + } + +// ----------------------------------------------------------------------------- +// TLcVtAudioState::CanDeactivateLoudspeaker +// ----------------------------------------------------------------------------- +// +TBool TLcVtAudioState::CanDeactivateLoudspeaker() const + { + return IsFlag( ECanDeactivateLoudspeaker ); + } + +// ----------------------------------------------------------------------------- +// TLcVtAudioState::IsAudioPermanentlyStopped +// ----------------------------------------------------------------------------- +// +TBool TLcVtAudioState::IsAudioPermanentlyStopped() const + { + return IsFlag( EIsAudioPermanentlyStopped ); + } diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/common/tlcvtflagcontainer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/common/tlcvtflagcontainer.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,108 @@ +/* +* Copyright (c) 2008 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: Flag container class definition. +* +*/ + + +#ifndef T_LCVTFLAGCONTAINER_H +#define T_LCVTFLAGCONTAINER_H + +#include + +/** + * TLcVtFlagContainer + * + * Flag container is a class that holds maximum of 32 different flags. Also + * contains methods for setting, clearing and getting the flag state. + * + * @since S60 v3.2 + */ +NONSHARABLE_CLASS( TLcVtFlagContainer ) + { +public: + + /** + * Constructor. + */ + inline TLcVtFlagContainer(); + +protected: + + /** + * Clears all flags. + */ + inline void Clear(); + + /** + * Tests flag. + */ + inline TBool IsFlag( TUint32 aFlags ) const; + + /** + * Sets flag(s). + */ + inline void SetFlag( TUint32 aFlags ); + + /** + * Clears flag(s). + */ + inline void ClearFlag( TUint32 aFlags ); + + /** + * Gets flag value. + */ + inline TUint32 Value() const; + + /** + * Sets flag value. + */ + inline void SetValue( TUint32 aValue ); + +private: + + // Current flags + TUint32 iFlags; + + }; + +/** + * TLcVtUpdateableFlagContainer + * + * A flag container with Update() method that can be called to get + * flags updated in one pass. + * + * @since S60 v3.2 + */ +NONSHARABLE_CLASS( TLcVtUpdateableFlagContainer ) : public TLcVtFlagContainer + { +public: + + /** + * Issues flag updation. + */ + inline void Update(); + +private: + + /** + * Called when flags needs to be updated (as a result to call Update()). + */ + virtual void UpdateFlags() = 0; + + }; + +#include "tlcvtflagcontainer.inl" + +#endif // T_LCVTFLAGCONTAINER_H diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/common/tlcvtflagcontainer.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/common/tlcvtflagcontainer.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,90 @@ +/* +* Copyright (c) 2008 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: Flag container class inline methods. +* +*/ + + +// ----------------------------------------------------------------------------- +// TLcVtFlagContainer::TLcVtFlagContainer +// ----------------------------------------------------------------------------- +// +TLcVtFlagContainer::TLcVtFlagContainer() + { + Clear(); + } + +// ----------------------------------------------------------------------------- +// TLcVtFlagContainer::Clear +// ----------------------------------------------------------------------------- +// +void TLcVtFlagContainer::Clear() + { + iFlags = 0; + } + +// ----------------------------------------------------------------------------- +// TLcVtFlagContainer::IsFlag +// ----------------------------------------------------------------------------- +// +TBool TLcVtFlagContainer::IsFlag( TUint32 aFlags ) const + { + return ( iFlags & aFlags ); + } + +// ----------------------------------------------------------------------------- +// TLcVtFlagContainer::SetFlag +// ----------------------------------------------------------------------------- +// +void TLcVtFlagContainer::SetFlag( TUint32 aFlags ) + { + iFlags |= aFlags; + } + +// ----------------------------------------------------------------------------- +// TLcVtFlagContainer::ClearFlag +// ----------------------------------------------------------------------------- +// +void TLcVtFlagContainer::ClearFlag( TUint32 aFlags ) + { + iFlags &= ~aFlags; + } + +// ----------------------------------------------------------------------------- +// TLcVtFlagContainer::Value +// ----------------------------------------------------------------------------- +// +TUint32 TLcVtFlagContainer::Value() const + { + return iFlags; + } + +// ----------------------------------------------------------------------------- +// TLcVtFlagContainer::SetValue +// ----------------------------------------------------------------------------- +// +void TLcVtFlagContainer::SetValue( TUint32 aValue ) + { + iFlags = aValue; + } + +// ----------------------------------------------------------------------------- +// TLcVtUpdateableFlagContainer::Update +// ----------------------------------------------------------------------------- +// +void TLcVtUpdateableFlagContainer::Update() + { + Clear(); + UpdateFlags(); + } diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/common/tlcvtmediastate.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/common/tlcvtmediastate.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,216 @@ +/* +* Copyright (c) 2008 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: Media state class definition. +* +*/ + + +#ifndef T_LCVTMEDIASTATE_H +#define T_LCVTMEDIASTATE_H + +#include + +#include "tlcvtflagcontainer.h" + +class MVtEngMedia; +class MVtEngCommandHandler; + +/** + * TLcVtMediaState + * + * Contains information about media's (video) current status. + * + * @since S60 v3.2 + */ +NONSHARABLE_CLASS( TLcVtMediaState ) : public TLcVtUpdateableFlagContainer + { +public: + + /** + * Constructor. + * + * @param aMedia Reference to VT engine media object. + * @param aCommandHandler Reference to command handler object. + */ + inline TLcVtMediaState( MVtEngMedia& aMedia, + MVtEngCommandHandler& aCommandHandler ); + + /** + * Return whether or not video is being sent. + * + * @return ETrue if video is being sent. + */ + inline TBool IsVideo() const; + + /** + * Return whether or not any camera is available in device. + * + * @return ETrue if any camera is available in device. + */ + inline TBool HasCamera() const; + + /** + * Return whether or not freeze is supported for active video source. + * + * @return ETrue if freeze is supported for active video source. + */ + inline TBool IsFreezeSupported() const; + + /** + * Return whether or not active video source is frozen. + * + * @return ETrue if video is frozen. + */ + inline TBool IsFrozen() const; + + /** + * Return whether or not share is active. + * + * @return ETrue if still image is being shared. + */ + inline TBool IsSharing() const; + + /** + * Return whether or not sharing is being initialized. + * + * @return ETrue if still image sharing is being initialized. + */ + inline TBool IsInitializingShare() const; + + /** + * Return whether or not primary camera is being used by VT. + * + * @return ETrue if primary camera is being used. + */ + inline TBool IsPrimaryCameraInUse() const; + + /** + * Return whether or not secondary camera is being used by VT. + * + * @return ETrue if secondary camera is being used. + */ + inline TBool IsSecondaryCameraInUse() const; + + /** + * Return whether or not it is possible to share. + * + * @return ETrue if sharing is not allowed. + */ + inline TBool IsNotAbleToShare() const; + + /** + * Return whether or not device has primary camera. + * + * @return ETrue if primary camera is available. + */ + inline TBool HasPrimaryCamera() const; + + /** + * Return whether or not device has secondary camera. + * + * @return ETrue if secondary camera is available. + */ + inline TBool HasSecondaryCamera() const; + + /** + * Return whether or not active video source supports contrast setting. + * + * @return ETrue if contrast settingis allowed. + */ + inline TBool IsContrastSupported() const; + + /** + * Return whether or not active video source supports white balance setting. + * + * @return ETrue if white balance setting is allowed. + */ + inline TBool IsWhiteBalanceSupported() const; + + /** + * Return whether or not active video source supports color tone setting. + * + * @return ETrue if colour tone setting is allowed. + */ + inline TBool IsColorToneSupported() const; + + /** + * Return whether or not active video source supports brightness setting. + * + * @return ETrue if brightness setting is allowed. + */ + inline TBool IsBrightnessSupported() const; + + /** + * Return whether or not video is permanently stopped. + * + * @return ETrue if video is permanently stopped. + */ + inline TBool IsVideoPermanentlyStopped() const; + +private: // from TVtUpdateableFlagContainer + + /** + * @see TVtUpdateableFlagContainer::UpdateFlags + */ + void UpdateFlags(); + +private: + + // Enumeration for media state flags. + enum TFlags + { + /** Set if video is currently enabled. */ + EIsVideo = ( 1<<0 ), + /** Set if device has any cameras */ + EHasCamera = ( 1<<1 ), + /** Set if current active video source supports freezing */ + EIsFreezeSupported = ( 1<<2 ), + /** Set if current active video source is frozen */ + EIsFrozen = ( 1<<3 ), + /** Set if sharing is active */ + EIsSharing = ( 1<<4 ), + /** Set if sharing is being initialized */ + EIsInitializingShare = ( 1<<5 ), + /** Set if device's primary camera is being used by VT application */ + EIsPrimaryCameraInUse = ( 1<<6 ), + /** Set if device's secondary camera is being used by VT application */ + EIsSecondaryCameraInUse = ( 1<<7 ), + /** Set if it is not possible to share */ + EIsNotAbleToShare = ( 1<<8 ), + /** Set if device has primary camera */ + EHasPrimaryCamera = ( 1<<9 ), + /** Set if device has secondary camera */ + EHasSecondaryCamera = ( 1<<10 ), + /** Set if current video source supports contrast setting */ + EIsContrastSupported = ( 1<<11 ), + /** Set if current video source supports white balance setting */ + EIsWhiteBalanceSupported = ( 1<<12 ), + /** Set if current video source supports color tone setting */ + EIsColorToneSupported = ( 1<<13 ), + /** Set if current video source supports brightness setting */ + EIsBrightnessSupported = ( 1<<14 ), + /** Set if video is permanently stopped*/ + EIsVideoPermanentlyStopped = ( 1<<15 ) + }; + + // Reference to engine media instance. + MVtEngMedia& iMedia; + + // Reference to engine command handler instance. + MVtEngCommandHandler& iCommandHandler; + }; + +#include "tlcvtmediastate.inl" + +#endif // T_LCVTMEDIASTATE_H diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/common/tlcvtmediastate.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/common/tlcvtmediastate.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,171 @@ +/* +* Copyright (c) 2008 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: Media state class inline methods. +* +*/ + + +// ----------------------------------------------------------------------------- +// TLcVtMediaState::TLcVtMediaState +// ----------------------------------------------------------------------------- +// +TLcVtMediaState::TLcVtMediaState( MVtEngMedia& aMedia, + MVtEngCommandHandler& aCommandHandler ) + : iMedia( aMedia ), iCommandHandler( aCommandHandler ) + { + } + +// ----------------------------------------------------------------------------- +// TLcVtMediaState::IsVideo +// ----------------------------------------------------------------------------- +// +TBool TLcVtMediaState::IsVideo() const + { + return IsFlag( EIsVideo ); + } + +// ----------------------------------------------------------------------------- +// TLcVtMediaState::HasCamera +// ----------------------------------------------------------------------------- +// +TBool TLcVtMediaState::HasCamera() const + { + return IsFlag( EHasCamera ); + } + +// ----------------------------------------------------------------------------- +// TLcVtMediaState::IsFreezeSupported +// ----------------------------------------------------------------------------- +// +TBool TLcVtMediaState::IsFreezeSupported() const + { + return IsFlag( EIsFreezeSupported ); + } + +// ----------------------------------------------------------------------------- +// TLcVtMediaState::IsFrozen +// ----------------------------------------------------------------------------- +// +TBool TLcVtMediaState::IsFrozen() const + { + return IsFlag( EIsFrozen ); + } + +// ----------------------------------------------------------------------------- +// TLcVtMediaState::IsSharing +// ----------------------------------------------------------------------------- +// +TBool TLcVtMediaState::IsSharing() const + { + return IsFlag( EIsSharing ); + } + +// ----------------------------------------------------------------------------- +// TLcVtMediaState::IsInitializingShare +// ----------------------------------------------------------------------------- +// +TBool TLcVtMediaState::IsInitializingShare() const + { + return IsFlag( EIsInitializingShare ); + } + +// ----------------------------------------------------------------------------- +// TLcVtMediaState::IsPrimaryCameraInUse +// ----------------------------------------------------------------------------- +// +TBool TLcVtMediaState::IsPrimaryCameraInUse() const + { + return IsFlag( EIsPrimaryCameraInUse ); + } + +// ----------------------------------------------------------------------------- +// TLcVtMediaState::IsSecondaryCameraInUse +// ----------------------------------------------------------------------------- +// +TBool TLcVtMediaState::IsSecondaryCameraInUse() const + { + return IsFlag( EIsSecondaryCameraInUse ); + } + +// ----------------------------------------------------------------------------- +// TLcVtMediaState::IsNotAbleToShare +// ----------------------------------------------------------------------------- +// +TBool TLcVtMediaState::IsNotAbleToShare() const + { + return IsFlag( EIsNotAbleToShare ); + } + +// ----------------------------------------------------------------------------- +// TLcVtMediaState::HasPrimaryCamera +// ----------------------------------------------------------------------------- +// +TBool TLcVtMediaState::HasPrimaryCamera() const + { + return IsFlag( EHasPrimaryCamera ); + } + +// ----------------------------------------------------------------------------- +// TLcVtMediaState::HasSecondaryCamera +// ----------------------------------------------------------------------------- +// +TBool TLcVtMediaState::HasSecondaryCamera() const + { + return IsFlag( EHasSecondaryCamera ); + } + +// ----------------------------------------------------------------------------- +// TLcVtMediaState::IsContrastSupported +// ----------------------------------------------------------------------------- +// +TBool TLcVtMediaState::IsContrastSupported() const + { + return IsFlag( EIsContrastSupported ); + } + +// ----------------------------------------------------------------------------- +// TLcVtMediaState::IsWhiteBalanceSupported +// ----------------------------------------------------------------------------- +// +TBool TLcVtMediaState::IsWhiteBalanceSupported() const + { + return IsFlag( EIsWhiteBalanceSupported ); + } + +// ----------------------------------------------------------------------------- +// TLcVtMediaState::IsColorToneSupported +// ----------------------------------------------------------------------------- +// +TBool TLcVtMediaState::IsColorToneSupported() const + { + return IsFlag( EIsColorToneSupported ); + } + +// ----------------------------------------------------------------------------- +// TLcVtMediaState::IsBrightnessSupported +// ----------------------------------------------------------------------------- +// +TBool TLcVtMediaState::IsBrightnessSupported() const + { + return IsFlag( EIsBrightnessSupported ); + } + +// ----------------------------------------------------------------------------- +// TLcVtMediaState::IsVideoPermanentlyStopped +// ----------------------------------------------------------------------------- +// +TBool TLcVtMediaState::IsVideoPermanentlyStopped() const + { + return IsFlag( EIsVideoPermanentlyStopped ); + } diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/common/tlcvtstates.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/common/tlcvtstates.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,333 @@ +/* +* Copyright (c) 2008 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: LC VT states class definition. +* +*/ + + +#ifndef T_LCVTSTATES_H +#define T_LCVTSTATES_H + +#include + +#include "tlcvtmediastate.h" +#include "tlcvtaudiostate.h" + +class CVtEngModel; +class MVtEngCameraPreferences; + +/** + * TLcVtStates + * + * Contains information about Application UI's current status. + * + * @since S60 v3.2 + */ +NONSHARABLE_CLASS( TLcVtStates ) : public TLcVtFlagContainer + { + +public: // enumerations + + /** + * Lc VT plugin execution state (will be set by the plugin state classes) + */ + enum TLcVtExecState + { + EExecStateStarting, + EExecStateRunning, + EExecStateResetting, + EExecStateFinalized + }; + +public: + + /** + * Constructor. + */ + TLcVtStates( CVtEngModel& aModel ); + + /** + * Updates UI states. + */ + void Update(); + + /** + * Return whether or not ColorToneSetting + * is supported by current camera. + * + * @return ETrue if at least one color tone setting is available, + * EFalse otherwise. + */ + TBool IsColorToneSettingAvailable() const; + + /** + * Return whether or not WhiteBalanceSetting + * is supported by current camera. + * + * @return ETrue if at least one white balance setting is available, + * EFalse otherwise. + */ + TBool IsWhiteBalanceSettingAvailable() const; + + /** + * Return whether or not ontrast setting + * is supported by current camera. + * + * @return ETrue if at contrast setting is available, + * EFalse otherwise. + */ + TBool IsContrastSettingAvailable() const; + + /** + * Return whether or not brightness setting + * is supported by current camera. + * + * @return ETrue if brightness setting is available, + * EFalse otherwise. + */ + TBool IsBrightnessSettingAvailable() const; + + /** + * Returns reference to media state object + * + * @return Reference to media state object. + */ + inline const TLcVtMediaState& MediaState() const; + + /** + * Returns reference to audio state object + * + * @return Reference to audio state object. + */ + inline const TLcVtAudioState& AudioState() const; + + /** + * Sets or clears EIsCLIReceived + * + * @param aSet ETrue if setting will be set, EFalse otherwise. + */ + inline void SetCLIReceived( TBool aSet ); + + /** + * Check if EIsCLIReceived is set + * + * @return ETrue if EIsCLIReceived is set EFalse otherwise + */ + inline TBool IsCLIReceived() const; + + /** + * Sets or clears EIsLayoutChangeNeeded + * + * @param aSet ETrue if setting will be set, EFalse otherwise. + */ + inline void SetLayoutChangeNeeded( TBool aSet ); + + /** + * Check if EIsLayoutChangeNeeded is set + * + * @return ETrue if EIsLayoutChangeNeeded is set EFalse otherwise + */ + inline TBool IsLayoutChangeNeeded() const; + + /** + * Sets or clears EIsDeviceLockOn + * + * @param aSet ETrue if setting will be set, EFalse otherwise. + */ + inline void SetDeviceLockOn( TBool aSet ); + + /** + * Check if EIsDeviceLockOn is set + * + * @return ETrue if EIsDeviceLockOn is set EFalse otherwise + */ + inline TBool IsDeviceLockOn() const; + + /** + * Sets or clears EDetailsReceived + * + * @param aSet ETrue if setting will be set, EFalse otherwise. + */ + inline void SetDetailsReceived( TBool aSet ); + + /** + * Check if EDetailsReceived is set + * + * @return ETrue if EDetailsReceived is set EFalse otherwise + */ + inline TBool IsDetailsReceived() const; + + /** + * Sets or clears EWaitingForFirstFrame + * + * @param aSet ETrue if setting will be set, EFalse otherwise. + */ + inline void SetWaitingForFirstFrame( TBool aSet ); + + /** + * Check if EWaitingForFirstFrame is set + * + * @return ETrue if EWaitingForFirstFrame is set EFalse otherwise + */ + inline TBool IsWaitingForFirstFrame() const; + + /** + * Sets or clears EUseSQCif + * + * @param aSet ETrue if setting will be set, EFalse otherwise. + */ + inline void SetUseSQCif( TBool aSet ); + + /** + * Check if EUseSQCif is set + * + * @return ETrue if EUseSQCif is set EFalse otherwise + */ + inline TBool IsUseSQCif() const; + + /** + * Sets or clears EIsThisApplicationForeground + * + * @param aSet ETrue if setting will be set, EFalse otherwise. + */ + inline void SetThisApplicationForeground( TBool aSet ); + + /** + * Check if EIsThisApplicationForeground is set + * + * @return ETrue if EIsThisApplicationForeground is set EFalse otherwise + */ + inline TBool IsThisApplicationForeground() const; + + /** + * Sets or clears EIsDisableBlindSetting + * + * @param aSet ETrue if setting will be set, EFalse otherwise. + */ + inline void SetDisableBlindSetting( TBool aSet ); + + /** + * Check if EIsDisableBlindSetting is set + * + * @return ETrue if EIsDisableBlindSetting is set EFalse otherwise + */ + inline TBool IsDisableBlindSetting() const; + + /** + * Sets or clears EExecShowCameraInUse + * + * @param aSet ETrue if setting will be set, EFalse otherwise. + */ + inline void SetExecShowCameraInUse( TBool aSet ); + + /** + * Check if EExecShowCameraInUse is set + * + * @return ETrue if EExecShowCameraInUse is set EFalse otherwise + */ + inline TBool IsExecShowCameraInUse() const; + + /** + * Sets or clears EIsWaitingCall + * + * @param aSet ETrue if setting will be set, EFalse otherwise. + */ + inline void SetWaitingCall( TBool aSet ); + + /** + * Check if there is waiting video/voice call. + * + * @return ETrue if waiting call is ongoing, EFalse otherwise + */ + inline TBool IsWaitingCall() const; + + /** + * Returns application's execution state. + * @return Application's current execution state. + */ + inline TLcVtExecState ExecState() const; + + /** + * Sets application's execution state. + * @param aState Application's new execution state. + */ + inline void SetExecState( const TLcVtExecState aState ); + +private: // methods to be accessed only by certain classes (see friends) + + + +private: + + // Enumeration for ui state flags. + enum TFlags + { + /** Set if CLI is received */ + EIsCLIReceived = ( 1<<0 ), + + /** Set if layout change is needed */ + EIsLayoutChangeNeeded = ( 1<<1 ), + + /** Set if device lock is on */ + EIsDeviceLockOn = ( 1<<2 ), + + /** Set if details have been received */ + EDetailsReceived = ( 1<<3 ), + + /** Set if waiting for first frame */ + EWaitingForFirstFrame = ( 1<<4 ), + + /** Set if SQCIF is being used */ + EUseSQCif = ( 1 << 5 ), + + /** Set if application on foreground */ + EIsThisApplicationForeground = ( 1<<6 ), + + /** Set if blind setting should be temporarily disabled. + This is used in preventing blind bitmap from flashing + while operations involving multiple engine commands/events + take place (e.g. 'Swap image places' and layout switch). */ + EIsDisableBlindSetting = ( 1<<7 ), + + /** Set if camera in use note should be shown. */ + EExecShowCameraInUse = ( 1<<8 ), + + /** Set if waiting call exists */ + EIsWaitingCall = ( 1<<9 ), + }; + + // Engine media state + TLcVtMediaState iMediaState; + + // Engine audio state + TLcVtAudioState iAudioState; + + // Refrence to engine + CVtEngModel& iModel; + + // Refrence to camera prefrences + MVtEngCameraPreferences* iCameraPref; + + // Application execution state + TLcVtExecState iExecState; + +private: // friends + + //friend class TLcVtStateBase; + + }; + +#include "tlcvtstates.inl" + +#endif // T_LCVTSTATES_H diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/common/tlcvtstates.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/common/tlcvtstates.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,242 @@ +/* +* Copyright (c) 2008 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: LC VT states class inline methods. +* +*/ + + +// ----------------------------------------------------------------------------- +// TLcVtStates::MediaState +// ----------------------------------------------------------------------------- +// +const TLcVtMediaState& TLcVtStates::MediaState() const + { + return iMediaState; + } + +// ----------------------------------------------------------------------------- +// TVtUiStates::AudioState +// ----------------------------------------------------------------------------- +// +const TLcVtAudioState& TLcVtStates::AudioState() const + { + return iAudioState; + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::SetCLIReceived +// ----------------------------------------------------------------------------- +// +void TLcVtStates::SetCLIReceived( TBool aSet ) + { + aSet ? SetFlag( EIsCLIReceived ) : ClearFlag( EIsCLIReceived ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::IsCLIReceived +// ----------------------------------------------------------------------------- +// +TBool TLcVtStates::IsCLIReceived() const + { + return IsFlag( EIsCLIReceived ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::SetLayoutChangeNeeded +// ----------------------------------------------------------------------------- +// +void TLcVtStates::SetLayoutChangeNeeded( TBool aSet ) + { + aSet ? SetFlag( EIsLayoutChangeNeeded ) : + ClearFlag( EIsLayoutChangeNeeded ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::IsLayoutChangeNeeded +// ----------------------------------------------------------------------------- +// +TBool TLcVtStates::IsLayoutChangeNeeded() const + { + return IsFlag( EIsLayoutChangeNeeded ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::SetDeviceLockOn +// ----------------------------------------------------------------------------- +// +void TLcVtStates::SetDeviceLockOn( TBool aSet ) + { + aSet ? SetFlag( EIsDeviceLockOn ) : + ClearFlag( EIsDeviceLockOn ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::IsDeviceLockOn +// ----------------------------------------------------------------------------- +// +TBool TLcVtStates::IsDeviceLockOn() const + { + return IsFlag( EIsDeviceLockOn ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::SetDetailsReceived +// ----------------------------------------------------------------------------- +// +void TLcVtStates::SetDetailsReceived( TBool aSet ) + { + aSet ? SetFlag( EDetailsReceived ) : + ClearFlag( EDetailsReceived ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::IsDetailsReceived +// ----------------------------------------------------------------------------- +// +TBool TLcVtStates::IsDetailsReceived() const + { + return IsFlag( EDetailsReceived ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::SetWaitingForFirstFrame +// ----------------------------------------------------------------------------- +// +void TLcVtStates::SetWaitingForFirstFrame( TBool aSet ) + { + aSet ? SetFlag( EWaitingForFirstFrame ) : + ClearFlag( EWaitingForFirstFrame ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::IsWaitingForFirstFrame +// ----------------------------------------------------------------------------- +// +TBool TLcVtStates::IsWaitingForFirstFrame() const + { + return IsFlag( EWaitingForFirstFrame ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::SetUseSQCif +// ----------------------------------------------------------------------------- +// +void TLcVtStates::SetUseSQCif( TBool aSet ) + { + aSet ? SetFlag( EUseSQCif ) : + ClearFlag( EUseSQCif ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::IsUseSQCif +// ----------------------------------------------------------------------------- +// +TBool TLcVtStates::IsUseSQCif() const + { + return IsFlag( EUseSQCif ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::SetThisApplicationForeground +// ----------------------------------------------------------------------------- +// +void TLcVtStates::SetThisApplicationForeground( TBool aSet ) + { + aSet ? SetFlag( EIsThisApplicationForeground ) : + ClearFlag( EIsThisApplicationForeground ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::IsThisApplicationForeground +// ----------------------------------------------------------------------------- +// +TBool TLcVtStates::IsThisApplicationForeground() const + { + return IsFlag( EIsThisApplicationForeground ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::SetDisableBlindSetting +// ----------------------------------------------------------------------------- +// +void TLcVtStates::SetDisableBlindSetting( TBool aSet ) + { + aSet ? SetFlag( EIsDisableBlindSetting ) : + ClearFlag( EIsDisableBlindSetting ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::IsDisableBlindSetting +// ----------------------------------------------------------------------------- +// +TBool TLcVtStates::IsDisableBlindSetting() const + { + return IsFlag( EIsDisableBlindSetting ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::SetExecShowCameraInUse +// ----------------------------------------------------------------------------- +// +void TLcVtStates::SetExecShowCameraInUse( TBool aSet ) + { + aSet ? SetFlag( EExecShowCameraInUse ) : + ClearFlag( EExecShowCameraInUse ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::IsExecShowCameraInUse +// ----------------------------------------------------------------------------- +// +TBool TLcVtStates::IsExecShowCameraInUse() const + { + return IsFlag( EExecShowCameraInUse ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStates:::SetWaitingCall +// ----------------------------------------------------------------------------- +// +void TLcVtStates::SetWaitingCall( TBool aSet ) + { + aSet ? SetFlag( EIsWaitingCall ) : + ClearFlag( EIsWaitingCall ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::IsWaitingCall +// ----------------------------------------------------------------------------- +// +TBool TLcVtStates::IsWaitingCall() const + { + return IsFlag( EIsWaitingCall ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::SetExecState +// ----------------------------------------------------------------------------- +// +void TLcVtStates::SetExecState( const TLcVtExecState aState ) + { + iExecState = aState; + } +// ----------------------------------------------------------------------------- +// TLcVtStates::ExecState +// ----------------------------------------------------------------------------- +// +TLcVtStates::TLcVtExecState TLcVtStates::ExecState() const + { + return iExecState; + } + diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/control/clcvtlocalvideoplayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/control/clcvtlocalvideoplayer.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,83 @@ +/* +* Copyright (c) 2008 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: LiveComm Videotelephony's Local Video Player +* +*/ +#ifndef LCVTLOCALVIDEOPLAYER_H +#define LCVTLOCALVIDEOPLAYER_H + +#include +#include "clcvtvideoplayerbase.h" + + +// FORWARD DECLARATIONS +class CLcVtSession; +class TVtCameraHandler; +class MLcWindow; +class MLcAudioControl; + +class CLcVtLocalVideoPlayer : public CLcVtVideoPlayerBase + { +public: // Constructors and destructor + + static CLcVtLocalVideoPlayer* NewL( + CLcVtSession* avtSession, + MLcAudioControl& aLcAudioControl, + TVtCameraHandler& aCameraHandler); + + ~CLcVtLocalVideoPlayer(); + +public: // from CLcVtVideoPlayerBase + + TLcVideoPlayerState LcVideoPlayerState() const; + + TBool LcIsPlayingL(); + + void LcPlayL( TLcVideoPlayerSource aSource=ECameraSource ); + + void LcPauseL(); + + MLcCameraControl* LcCameraControl(); + + MLcZoomControl* LcZoomControl(); + + MLcBrightnessControl* LcBrightnessControl(); + + void SetLcWindowRectL( TRect aRect ); + + void SetLcWindowOrientationL( + TLcWindowOrientation aOrientation ); + +public: + TBool IsOrientationChanged(); + +private: // Constructors + + CLcVtLocalVideoPlayer( + CLcVtSession* avtSession, + MLcAudioControl& aLcAudioControl, + TVtCameraHandler& aCameraHandler); + + void ConstructL(); + +private: // Data + + TVtCameraHandler& iCameraHandler; + TBool iIsPlaying; + TBool iOrientationChanged; + + }; + + +#endif //LCVTLOCALVIDEOPLAYER_H diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/control/clcvtremotevideoplayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/control/clcvtremotevideoplayer.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,55 @@ +/* +* Copyright (c) 2008 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: LiveComm Videotelephony's Remte Video Player +* +*/ +#ifndef LCVTREMOTEVIDEOPLAYER_H +#define LCVTREMOTEVIDEOPLAYER_H + +#include +#include "clcvtvideoplayerbase.h" + +class CLcVtRemoteVideoPlayer : public CLcVtVideoPlayerBase + { +public: // Constructors and destructor + + static CLcVtRemoteVideoPlayer* NewL( + CLcVtSession* avtSession, + MLcAudioControl& aLcAudioControl ); + + + ~CLcVtRemoteVideoPlayer(); + + +public: // from CLcVtVideoPlayerBase + + TLcVideoPlayerState LcVideoPlayerState() const; + + TBool LcIsPlayingL(); + + void SetLcWindowRectL( TRect aRect ); + + +private: // Constructors + + CLcVtRemoteVideoPlayer( + CLcVtSession* avtSession, + MLcAudioControl& aLcAudioControl ); + + void ConstructL(); + +private: // Data + }; + +#endif //LCVTREMOTEVIDEOPLAYER_H diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/control/clcvtvideoplayerbase.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/control/clcvtvideoplayerbase.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,100 @@ +/* +* Copyright (c) 2008 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: LiveComm Videotelephony's Video Player Base Class +* +*/ + +#ifndef LCVTPLAYERS_H +#define LCVTPLAYERS_H + +#include + +#include +#include +#include +#include +#include +#include "clcvtsession.h" + + +class CLcVtVideoPlayerBase : public CBase, public MLcVideoPlayer, public MLcWindow + { + +public: // Constructors and destructor + + ~CLcVtVideoPlayerBase(); + +public: // from MLcVideoPlayer + + //TLcVideoPlayerState LcVideoPlayerState() const; + + //TBool LcIsPlayingL(); + + void LcPlayL( TLcVideoPlayerSource aSource=ECameraSource ); + + void LcPauseL(); + + MLcWindow* LcWindow(); + + MLcCameraControl* LcCameraControl(); + + MLcSourceFileControl* LcSourceFileControl(); + + MLcDestinationFileControl* LcDestinationFileControl(); + + MLcAudioControl* LcAudioControl(); + + MLcZoomControl* LcZoomControl(); + + MLcBrightnessControl* LcBrightnessControl(); + + +public: // from MLcWindow + + void EnableLcWindowL( TBool aEnable ); + + TBool IsLcWindowEnabled(); + + void SetLcWindowRectL( TRect aRect ); + + TRect LcWindowRect(); + + void SetLcWindowOrientationL( + TLcWindowOrientation aOrientation ); + + TLcWindowOrientation LcWindowOrientationL(); + +protected: // Constructors + + CLcVtVideoPlayerBase( + CLcVtSession* avtSession, + MLcAudioControl& aLcAudioControl ); + +protected: // Data + + CLcVtSession* ivtSession; // Not owned + + MLcAudioControl& iLcAudioControl; + + TBool iIsWindowEnabled; + + TRect iWindowRect; + + MLcWindow::TLcWindowOrientation iWindowOrientation; + }; + + +#endif // LCVTPLAYERS_H + +// end of file diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/control/tlcvtcamerahandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/control/tlcvtcamerahandler.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,89 @@ +/* +* Copyright (c) 2008 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: LiveComm Videotelephony's Camera Handler +* +*/ + +#ifndef LCVTCAMERAHANDLER_H +#define LCVTCAMERAHANDLER_H + +#include +#include +#include + +class CLcVtSession; + +class TVtCameraHandler : + public MLcCameraControl, + public MLcBrightnessControl, + public MLcZoomControl + { + public: // From MLcCameraControl + + TInt LcCameraCountL(); + + TInt CurrentLcCameraIndex(); + + void ToggleLcCameraL(); + + public: // From MLcBrightnessControl + + TInt MinLcBrightnessL(); + + TInt MaxLcBrightnessL(); + + TInt LcBrightnessL(); + + void SetLcBrightnessL( TInt aValue ); + + void IncreaseLcBrightnessL(); + + void DecreaseLcBrightnessL(); + + public: // From MLcZoomControl + + TInt MinLcZoomL(); + + TInt MaxLcZoomL(); + + TInt LcZoomValueL(); + + void SetLcZoomValueL( TInt aValue ); + + void LcZoomInL(); + + void LcZoomOutL(); + + public: + + TVtCameraHandler(); + + void SetSession( CLcVtSession* aSession ); + + private: + + enum TCurrentCamera + { + ECameraNotAvailable = KErrNotFound, + EBackCamera = 0, + EFrontCamera = 1 + }; + + private: // Data + + CLcVtSession* ivtSession; // Not owned + + }; + +#endif //LCVTCAMERAHANDLER_H diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/states/tlcvtpluginstates.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/states/tlcvtpluginstates.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,279 @@ +/* +* Copyright (c) 2008 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: Concrete VT plugin state classes +* +*/ + + +#ifndef T_LCVTPLUGINSTATES_H +#define T_LCVTPLUGINSTATES_H + +#include "tlcvtstatebase.h" +#include +#include + + +/** +* Initial application state. Responsible for startup phase 1 and +* startup phase 2 (see EVtUiAppUiStartup in CVtUiAppUi.cpp). +* Certain other state changes are required for phase 2 and history +* of their reception is handled with precondition flags. +* +* @since S60 v3.2 +*/ +class TLcVtStateStarting : public TLcVtStateBase + { +public: + /** + * returns singleton instance of TLcVtStateStarting + * @param aCtx state context + * @param aUiStates UI states + * @return singleton + */ + static TLcVtStateStarting* InstanceL( + MLcVtStateContext& aCtx, + TLcVtStates& aUiStates ); + +public: // from TLcVtStateBase + + /** @see TLcVtStateBase */ + virtual void LcVtStartupPhase1DoneL(); + + /** @see TLcVtStateBase */ + virtual void LcVtStartupPhase2DoneL(); + + /** @see TLcVtStateBase */ + virtual TEventResponse HandleVtEventL( TInt aEvent ); + + /** @see TLcVtStateBase */ + virtual TEventResponse HandleCommandL( const TInt aCommand ); + + /** @see TLcVtStateBase */ + virtual TBool HandleForegroundChangedL( TBool aIsForeground ); + + /** @see TLcVtStateBase */ + virtual TBool PreHandleForegroundChangedL( TBool aIsForeground ); + +private: // from TLcVtStateBase + + /** @see TLcVtStateBase */ + virtual void OpenL(); + + /** @see TLcVtStateBase */ + virtual void Close(); + +private: // new methods + + void CheckSessionStateL(); + + static TInt AsynchOpen( TAny* aAny ); + + void DoOpenL(); + + /** Preconditions that must be passed in order to proceed + * to Phase 2 in startup. + */ + enum TPreconditions + { + /** waiting for CLI from engine*/ + EWaitingCLI, + /** waiting for phase1 to complete */ + EWaitingPhase1ToComplete, + /** waiting for engine to get proper state */ + EWaitingSessionState + }; + + /** + * Clears precondition passed as argument and checks if any + * preconditions hold and if not proceeds to phase 2 of startup. + */ + void CheckPhase2StartupL( const TPreconditions aClearCondition ); + + void HandleCLIReceivedL(); + +private: // constructors and destructors + + // c++ constructor + TLcVtStateStarting( + MLcVtStateContext& aCtx, + TLcVtStates& aUiStates ); + + // Destructor + virtual ~TLcVtStateStarting(); + +private: // data members + + // Precondition for state change to running + TBitFlags8 iPreconditions; + + // Singleton + static TLcVtStateStarting* iInstance; + + // Starts phase1 startup in state state context. Needed because + // initial state is opened from within state context construction. + CAsyncCallBack* iStartCallback; + }; + +/** +* Application state that is active in normal operation. +* +* @since S60 v3.2 +*/ +class TLcVtStateRunning : public TLcVtStateBase + { +public: + /** + * returns singleton instance of TLcVtStateRunning + * @param aCtx state context + * @param aUiStates UI states + * @return singleton + */ + static TLcVtStateRunning* InstanceL( + MLcVtStateContext& aCtx, + TLcVtStates& aUiStates ); + +public: // from TLcVtStateBase + + /** @see TLcVtStateBase */ + virtual TEventResponse HandleVtEventL( TInt aEvent ); + + /** @see TLcVtStateBase */ + virtual TEventResponse HandleCommandL( const TInt aCommand ); + + /** @see TLcVtStateBase */ + virtual TBool HandleForegroundChangedL( TBool aIsForeground ); + + /** @see TLcVtStateBase */ + virtual TBool PreHandleForegroundChangedL( TBool aIsForeground ); + /** @see TLcVtStateBase */ + //virtual void HandleLayoutChangedL(); + + /** @see TLcVtStateBase */ + //virtual void StartDtmfTone( const TChar& aTone ); + + /** @see TLcVtStateBase */ + //virtual void StopDtmfTone(); + + /** @see TLcVtStateBase */ + virtual void OpenL(); + +private: // from TLcVtStateBase + /** @see TLcVtStateBase */ + virtual void Close(); + +private: // constructors and destructors + + // c++ constructor + TLcVtStateRunning( + MLcVtStateContext& aCtx, + TLcVtStates& aUiStates ); + + // Destructor + virtual ~TLcVtStateRunning(); + +private: // new functions + + /** Requests call handling subsystem to initiate a voice call. + * Starts shutdown of the application. + */ + void CreateVoiceCallL(); + + /** Dials emergency call and starts shutdown */ + void DialEmergencyCallL(); + + void ShutdownWithEngineCommandL( const TInt aCommand ); + +private: // data members + // singleton + static TLcVtStateRunning* iInstance; + + }; + +/** +* Application state that is active during shutdown. +* +* @since S60 v3.2 +*/ +class TLcVtStateResetting : public TLcVtStateBase + { +public: + /** + * returns singleton instance of TLcVtStateResetting + * @param aCtx state context + * @param aUiStates UI states + * @param aCommand engine command to send when resetting state activates + * @return singleton + */ + static TLcVtStateResetting* InstanceL( + MLcVtStateContext& aCtx, + TLcVtStates& aUiStates, + const TVtEngCommandId aCommand = KVtEngCommandNone ); + +public: // from TLcVtStateBase + + /** @see TLcVtStateBase */ + virtual void LcVtStartupFailedL(); + + /** @see TLcVtStateBase */ + virtual void ShutdownDoneL(); + + /** @see TLcVtStateBase */ + virtual TEventResponse HandleVTCommandPerformedL( + TVtEngCommandId aCommand, + const TInt aError ); + + /** @see TLcVtStateBase */ + virtual TEventResponse HandleVtEventL( TInt aEvent ); + + /** @see TLcVtStateBase */ + virtual TEventResponse HandleCommandL( const TInt aCommand ); + + /** @see TLcVtStateBase */ + virtual TBool HandleForegroundChangedL( TBool aIsForeground ); + + /** @see TLcVtStateBase */ + virtual TBool PreHandleForegroundChangedL( TBool aIsForeground ); + + /** @see TLcVtStateBase */ + //virtual void HandleLayoutChangedL(); + +private: // from TLcVtStateBase + + /** @see TLcVtStateBase */ + virtual void OpenL(); + + /** @see TLcVtStateBase */ + virtual void Close(); + +private: // constructors and destructors + + // c++ constructor + TLcVtStateResetting( + MLcVtStateContext& aCtx, + TLcVtStates& aUiStates, + const TVtEngCommandId aCommand = KVtEngCommandNone ); + + // Destructor + virtual ~TLcVtStateResetting(); + +private: // data members + + // Singleton + static TLcVtStateResetting* iInstance; + + // Used in user originated shutdown (end active call/switch to voice) + TVtEngCommandId iCommand; + }; + +#endif // T_LCVTPLUGINSTATES_H diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/states/tlcvtstatebase.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/states/tlcvtstatebase.h Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,248 @@ +/* +* Copyright (c) 2008 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: Base class for application states. +* +*/ + + +#ifndef T_LCVTSTATEBASE_H +#define T_LCVTSTATEBASE_H + +#include +#include +#include "mlcvtstatecontext.h" +#include "mlcvtshutterobserver.h" +#include "tlcvtstates.h" + +/** +* Base class for application states related to application startup, normal +* operation and shutdown. AppUi delegates decision making by forwarding +* events/commands it receives to current state. +* Not all event handlers declared by the base class are applicable in +* all concrete states. All methods returning TEventResponse imply that it may +* consume the event completely and caller should not process it further. +* +* It should be kept in mind that as new functionality is added to application, +* state classes may need changes if e.g. handling of specific event should be +* allowed in appUi. By default event handler in specific state may consume all +* events. Note that in this context e.g. HandleCommandL is considered as an +* event handler. +* +* @since S60 v3.2 +*/ +class TLcVtStateBase : public MLcVtShutterObserver + { +public: // new functions + + /** + * Return value from state's event handlers. + */ + enum TEventResponse + { + /** Event was handled by a state and should + * not be further processed by caller. + */ + EEventHandled, + /** Event can be handled by caller. */ + EEventNotHandled + }; + + /** + * Performs state dependent actions when phase 1 of + * startup is completed. + */ + virtual void LcVtStartupPhase1DoneL(); + + /** + * Performs state dependent actions when startup fails. + */ + virtual void LcVtStartupFailedL(); + + /** + * Performs state dependent actions when phase 2 of + * startup is completed. + */ + virtual void LcVtStartupPhase2DoneL(); + + /** + * Handles completion of shutdown. + */ + virtual void ShutdownDoneL(); + + /** + * Handles completion of an VT engine command. + * @param aCommand completed command + * @param aError error + * @return event response, is caller allowed to handle event + */ + virtual TEventResponse HandleVTCommandPerformedL( + const TVtEngCommandId aCommand, + const TInt aError ); + + /** + * Handles event from the engine. + * @param aEvent + * @return event response, is caller allowed to handle event + */ + virtual TEventResponse HandleVtEventL( const TInt aEvent ); + + /** + * Handles command from the user (or application framework). + * @param aCommand + * @return event response, is caller allowed to handle event + */ + virtual TEventResponse HandleCommandL( const TInt aCommand ); + + /** + * Performs state dependent actions for foreground change event. + * @param aIsForeground foreground status passed from UI framework + * @return ETrue if application should behave as in foreground + */ + virtual TBool HandleForegroundChangedL( const TBool aIsForeground ) = 0; + + /** + * Performs state dependent previous actions for foreground change event. + * @param aIsForeground foreground status passed from UI framework + * @return ETrue if application should behave as in foreground + */ + virtual TBool PreHandleForegroundChangedL( const TBool aIsForeground ) = 0; + + /** + * Performs state dependent actions for layout change. + */ + //virtual void HandleLayoutChangedL(); + + /** + * Sends DTMF tone if allowed by current state. + * @param aTone DTMF tone to send + */ + //virtual void StartDtmfTone( const TChar& aTone ); + + /** + * Stops DTMF tone if allowed by current state. + */ + //virtual void StopDtmfTone(); + + /** + * Sets initial application state. + * @param aCtx state context providing services to states + * @param aUiStates ui states + */ + static void SetInitialStateL( + MLcVtStateContext& aCtx, + TLcVtStates& aUiStates); + +public: // from MLcVtShutterObserver + + /** + * Handles 'shutdown ready' event. + */ + virtual void HandleShutdownReady(); + + +protected: // for concrete state classes + + /** + * Destructor, for cleanup. + */ + virtual ~TLcVtStateBase(); + + /** + * Performs entry action for a state. + */ + virtual void OpenL() = 0; + + /** + * Performs exit action for a state and deletes that state. + */ + virtual void Close() = 0; + + /** + * Sets current state. + */ + void ChangeStateL( TLcVtStateBase& aNewState ); + + /** + * Sets transition to resetting state as cleanup item. + */ + void CleanupResetPushL(); + + /** + * Starts shutdown when leave occurred. + */ + static void TransitionToReset( TAny* aAny ); + + + /** + * Ends the call if necessary and starts shutdown. + * @return ETrue if shutdown started. + */ + TBool CheckEndActiveCallL(); + + /** + * Returns engine session state. + * @param aUpdate is state forced to update + * @return session state + */ + MVtEngSessionInfo::TSessionState SessionState( + const TBool aUpdate ) const; + + /** + * Delegates engine command execution to the state context. + */ + template < typename T > + inline void ExecuteEngineCommand( + TInt aCommand, T& aParam ); + + /** + * Sets execution state. + */ + void SetExecState( const TLcVtStates::TLcVtExecState aState ); + +protected: // constructor + + // c++ constructor + TLcVtStateBase( MLcVtStateContext& aCtx, TLcVtStates& aUiStates ); + + +private: // new functions + + /** + * Updates applications lock state and sends to background if + * the device is locked. + */ + void HandleDeviceLockEventL( const TBool aDeviceIsLocked ); + +protected: // data members + + // Context providing services to states + MLcVtStateContext& iCtx; + + // Various application specific state information + TLcVtStates& iUiStates; + + /** Prevents sending end call command to call handling if ETrue. + * It is not allowed when call clearing is network originated. + */ + + /** + * shutdown request received + */ + static TBool iShutdownRequested; + + }; + +#include "tlcvtstatebase.inl" + +#endif // T_LCVTSTATEBASE_H diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/inc/states/tlcvtstatebase.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/inc/states/tlcvtstatebase.inl Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,26 @@ +/* +* Copyright (c) 2008 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: Base class for application states. +* +*/ + + +template < typename T > +inline void TLcVtStateBase::ExecuteEngineCommand( + TInt aCommand, T& aParam ) + { + TPtrC8 params( reinterpret_cast< TUint8* >( &aParam ), + sizeof( T ) ); + TRAP_IGNORE( iCtx.DoExecuteCmdL( aCommand, ¶ms ) ); + } diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/rom/lcvt.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/rom/lcvt.iby Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2008 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: IBY file + * +*/ + + +#ifndef __LCVTPLUGIN_IBY__ +#define __LCVTPLUGIN_IBY__ + +REM Video telephony plugin libraries + +#ifdef __CS_VIDEO_TELEPHONY + +ECOM_PLUGIN(lcvtengineplugin.dll,lcvtengineplugin.rsc) + +// Enabler for eclipsing ROM binaries +data=ZSYSTEM\install\lcvtplugin_stub.sis system\install\lcvtplugin_stub.sis + +#endif + +#endif diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/src/base/clcvtactiveexec.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/src/base/clcvtactiveexec.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,164 @@ +/* +* Copyright (c) 2008 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: Implementation of the CLcVtActiveExec class. +* +*/ + + + +// INCLUDE FILES +#include "clcvtactiveexec.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CLcVtActiveExec::CLcVtActiveExec +// ----------------------------------------------------------------------------- +// +CLcVtActiveExec::CLcVtActiveExec( + const TInt aPriority ) + : CActive( aPriority ) + { + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CLcVtActiveExec::~CLcVtActiveExec +// ----------------------------------------------------------------------------- +// +CLcVtActiveExec::~CLcVtActiveExec() + { + Cancel(); + } + +// ----------------------------------------------------------------------------- +// CLcVtActiveExec::Start +// ----------------------------------------------------------------------------- +// +void CLcVtActiveExec::Start( + TInt aStartState, + MLcVtActiveExec& aExec ) + { + Cancel(); + + iInitialState = aStartState; + iCurrentState = aStartState; + iNextState = aStartState; + + iActiveExec = &aExec; + + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + SetActive(); + } + +// ----------------------------------------------------------------------------- +// CLcVtActiveExec::InitialState +// ----------------------------------------------------------------------------- +// +TInt CLcVtActiveExec::InitialState() const + { + return iInitialState; + } + +// ----------------------------------------------------------------------------- +// CLcVtActiveExec::RequestStatus +// ----------------------------------------------------------------------------- +// +TInt CLcVtActiveExec::RequestStatus() const + { + return iStatus.Int(); + } + +// ----------------------------------------------------------------------------- +// CLcVtActiveExec::RunL +// ----------------------------------------------------------------------------- +// +void CLcVtActiveExec::RunL() + { + User::LeaveIfError( iStatus.Int() ); + TBool synch = ETrue; + + // Execute to the next asynchronous operation. + while ( synch ) + { + iCurrentState = iNextState; + if ( iCurrentState ) + { + synch = iActiveExec->ActiveExecExecuteL( + *this, + iCurrentState, + iNextState, + iStatus ); + + if ( !synch ) + { + SetActive(); + } + } + else + { + iActiveExec->ActiveExecDone( *this, iInitialState ); + if ( !IsActive() ) + { + iInitialState = 0; + } + + synch = EFalse; + } + } + } + +// ----------------------------------------------------------------------------- +// CLcVtActiveExec::DoCancel +// ----------------------------------------------------------------------------- +// +void CLcVtActiveExec::DoCancel() + { + if ( iActiveExec ) + { + iActiveExec->ActiveExecCancel( *this, iCurrentState ); + + iCurrentState = 0; + iActiveExec = NULL; + iInitialState = 0; + } + } + +// ----------------------------------------------------------------------------- +// CLcVtActiveExec::RunError +// ----------------------------------------------------------------------------- +// +TInt CLcVtActiveExec::RunError( TInt aError ) + { + if ( iActiveExec->ActiveExecContinue( *this, iCurrentState, aError ) ) + { + iNextState = iCurrentState; + + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + SetActive(); + } + else + { + if ( !IsActive() ) + { + iInitialState = 0; + } + } + + return KErrNone; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/src/base/clcvtappshutter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/src/base/clcvtappshutter.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,258 @@ +/* +* Copyright (c) 2008 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: Class responsible for application exit. +* +*/ + + +#include "clcvtappshutter.h" +#include "mlcvtshutterobserver.h" +#include "mlcvtstatecontext.h" +//#include "mlcvtnumbersource.h" +//#include "tvtuilocalvariation.h" +#include +//#include +//#include +#include +#include + +// singleton instance +static CLcVtAppShutter* iAppShutter = NULL; + +// ----------------------------------------------------------------------------- +// CLcVtAppShutter::InstanceL +// ----------------------------------------------------------------------------- +// +CLcVtAppShutter* CLcVtAppShutter::InstanceL( + MLcVtShutterObserver& aObserver ) + { + __VTPRINTENTER( "CLcVtAppShutter.InstanceL" ) + if ( iAppShutter == NULL ) + { + iAppShutter = new ( ELeave ) + CLcVtAppShutter( aObserver ); + } + __VTPRINTEXIT( "CLcVtAppShutter.InstanceL" ) + return iAppShutter; + } + +// ----------------------------------------------------------------------------- +// CLcVtAppShutter::CLcVtAppShutter +// ----------------------------------------------------------------------------- +// +CLcVtAppShutter::CLcVtAppShutter( + MLcVtShutterObserver& aObserver ) : + iPendingStateFlags( 0 ), + iObserver( aObserver ) + { + iPendingStateFlags.Set( EShutterWaitingStart ); + } + +// ----------------------------------------------------------------------------- +// CLcVtAppShutter::~CLcVtAppShutter +// ----------------------------------------------------------------------------- +// +CLcVtAppShutter::~CLcVtAppShutter() + { + __VTPRINTENTER( "CLcVtAppShutter.~" ) + // mark singleton null + iAppShutter = NULL; + delete iCallback; + __VTPRINTEXIT( "CLcVtAppShutter.~" ) + } + +// ----------------------------------------------------------------------------- +// CLcVtAppShutter::StartShutdown +// Called when application may exit, i.e TVtUiStateResetting state receives +// ShutdownDoneL message. +// ----------------------------------------------------------------------------- +// +void CLcVtAppShutter::StartShutdown() + { + __VTPRINTENTER( "CLcVtAppShutter.StartShutdown" ) + iPendingStateFlags.Clear( EShutterWaitingStart ); + ShutdownIfReadyAndDestroy(); + __VTPRINTEXIT( "CLcVtAppShutter.StartShutdown" ) + } + +// ----------------------------------------------------------------------------- +// CLcVtAppShutter::ShutdownWithEmergencyCallL +// ----------------------------------------------------------------------------- +// +void CLcVtAppShutter::ShutdownWithEmergencyCallL( + MLcVtStateContext& aStateContext ) + { + // Leaves if other than emergency number is supplied... + CEmergencyCaller* emergency = CEmergencyCaller::DialEmergencyL( *this, + aStateContext ); + // therefore the flag and member variable must not be set before above call. + iPendingStateFlags.Set( EShutterWaitingEmergencyCallback ); + iEmergencyCaller = emergency; + } + +// ----------------------------------------------------------------------------- +// CLcVtAppShutter::EmergencyCallDoneL +// ----------------------------------------------------------------------------- +// +void CLcVtAppShutter::EmergencyCallDoneL() + { + // Destruction of emergency handler is done asynchrounously to avoid + // problems that might + iPendingStateFlags.Clear( EShutterWaitingEmergencyCallback ); + TCallBack cb( EmergencyResponseCallback, this ); + EnqueCallbackL( cb ); + } + +// ----------------------------------------------------------------------------- +// CLcVtAppShutter::EmergencyResponseCallback +// ----------------------------------------------------------------------------- +// +TInt CLcVtAppShutter::EmergencyResponseCallback( TAny* aAny ) + { + CLcVtAppShutter* shutter = + reinterpret_cast( aAny ); + // delete callback + delete shutter->iCallback; + shutter->iCallback = NULL; + // delete emergency caller + delete shutter->iEmergencyCaller; + shutter->iEmergencyCaller = NULL; + + shutter->ShutdownIfReadyAndDestroy(); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CLcVtAppShutter::EnqueCallbackL +// ----------------------------------------------------------------------------- +// +void CLcVtAppShutter::EnqueCallbackL( TCallBack& aCallback ) + { + __VTPRINTENTER( "CLcVtAppShutter.EnqueAsyncCommsCommandL" ) + if ( !iCallback ) + { + iCallback = new ( ELeave ) CAsyncCallBack( aCallback, EPriorityHigh ); + } + iCallback->Call(); + __VTPRINTEXIT( "CLcVtAppShutter.EnqueAsyncCommsCommandL" ) + __VTPRINTEXIT( "CLcVtAppShutter.EnqueCallbackL" ) + } + +// ----------------------------------------------------------------------------- +// CLcVtAppShutter::ShutdownIfReadyAndDestroy +// ----------------------------------------------------------------------------- +// +void CLcVtAppShutter::ShutdownIfReadyAndDestroy() + { + __VTPRINTENTER( "CLcVtAppShutter.ShutdownIfReadyAndDestroy" ) + __VTPRINT2( DEBUG_GEN, " shutter flags %d", + iPendingStateFlags.Value() ); + if ( !iPendingStateFlags.Value() ) + { + iObserver.HandleShutdownReady(); + delete this; + } + __VTPRINTEXIT( "CLcVtAppShutter.ShutdownIfReadyAndDestroy" ) + } + +// ----------------------------------------------------------------------------- +// CLcVtAppShutter::CEmergencyCaller::DialEmergencyL +// ----------------------------------------------------------------------------- +// +CLcVtAppShutter::CEmergencyCaller* CLcVtAppShutter::CEmergencyCaller:: + DialEmergencyL( + CLcVtAppShutter& aObserver, + MLcVtStateContext& aStateContext ) + { + __VTPRINTENTER( "CEmergencyCaller.DialEmergencyL" ) + CLcVtAppShutter::CEmergencyCaller* self = new ( ELeave ) + CLcVtAppShutter::CEmergencyCaller( aObserver, aStateContext ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + __VTPRINTEXIT( "CEmergencyCaller.DialEmergencyL" ) + return self; + } + +// ----------------------------------------------------------------------------- +// CLcVtAppShutter::CEmergencyCaller::ConstructL +// ----------------------------------------------------------------------------- +// +void CLcVtAppShutter::CEmergencyCaller::ConstructL() + { + __VTPRINTENTER( "CEmergencyCaller.ConstructL" ) + /* + const MVtUiNumberSource* source = iStateContext.NumberSource(); + if ( source ) + { + source->GetContents( iNumber ); + AknTextUtils::ConvertDigitsTo( iNumber, EDigitTypeWestern ); + User::LeaveIfError( iServer.Connect() ); + iEmergency = CPhCltEmergencyCall::NewL( this ); + TBool isEmergenyNumber = EFalse; + const TInt err = + iEmergency->FindEmergencyPhoneNumber( iNumber, isEmergenyNumber ); + + if ( err == KErrNone && isEmergenyNumber ) + { + __VTPRINT( DEBUG_GEN, "iEmergency->DialEmergencyCallL") + iEmergency->DialEmergencyCallL( iNumber ); + } + if ( !isEmergenyNumber || err ) + { + __VTPRINT( DEBUG_GEN, " not EC number => leave" ) + // Not an emergency call number. Abort emergency call process. + User::Leave( KErrArgument ); + } + } + */ + __VTPRINTEXIT( "CEmergencyCaller.ConstructL" ) + } + +// ----------------------------------------------------------------------------- +// CLcVtAppShutter::CEmergencyCaller::CEmergencyCaller +// ----------------------------------------------------------------------------- +// +CLcVtAppShutter::CEmergencyCaller::CEmergencyCaller( + CLcVtAppShutter& aObserver, + MLcVtStateContext& aStateContext ) : + iObserver( aObserver ), + iStateContext( aStateContext ) + { + } + +// ----------------------------------------------------------------------------- +// CLcVtAppShutter::CEmergencyCaller::~CEmergencyCaller +// ----------------------------------------------------------------------------- +// +CLcVtAppShutter::CEmergencyCaller::~CEmergencyCaller() + { + __VTPRINTENTER( "CEmergencyCaller.~" ) + delete iEmergency; + iServer.Close(); + __VTPRINTEXIT( "CEmergencyCaller.~" ) + } + +// ----------------------------------------------------------------------------- +// CLcVtAppShutter::CEmergencyCaller::HandleEmergencyDialL +// ----------------------------------------------------------------------------- +// +void CLcVtAppShutter::CEmergencyCaller::HandleEmergencyDialL( + const TInt ) + { + __VTPRINTENTER( "CEmergencyCaller.HandleEmergencyDialL" ) + iObserver.EmergencyCallDoneL(); + __VTPRINTEXIT( "CEmergencyCaller.HandleEmergencyDialL" ) + } + diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/src/base/clcvtcmdexecutor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/src/base/clcvtcmdexecutor.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,360 @@ +/* +* Copyright (c) 2008 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: Implementation of the CLcVtCmdExecutor class. +* +*/ + + +// INCLUDE FILES +#include "clcvtcmdexecutor.h" +#include "mlcvtenginecommandmanager.h" +#include +#include + +// MODULE DATA STRUCTURES + +/** +* Active object to perform asynchronous commands. +* @since Series 60 2.6 +*/ +class CLcVtCmdExecutor::CActiveCmd + : public CActive + { + public: // Constructors and destructor + + /** + * Constructor. + */ + CActiveCmd( + CLcVtCmdExecutor& aDialog, + MVtEngCommandHandler& aCommandHandler, + TVtEngCommandId aCommand, + TDesC8* aParams ); + + /** + * Destructor. + */ + ~CActiveCmd(); + + public: // New functions + + /** + * Starts active object. Command will be performed in RunL. + */ + void Start(); + + /** + * Checks if command has been performed. + * @return ETrue if command has been performed. + */ + TBool CommandPerformed() const; + + private: + + /** + * @see CActive::RunL + */ + void RunL(); + + /** + * @see CActive::DoCancel. + */ + void DoCancel(); + + /** + * @see CActive::RunError. + */ + TInt RunError( TInt aResult ); + + private: + + // Ref to dialog. + CLcVtCmdExecutor& iExecutor; + + // Ref to command handler. + MVtEngCommandHandler& iCommandHandler; + + // Command to be executed. + TVtEngCommandId iCommand; + + // Owned parameters. + TDesC8* iCommandParams; + + // ETrue if command has been performed. + TBool iCommandPerformed; + + }; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CLcVtCmdExecutor::CLcVtCmdExecutor +// ----------------------------------------------------------------------------- +// +CLcVtCmdExecutor::CLcVtCmdExecutor( + CLcVtCmdExecutor** aSelfPtr, + MVtEngCommandHandler& aCommandHandler, + MLcVtEngineCommandManager& aCommandManager ) + : iSelfPtr( aSelfPtr ), + iCommandHandler( aCommandHandler ), + iCommandManager( aCommandManager ) + { + iRequest = NULL; + __VTPRINT2( DEBUG_GEN, "CLcVtCmdExecutor.Ctor this=%d", (TInt)this ) + } + +// ----------------------------------------------------------------------------- +// CLcVtCmdExecutor::~CLcVtCmdExecutor +// ----------------------------------------------------------------------------- +// +CLcVtCmdExecutor::~CLcVtCmdExecutor() + { + __VTPRINTENTER( "CLcVtCmdExecutor.~" ) + __VTPRINT2( DEBUG_GEN, "CLcVtCmdExecutor.~ this=%d", (TInt)this ) + if ( iActiveCmd ) + { + if ( !iCommandCompleted && iActiveCmd->CommandPerformed() ) + { + iCommandHandler.CancelCommand( iCommand ); // ignore error + } + } + delete iCommandParams; + delete iActiveCmd; + + iCommandManager.RemoveObserver( *this ); + + if ( iSelfPtr ) + { + *iSelfPtr = NULL; + iSelfPtr = NULL; + } + + if ( iRequest ) + { + __VTPRINT(DEBUG_GEN, "CLcVtCmdExecutor::~CLcVtCmdExecutor RequestComplete") + User::RequestComplete( iRequest, KErrCancel ); + iRequest = NULL; + } + else + { + if ( iWait.IsStarted()) + { + __VTPRINT(DEBUG_GEN, "CLcVtCmdExecutor::~CLcVtCmdExecutor AsyncStop") + iWait.AsyncStop(); + } + } + + + __VTPRINTEXIT( "CLcVtCmdExecutor.~" ) + } + +// ----------------------------------------------------------------------------- +// CLcVtCmdExecutor::ExecuteCmdL +// ----------------------------------------------------------------------------- +// +void CLcVtCmdExecutor::ExecuteCmdL( + const TVtEngCommandId aCommandId, + TDesC8* aParams, + TRequestStatus* aRequest ) + { + __VTPRINTENTER( "CLcVtCmdExecutor.ExecuteCmdL" ) + __VTPRINT2( DEBUG_GEN, "CLcVtCmdExecutor.ExecuteCmdL this=%d", (TInt)this ) + iCommand = aCommandId; + CleanupStack::PushL( this ); + if ( aParams ) + { + iCommandParams = aParams->AllocL(); + } + + iCommandManager.AddObserverL( *this ); + CleanupStack::Pop( this ); + + iActiveCmd = + new ( ELeave ) CActiveCmd( + *this, iCommandHandler, iCommand, iCommandParams ); + iActiveCmd->Start(); + + if ( !aRequest ) + { + TInt error = KErrNone; + iError = &error; + //Start Active Schedule + iWait.Start(); + User::LeaveIfError( error ); + } + else + { + *aRequest = KRequestPending; + iRequest = aRequest; + } + + __VTPRINTEXIT( "CLcVtCmdExecutor.ExecuteCmdL" ) + } + + +// ----------------------------------------------------------------------------- +// CLcVtCmdExecutor::Complete +// ----------------------------------------------------------------------------- +// +void CLcVtCmdExecutor::Complete( const TInt aError ) + { + if ( iError ) + { + *iError = aError; + } + + if ( iRequest ) + { + User::RequestComplete( iRequest, aError ); + iRequest = NULL; + } + + delete this; + } + +// ----------------------------------------------------------------------------- +// CLcVtCmdExecutor::HandleVTCommandPerformedL +// ----------------------------------------------------------------------------- +// +void CLcVtCmdExecutor::HandleVTCommandPerformedL( + TVtEngCommandId aCommand, + const TInt aError ) + { + __VTPRINTENTER( "CLcVtCmdExecutor.HandleVTCommandPerformed" ) + __VTPRINT2( DEBUG_GEN, "CLcVtCmdExecutor.HandleVTCommandPerformed.cmd.%d", aCommand ) + __VTPRINT2( DEBUG_GEN, "CLcVtCmdExecutor.HandleVTCommandPerformed.err.%d", aError ) + if ( iActiveCmd && ( aCommand == iCommand ) ) + { + if ( iActiveCmd->CommandPerformed() && !iCommandCompleted ) + { + __VTPRINT( DEBUG_GEN, "CLcVtCmdExecutor.match" ) + iCommandCompleted = ETrue; + // Corrupted images may leave during initialization, thus we have + // to mask out errors when they happen during share initialize. + // Error code is handled correctly in CVtUiAppUi::CEventObserver:: + // HandleVTCommandPerformedL() method, thus it will not be ignored. + if ( aCommand == KVtEngInitializeShareImage ) + { + Complete( KErrNone ); + } + else + { + Complete( aError ); + } + } + } + __VTPRINTEXIT( "CLcVtCmdExecutor.HandleVTCommandPerformed" ) + } + +// ----------------------------------------------------------------------------- +// CLcVtCmdExecutor::HandleExecuteFailed +// ----------------------------------------------------------------------------- +// +void CLcVtCmdExecutor::HandleExecuteFailed( TInt aResult ) + { + __VTPRINT3( DEBUG_GEN, "CLcVtCmdExecutor.Fail this=%d res=%d", + (TInt)this, aResult ) + Complete( aResult ); + } + +// Implementation of CLcVtCmdExecutor::CActiveCmd: + +// ----------------------------------------------------------------------------- +// CLcVtCmdExecutor::CActiveCmd::CActiveCmd +// ----------------------------------------------------------------------------- +// +CLcVtCmdExecutor::CActiveCmd::CActiveCmd( + CLcVtCmdExecutor& aExecutor, + MVtEngCommandHandler& aCommandHandler, + TVtEngCommandId aCommand, + TDesC8* aParams) + : CActive( CActive::EPriorityHigh ), + iExecutor( aExecutor ), + iCommandHandler( aCommandHandler ), + iCommand( aCommand ), + iCommandParams( aParams ) + { + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CLcVtCmdExecutor::CActiveCmd::~CActiveCmd +// ----------------------------------------------------------------------------- +// +CLcVtCmdExecutor::CActiveCmd::~CActiveCmd() + { + __VTPRINT2( DEBUG_GEN, "CLcVtCmdExecutor.CActiveCmd.Dtor this=%d", (TInt)this ) + Cancel(); + } + +// ----------------------------------------------------------------------------- +// CLcVtCmdExecutor::CActiveCmd::Start +// ----------------------------------------------------------------------------- +// +void CLcVtCmdExecutor::CActiveCmd::Start() + { + __VTPRINTENTER( "CLcVtCmdExecutor.CActiveCmd.Start" ) + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + SetActive(); + __VTPRINTEXITR( "CLcVtCmdExecutor.CActiveCmd.Start this=%d", (TInt)this ) + } + +// ----------------------------------------------------------------------------- +// CLcVtCmdExecutor::CActiveCmd::CommandPerformed +// ----------------------------------------------------------------------------- +// +TBool CLcVtCmdExecutor::CActiveCmd::CommandPerformed() const + { + __VTPRINT3( DEBUG_GEN, "CLcVtCmdExecutor.CActiveCmd.Perf this=%d,cmd=%d", + (TInt)this, iCommandPerformed ) + return iCommandPerformed; + } + +// ----------------------------------------------------------------------------- +// CLcVtCmdExecutor::CActiveCmd::RunL +// ----------------------------------------------------------------------------- +// +void CLcVtCmdExecutor::CActiveCmd::RunL() + { + __VTPRINTENTER( "CLcVtCmdExecutor.CActiveCmd.RunL" ) + iCommandHandler.ExecuteL( iCommand, iCommandParams ); + iCommandPerformed = ETrue; + __VTPRINTEXITR( "CLcVtCmdExecutor.CActiveCmd.RunL this=%d", (TInt)this ) + } + +// ----------------------------------------------------------------------------- +// CLcVtCmdExecutor::CActiveCmd::DoCancel +// ----------------------------------------------------------------------------- +// +void CLcVtCmdExecutor::CActiveCmd::DoCancel() + { + __VTPRINT2( DEBUG_GEN, "CLcVtCmdExecutor.CActiveCmd.DoCnl this=%d", (TInt)this ) + // Request is completed immediately. + } + +// ----------------------------------------------------------------------------- +// CVtUiExecuteCmdDialog::CActiveCmd::RunError +// ----------------------------------------------------------------------------- +// +TInt CLcVtCmdExecutor::CActiveCmd::RunError( TInt aResult ) + { + __VTPRINTENTER( "CLcVtCmdExecutor.CActiveCmd.RunError" ) + // Exception was raised in RunL. Inform the dialog to close itself. + iExecutor.HandleExecuteFailed( aResult ); + __VTPRINTEXITR( "CLcVtCmdExecutor.CActiveCmd.RunError this=%d", (TInt)this ) + return KErrNone; + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/src/base/clcvtengine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/src/base/clcvtengine.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,59 @@ +/* +* Copyright (c) 2008 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: LiveComm Videotelephony Plugin Class +* +*/ + +#include +#include +#include +#include "clcvtengine.h" +#include "clcvtsession.h" +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CLcVtEngine* CLcVtEngine::NewL( TAny* aParams ) + { + CLcVtEngine* self = new ( ELeave ) CLcVtEngine; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +CLcVtEngine::~CLcVtEngine() + { + delete iSession; + } + +MLcSession& CLcVtEngine::Session() + { + return *iSession; + } + +void CLcVtEngine::ConstructL() + { + iSession = CLcVtSession::NewL(); + } + +CLcVtEngine::CLcVtEngine() : CLcEngine() + { + + } + +TBool CLcVtEngine::IsFeatureSupported( TLcFeature aLcFeature ) + { + return iSession->IsFeatureSupported( aLcFeature ); + } diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/src/base/clcvtsession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/src/base/clcvtsession.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,2317 @@ +/* +* Copyright (c) 2008 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: LiveComm Videotelephony Plugin session Class +* +*/ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "clcvtsession.h" + +#include "cvtengmodel.h" + +#include "clcvtvideoplayerbase.h" +#include "clcvtlocalvideoplayer.h" +#include "clcvtremotevideoplayer.h" +#include "tlcvtstates.h" +#include "clcvtcmdexecutor.h" +#include "mlcvtenginecommandmanager.h" +#include "lcvtplugincommand.h" +#include "lcvtutility.h" + +// Default call index. +const TInt KVtUiDefaultCallId = 1; + +// Granularity of command observer array. +const TInt KLcVtCommandObserverArrayGranularity = 5; + + + +// Enumerates states for CLcVtActiveExec. +enum + { + // Operation finished. Must equal to zero. + EVtSessionNone, + + // Active execution states for iActiveExec: + + // Startup (prepare engine): + EVtSessionStartup = 100, // 100 + // Initialise engine. + EVtSessionStartupInitEngine = EVtSessionStartup, // 100 + // Prepare viewfinder. + EVtSessionStartupPrepareViewfinder, // 101 + // Prepare remote render. + EVtSessionStartupPrepareRemoteRender, // 102 + // Startup Finish + EVtSessionStartupFinish, // 103 + + // Shutdown (reset engine): + EVtSessionShutdown = 300, // 300 + // Hide application. + EVtSessionShutdownHideApplication = EVtSessionShutdown, // 300 + // Reset engine. + EVtSessionShutdownResetEngine, // 301 + + + // Answered: + EVtSessionAnswered = 500, // 500 + // Start remote render. + EVtSessionAnsweredStartRemoteRender = EVtSessionAnswered, // 500 + // Prepare Camere + EVtSessionAnsweredDoPrepareCamera, // 501 + // Select camera as source. + EVtSessionAnsweredSetlectCamera, // 502 + // Select blank image as source. + EVtSessionAnsweredSetlectNone, + // Start view finder + EVtSessionAnsweredStartViewFinder, // 504 + // Show Application + EVtSessionAnsweredBringToForeground, // 505 + + //EVtSessionAnswered = 500, // 500 + //EVtSessionAnsweredBringToForeground = EVtSessionAnswered, // 505 + + // Finish. + EVtSessionAnsweredFinish // 506 + }; + + +/** + * Encapsulates event handling. + * @since Series 60 2.6 + */ +class CLcVtSession::CEventObserver + : public CBase, + public MLcVtEngineCommandManager, + public MVtEngEventObserver, +#ifndef NGA_VIDEO_RENDER + public MVtEngFrameObserver, +#endif + public MVtEngCommandObserver + { + public: // Constructors and destructors + + /** + * Two-phased constructor. + * @param aSession plugin session. + */ + static CEventObserver* NewL(CLcVtSession& aSession); + + /** + * Destructor. + */ + ~CEventObserver(); + + public: // Functions from base classes + + /** + * @see MLcVtEngineCommandManager::AddObserverL. + */ + void AddObserverL( MVtEngCommandObserver& aObserver ); + + /** + * @see MLcVtEngineCommandManager::RemoveObserver. + */ + void RemoveObserver( MVtEngCommandObserver& aObserver ); + + /** + * @see MVtEngEventObserver::HandleVtEventL. + */ + void HandleVtEventL( TInt aEvent ); + + /** + * @see MVtEngCommandObserver::HandleVTCommandPerformedL. + */ + void HandleVTCommandPerformedL( + TVtEngCommandId aCommand, + const TInt aError ); +#ifndef NGA_VIDEO_RENDER + /** + * @see MVtEngFrameObserver::vtHandleFrameL. + */ + void vtHandleFrameL( TFrameType aType, CFbsBitmap* aBitmap ); + + /** + * @see MVtEngFrameObserver::vtSetFrame + */ + void vtSetFrame( TFrameType aType, CFbsBitmap* aBitmap ); +#endif + private: + + /** + * Constructor. + * @param aSession plugin session. + */ + CEventObserver(CLcVtSession& aSession ); + + /** + * Symbian OS constructor. + */ + void ConstructL(); + + private: + + // Ref to plugin session. + CLcVtSession& iSession; + + // ETrue when command events are being sent. + TBool iInCommandPerformed; + + // Owned array of observers. + RPointerArray< MVtEngCommandObserver > iCommandObservers; + + }; + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CLcVtSession* CLcVtSession::NewL() + { + CLcVtSession* self = new ( ELeave ) CLcVtSession(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CLcVtSession::CLcVtSession( ) + { + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CLcVtSession::ConstructL() + { + + __VTPRINTENTER( "CLcVtSession.ConstructL" ) + + __VTPRINT( DEBUG_MEDIA , "FeatureManager::InitializeLibL()" ) + FeatureManager::InitializeLibL(); + + __VTPRINT( DEBUG_MEDIA , "iCameraHandler.SetSession(this)" ) + iCameraHandler.SetSession(this); + __VTPRINT( DEBUG_MEDIA , "iRemoteVideoPlayer = CLcVtRemoteVideoPlayer_NewL" ) + iRemoteVideoPlayer = CLcVtRemoteVideoPlayer::NewL(this, *this); + __VTPRINT( DEBUG_MEDIA , "iLocalVideoPlayer = CLcVtLocalVideoPlayer_NewL" ) + iLocalVideoPlayer = CLcVtLocalVideoPlayer::NewL(this, *this, iCameraHandler); + +#ifndef NGA_VIDEO_RENDER + iFbsStarted = EFalse; + + __VTPRINT( DEBUG_MEDIA , "iWsSession = &(CCoeEnv::Static()->WsSession())" ) + iWsSession = &(CCoeEnv::Static()->WsSession()); + __VTPRINT( DEBUG_MEDIA , "iWsSessionScreenDev = CCoeEnv::Static()->ScreenDevice()" ) + iWsSessionScreenDev = CCoeEnv::Static()->ScreenDevice(); + __VTPRINT( DEBUG_MEDIA , "iRootWin = &(CCoeEnv::Static()->RootWin())" ) + iRootWin = &(CCoeEnv::Static()->RootWin()); + + __VTPRINT( DEBUG_MEDIA , "ConnectFbsServerL()" ) + ConnectFbsServerL(); +#endif + __VTPRINT( DEBUG_MEDIA , "iEventObserver = CEventObserver_NewL" ) + iEventObserver = CEventObserver::NewL( *this ); + + iModel = CVtEngModel::NewL( *iEventObserver, *iEventObserver ); + + __VTPRINT( DEBUG_MEDIA , "iLcVtStates_new" ) + iLcVtStates = new ( ELeave ) TLcVtStates( *iModel ); + __VTPRINT( DEBUG_MEDIA , "iLcVtStates->Update()" ) + iLcVtStates->Update(); + + __VTPRINT( DEBUG_MEDIA , "new_iActiveExec" ) + iActiveExec = + new ( ELeave ) CLcVtActiveExec( CActive::EPriorityHigh ); + + __VTPRINT( DEBUG_MEDIA , "SetCallIdL( KVtUiDefaultCallId )" ) + SetCallIdL( KVtUiDefaultCallId ); + + __VTPRINT( DEBUG_MEDIA , "iAsyncCallback" ) + iAsyncCallback = + new ( ELeave ) CAsyncCallBack ( + TCallBack( &DoExit, this ), + CActive::EPriorityStandard ); +#if 0 + __VTPRINT( DEBUG_MEDIA , "iLayoutChangeCallback" ) + iLayoutChangeCallback = + new ( ELeave ) CAsyncCallBack( + TCallBack( &DelayedHandleLayoutChanged, this ), + CActive::EPriorityStandard ); +#endif + __VTPRINTEXIT( "CLcVtSession.ConstructL" ) + + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CLcVtSession::~CLcVtSession() + { + __VTPRINTENTER( "CLcVtSession.~CLcVtSession" ) + + //delete iLayoutChangeCallback; + delete iAsyncCallback; + +#ifndef NGA_VIDEO_RENDER + DisconnectFbsServer(); +#endif + delete iActiveExec; + delete iLcVtStates; + + delete iModel; + + delete iEventObserver; + iEventObserver = NULL; + +#ifdef NGA_VIDEO_RENDER + DestroyVideoWindows(); +#endif + + delete iLocalVideoPlayer; + delete iRemoteVideoPlayer; + + delete iRemoteDisplayName; + delete iRemoteDetails; + __VTPRINTEXIT( "CLcVtSession.~CLcVtSession" ) + FeatureManager::UnInitializeLib(); + } + +#ifndef NGA_VIDEO_RENDER +void CLcVtSession::ConnectFbsServerL() + { + // VT use bitmaps viewfinder now, So we start FBS server for proto demo + // and later we will use Qt image object to implement bitmaps view finder or we will use direct view finder + TInt err( KErrNone ); + // Start Font&Bitmap server + err = FbsStartup(); + if ( err == KErrNone ) + { + err = RFbsSession::Connect(); + if( err == KErrNone ) + { + iFbsStarted = ETrue; + } + } + + iDummy = new ( ELeave ) CFbsBitmap(); + //CleanupStack::PushL( iDummy ); + User::LeaveIfError( iDummy->Create( TSize( 4096, 1 ), EColor64K ) ); + + iGc = new (ELeave) CWindowGc( iWsSessionScreenDev ); + //CleanupStack::PushL( iGc ); + User::LeaveIfError( iGc->Construct()); + + //CleanupStack::Pop(2); + } + + +void CLcVtSession::DisconnectFbsServer() + { + delete iGc; + delete iDummy; + if ( iFbsStarted ) + { + RFbsSession::Disconnect(); + iFbsStarted = EFalse; + } + } +#endif +#ifdef NGA_VIDEO_RENDER + +_LIT(KVTWindowGroupName,"32VTPluginVideoWindow"); + +void CLcVtSession::CreateVideoWindowsL() + { + __VTPRINTENTER( "CLcVtSession.CreateVideoWindowsL" ) + User::LeaveIfError( iRwSession.Connect() ); + + iRwGroup = new (ELeave) RWindowGroup( iRwSession ) ; + iRwGroup->Construct( (TUint32)iRwGroup, EFalse ); + + iRwGroup->SetName( KVTWindowGroupName ); + iRwGroup->SetOrdinalPosition( 1 , ECoeWinPriorityNeverAtFront ); + iRwGroup->AutoForeground(EFalse); + + iDev = new (ELeave) CWsScreenDevice( iRwSession ); + iDev->Construct( ); + + iRemoteVideoWindow = new (ELeave) RWindow( iRwSession ); + iRemoteVideoWindow->Construct( *iRwGroup, (TUint32)iRemoteVideoWindow ); + + TRect RMRect = RemoteVideoPlayer()->LcWindow()->LcWindowRect(); + iRemoteVideoWindow->SetExtent( RMRect.iTl, RMRect.Size() ); + iRemoteVideoWindow->SetOrdinalPosition( 1, ECoeWinPriorityNeverAtFront ); + iRemoteVideoWindow->Activate(); + + iLocalVideoWindow = new (ELeave) RWindow( iRwSession ); + iLocalVideoWindow->Construct( *iRwGroup, (TUint32)iLocalVideoWindow ); + + TRect VFRect = LocalVideoPlayer()->LcWindow()->LcWindowRect(); + iLocalVideoWindow->SetExtent( VFRect.iTl, VFRect.Size() ); + iLocalVideoWindow->SetOrdinalPosition( 1, ECoeWinPriorityNeverAtFront ); + iLocalVideoWindow->Activate(); + + iRwSession.Flush(); + + __VTPRINTEXIT( "CLcVtSession.CreateVideoWindowsL" ) + } + +void CLcVtSession::DestroyVideoWindows() + { + + delete iDev; + iDev = NULL; + delete iRemoteVideoWindow; + iRemoteVideoWindow = NULL; + delete iLocalVideoWindow; + iLocalVideoWindow = NULL; + delete iRwGroup; + iRwGroup = NULL; + iRwSession.Close(); + } + +#endif + + +void CLcVtSession::SetLcSessionObserver( MLcSessionObserver* aObserver ) + { + iObserver = aObserver; + } + +void CLcVtSession::SetLcUiProvider( MLcUiProvider* aUiProvider ) + { + iUiProvider = aUiProvider; + } + +TBool CLcVtSession::IsBackgroundStartup() + { + return ETrue; + } + +TBool CLcVtSession::SendDialTone( TChar aKey ) + { + iDtmfTone = aKey; + __VTPRINT2( DEBUG_GEN, "CLcVtSession.SendDialTone: %d", iDtmfTone() ) + if ( Execute( KVtEngStartDtmfTone, &iDtmfTone ) != KErrNone ) + { + return EFalse; + } + else + { + return ETrue; + } + } + +void CLcVtSession::EstablishLcSessionL() + { + __VTPRINTENTER( "CLcVtSession.EstablishLcSessionL" ) + + TLcVtStateBase::SetInitialStateL( *this, *iLcVtStates ); + + __VTPRINTEXIT( "CLcVtSession.EstablishLcSessionL" ) + } + +void CLcVtSession::TerminateLcSessionL() + { + __VTPRINTENTER( "CLcVtSession.TerminateLcSessionL" ) + + HandleCommandL( EPluginCmdEndActiveCall ); + + __VTPRINTEXIT( "CLcVtSession.TerminateLcSessionL" ) + } + +MLcVideoPlayer* CLcVtSession::RemoteVideoPlayer() + { + return iRemoteVideoPlayer; + } + +MLcVideoPlayer* CLcVtSession::LocalVideoPlayer() + { + return iLocalVideoPlayer; + } + +MLcSession::TLcSessionState CLcVtSession::LcSessionState() const + { + return iSessionState; + } + +const TDesC& CLcVtSession::LocalDisplayName() + { + return KNullDesC; + } +const TDesC& CLcVtSession::RemoteDisplayName() + { + if ( iRemoteDisplayName ) + { + return *iRemoteDisplayName; + } + return KNullDesC; + } + +TInt CLcVtSession::SetParameter( TInt aId, TInt aValue ) + { + if (aId == 0) + iMainWindow = reinterpret_cast(aValue); + + return 0; + } + +TInt CLcVtSession::ParameterValue( TInt aId ) + { + return 0; + } + +const TDesC& CLcVtSession::RemoteDetails() + { + if ( iRemoteDetails ) + { + return *iRemoteDetails; + } + return KNullDesC; + } + +void CLcVtSession::UpdateLcSessionL() + { + __VTPRINTENTER( "CLcVtSession.UpdateLcSessionL" ) + + if(iLcVtStates->ExecState() != TLcVtStates::EExecStateRunning ) + { + __VTPRINTEXIT( "CLcVtSession.UpdateLcSessionL -- State Not OK" ) + return; + } +#if 0 + if(iLocalVideoPlayer->IsOrientationChanged()) + HandleLayoutChanged(); + else + UpdateRenderingParametersL(); +#endif + UpdateRenderingParametersL(); + __VTPRINTEXIT( "CLcVtSession.UpdateLcSessionL" ) + } + +// ----------------------------------------------------------------------------- +// From MLcAudioControl +// ----------------------------------------------------------------------------- +// +TBool CLcVtSession::IsLcAudioMutedL() + { + return EFalse; + } + +// ----------------------------------------------------------------------------- +// From MLcAudioControl +// ----------------------------------------------------------------------------- +// +void CLcVtSession::MuteLcAudioL( TBool aMute ) + { + } + +// ----------------------------------------------------------------------------- +// From MLcAudioControl +// ----------------------------------------------------------------------------- +// +TBool CLcVtSession::IsLcMicMutedL() + { + TBool result = !(iLcVtStates->AudioState().IsAudio()); + __VTPRINT2( DEBUG_GEN, "CLcVtSession.IsLcMicMutedL = %d", result ) + return result; + } + +// ----------------------------------------------------------------------------- +// From MLcAudioControl +// ----------------------------------------------------------------------------- +// +void CLcVtSession::MuteLcMicL( TBool aMute ) + { + __VTPRINT2( DEBUG_GEN, "CLcVtSession.MuteLcMicL aMute = %d", aMute ) + + if(aMute) + { + HandleCommandL(EPluginCmdDisableAudio); + } + else + { + HandleCommandL(EPluginCmdEnableAudio); + } + } + +// ----------------------------------------------------------------------------- +// From MLcAudioControl +// ----------------------------------------------------------------------------- +// +TBool CLcVtSession::IsEnablingLcLoudspeakerAllowed() + { + return ETrue; + } + +// ----------------------------------------------------------------------------- +// From MLcAudioControl +// ----------------------------------------------------------------------------- +// +void CLcVtSession::EnableLcLoudspeakerL( TBool aEnabled ) + { + __VTPRINT2( DEBUG_GEN, "CLcVtSession.EnableLcLoudspeakerL aEnabled = %d", aEnabled ) + + if(aEnabled) + { + HandleCommandL(EPluginCmdActivateLoudspeaker); + } + else + { + HandleCommandL(EPluginCmdDeactivateLoudspeaker); + } + } + +// ----------------------------------------------------------------------------- +// From MLcAudioControl +// ----------------------------------------------------------------------------- +// +TBool CLcVtSession::IsLcLoudspeakerEnabled() + { + TBool result = !(iLcVtStates->AudioState().CanActivateLoudspeaker()); + __VTPRINT2( DEBUG_GEN, "CLcVtSession.IsLcLoudspeakerEnabled = %d", result ) + return result; + } + +// ----------------------------------------------------------------------------- +// From MLcAudioControl +// ----------------------------------------------------------------------------- +// +TInt CLcVtSession::LcVolumeL() + { + MVtEngAudio& audio = iModel->Audio(); + MVtEngAudio::TAudioRoutingState audioRouting; + User::LeaveIfError( audio.GetRoutingState( audioRouting ) ); + const TInt volume( audio.OutputVolume( + !( audioRouting == MVtEngAudio::EAudioLoudspeaker ) ) ); + + return volume; + } + +// ----------------------------------------------------------------------------- +// From MLcAudioControl +// ----------------------------------------------------------------------------- +// +void CLcVtSession::SetLcVolumeL( TInt aValue ) + { + __VTPRINTENTER( "CLcVtSession.SetLcVolumeL" ) + MVtEngAudio& audio = iModel->Audio(); + const TInt HandsetVolume( audio.OutputVolume(ETrue) ); + const TInt HandsfreeVolume( audio.OutputVolume(EFalse) ); + MVtEngAudio::TVtEngOutputVolume volume; + volume.iHandsetVolume = HandsetVolume; + volume.iHandsfreeVolume = HandsfreeVolume; + + MVtEngAudio::TAudioRoutingState audioRouting; + User::LeaveIfError( audio.GetRoutingState( audioRouting ) ); + if(audioRouting == MVtEngAudio::EAudioHandset) + volume.iHandsetVolume = aValue; + else + volume.iHandsfreeVolume = aValue; + + ExecuteCmdL( KVtEngSetAudioVolume, volume ); + __VTPRINTEXIT( "CLcVtSession.SetLcVolumeL" ) + } + +// ----------------------------------------------------------------------------- +// From MLcAudioControl +// ----------------------------------------------------------------------------- +// +void CLcVtSession::IncreaseLcVolumeL() + { + ExecuteCmdL( KVtEngIncreaseAudioVolume ); + } + +// ----------------------------------------------------------------------------- +// From MLcAudioControl +// ----------------------------------------------------------------------------- +// +void CLcVtSession::DecreaseLcVolumeL() + { + ExecuteCmdL( KVtEngDecreaseAudioVolume ); + } + +CVtEngModel& CLcVtSession::Model() + { + return *iModel; + } + + +void CLcVtSession::HandleCommandL(const TInt aCommand) + { + + __VTPRINTENTER( "CLcVtSession.HandleCommandL" ) + + if ( iLcVtStates->ExecState() != TLcVtStates::EExecStateRunning ) + { + __VTPRINTEXIT( "CLcVtSession.HandleCommandL NOT ready" ) + return; + } + + if ( iState->HandleCommandL( aCommand ) == TLcVtStateBase::EEventHandled ) + { + __VTPRINTEXIT( "CLcVtSession.HandleCommandL 0" ) + return; + } + + __VTPRINT2( DEBUG_GEN, "CLcVtSession.HandleCommandL command = %d", aCommand ) + + switch ( aCommand ) + { + case EPluginCmdEnableAudio: + CmdEnableAudioL(); + break; + + case EPluginCmdDisableAudio: + CmdDisableAudioL(); + break; + + case EPluginCmdUsePrimaryCamera: + CmdUseCameraL( ETrue ); + break; + + case EPluginCmdUseSecondaryCamera: + CmdUseCameraL( EFalse ); + break; + + case EPluginCmdEnableVideo: + CmdEnableVideoL(); + break; + + case EPluginCmdDisableVideo: + CmdDisableVideoL(); + break; + + case EPluginCmdActivateLoudspeaker: + CmdActivateLoudspeakerL(); + break; + + case EPluginCmdDeactivateLoudspeaker: + CmdDeactivateLoudspeakerL(); + break; + + } + + __VTPRINTEXIT( "CLcVtSession.HandleCommandL" ) + + iLcVtStates->Update(); + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::CmdEnableAudioL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::CmdEnableAudioL() + { + ExecuteCmdL( KVtEngUnmuteOutgoingAudio ); + iLcVtStates->Update(); + } + + +// ----------------------------------------------------------------------------- +// CLcVtSession::CmdDisableAudioL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::CmdDisableAudioL() + { + ExecuteCmdL( KVtEngMuteOutgoingAudio ); + iLcVtStates->Update(); + } + + +// ----------------------------------------------------------------------------- +// CLcVtSession::CmdUseCameraL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::CmdUseCameraL( const TBool aPrimaryCamera ) + { + + MVtEngMedia& media = iModel->Media(); + + MVtEngMedia::TMediaSource selectedSource = + ( aPrimaryCamera ) ? + MVtEngMedia::EMediaCameraPri : MVtEngMedia::EMediaCameraSec; + + TInt available = 0; + LcVtUtility::GetOutgoingMediaState( media, available ); + if ( available & MVtEngMedia::EMediaVideo ) + { + ExecuteCmdL( KVtEngStopViewFinder ); + + TRAPD( err, ExecuteCmdL( KVtEngSetSource, selectedSource ) ); + + if ( err == KErrNone ) + { + ExecuteCmdL( KVtEngStartViewFinder ); + } + else + { + //ShowOtherCameraNotUsableNoteL(); + } + } + else + { + /* + MVtEngMedia::TPrepareCameraParams params; + params.iMediaSource = selectedSource; + params.iInitialize = EFalse; + TRAPD( err, ExecuteCmdL( KVtEngPrepareCamera, params ) ); + if ( err != KErrNone ) + { + ShowOtherCameraNotUsableNoteL(); + } + */ + } + + } + + +// ----------------------------------------------------------------------------- +// CLcVtSession::CmdEnableVideoL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::CmdEnableVideoL() + { + // if outgoing video is frozen + MVtEngMedia& media = iModel->Media(); + if ( LcVtUtility::GetFreezeState( media ) ) + { + ExecuteCmdL( KVtEngUnfreeze ); + // swap images if needed + //RestoreViewFinderL(); + } + else + { + ExecuteCmdL( KVtEngStopViewFinder ); + //iUplinkWindow->SetStreamBitmap( NULL ); + MVtEngMedia::TMediaSource source = MVtEngMedia::EMediaCamera; + ExecuteCmdL( KVtEngSetSource, source ); + MVtEngMedia::TCameraId id; + if ( iModel->Media().GetCurrentCameraId( id ) == KErrInUse ) + { + //ShowCameraInUseNoteL(); + } + ExecuteCmdL( KVtEngStartViewFinder ); + } + // update VB settings + //UpdateVBSettingL(); + iLcVtStates->Update(); + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::CmdDisableVideoL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::CmdDisableVideoL() + { + ExecuteCmdL( KVtEngStopViewFinder ); + + //iUplinkWindow->SetStreamBitmap( NULL ); + + TInt err = KErrNotFound; + if ( LcVtUtility::HasStillImage( iModel->Media() ) ) + { + __VTPRINT( DEBUG_GEN, "VtUi.:CmdDisableVideoL.HasStill" ) + MVtEngMedia::TMediaSource source = MVtEngMedia::EMediaStillImage; + TRAP( err, ExecuteCmdL( KVtEngSetSource, source ) ); + } + if ( ( err != KErrNone ) ) + { + __VTPRINT( DEBUG_GEN, "VtUi.:CmdDisableVideoL.MediaNone" ) + MVtEngMedia::TMediaSource source = MVtEngMedia::EMediaNone; + ExecuteCmdL( KVtEngSetSource, source ); + } + + ExecuteCmdL( KVtEngStartViewFinder ); + iLcVtStates->Update(); + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::CmdActivateLoudspeakerL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::CmdActivateLoudspeakerL() + { + MVtEngAudio::TVtEngRoutingSetting audioSetting = + MVtEngAudio::EActivateHandsfree; + ExecuteCmdL( KVtEngSetAudioRouting, audioSetting ); + iLcVtStates->Update(); + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::CmdDeactivateLoudspeakerL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::CmdDeactivateLoudspeakerL() + { + MVtEngAudio::TVtEngRoutingSetting audioSetting = + MVtEngAudio::EDeactivateHansfree; + ExecuteCmdL( KVtEngSetAudioRouting, audioSetting ); + iLcVtStates->Update(); + } + + +// ----------------------------------------------------------------------------- +// CLcVtSession::SetZoomFactorL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::SetZoomFactorL( TInt aZoomStep ) + { + __VTPRINTENTER( "CLcVtSessionCLcVtSession.SetZoomFactorL" ) + MVtEngMedia& media = iModel->Media(); + if ( LcVtUtility::IsZoomAllowed( media ) ) + { + ExecuteCmdL( KVtEngSetZoomStep, aZoomStep ); + } + __VTPRINTEXIT( "CLcVtSession.SetZoomFactorL" ) + } + +#ifndef NGA_VIDEO_RENDER +//local video display, VT use bitmaps vf now, and maybe replace by direct vf later +void CLcVtSession::vtHandleFrameL( CFbsBitmap* aBitmap ) + { + __VTPRINTENTER( "CLcVtSession.vtHandleFrameL" ) + + /* + TRect VFRect = LocalVideoPlayer()->LcWindow()->LcWindowRect(); + const TPoint KVFcordinate( VFRect.iTl.iX, VFRect.iTl.iY ); + iMainWindow->Invalidate(); + iMainWindow->BeginRedraw(); + iGc->Activate( *iMainWindow ); + aBitmap->BeginDataAccess(); + aBitmap->EndDataAccess(); + iGc->BitBlt( KVFcordinate , aBitmap ); + iGc->Deactivate(); + iMainWindow->EndRedraw(); + */ + + /* + TRect VFRect = LocalVideoPlayer()->LcWindow()->LcWindowRect(); + const TPoint KVFcordinate( VFRect.iTl.iX -2 , VFRect.iTl.iY - 168 ); + iLocalVideoWindow->Invalidate(); + iLocalVideoWindow->BeginRedraw(); + iGc->Activate( *iLocalVideoWindow ); + iGc->BitBlt( KVFcordinate , aBitmap ); + iGc->Deactivate(); + iLocalVideoWindow->EndRedraw(); + */ + + __VTPRINTEXIT("CLcVtSession.vtHandleFrameL") + } +#endif + +TInt CLcVtSession::SetForegroundStatus( TBool aIsForeground ) +{ + __VTPRINTENTER( "CLcVtSession.SetForegroundStatus" ) + __VTPRINT2( DEBUG_MEDIA , " foreground: %d", aIsForeground ) + + if ( iRwGroup ) + { + TInt priority = aIsForeground ? ECoeWinPriorityNormal : ECoeWinPriorityNeverAtFront; + iRwGroup->SetOrdinalPosition( 1 , priority ); + iRemoteVideoWindow->SetOrdinalPosition( 1 , priority ); + iLocalVideoWindow->SetOrdinalPosition( 1 , priority ); + iRwSession.Flush(); + } + __VTPRINTEXIT( "CLcVtSession.SetForegroundStatus" ) + + return KErrNone; +} + +// ----------------------------------------------------------------------------- +// CLcVtSession::ShutdownL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::ShutdownL() + { + __VTPRINTENTER( "CLcVtSession.ShutdownL" ) + iActiveExec->Start( EVtSessionShutdown, *this ); + __VTPRINTEXIT( "CLcVtSession.ShutdownL" ) + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::StartupPhase1L +// ----------------------------------------------------------------------------- +// +void CLcVtSession::StartupPhase1L() + { + __VTPRINTENTER( "CLcVtSession.StartupPhase1L" ) + iActiveExec->Start( EVtSessionStartup, *this ); + __VTPRINTEXIT( "CLcVtSession.StartupPhase1L" ) + } + + +// ----------------------------------------------------------------------------- +// CLcVtSession::StartupPhase2L +// ----------------------------------------------------------------------------- +// +void CLcVtSession::StartupPhase2L() + { + __VTPRINTENTER( "CLcVtSession.StartupPhase2L" ) + iActiveExec->Start( EVtSessionAnswered, *this ); + __VTPRINTEXIT( "CLcVtSession.StartupPhase2L" ) + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::ActiveExecExecuteL +// ----------------------------------------------------------------------------- +// +TBool CLcVtSession::ActiveExecExecuteL( + CLcVtActiveExec& /*aActiveExec*/, + const TInt aState, + TInt& aNextState, + TRequestStatus& aRequest ) + { + return ActiveExecInitExecuteL( + aState, + aNextState, + aRequest ); + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::ActiveExecContinue +// ----------------------------------------------------------------------------- +// +TBool CLcVtSession::ActiveExecContinue( + CLcVtActiveExec& /*aActiveExec*/, + TInt& aState, + const TInt aError ) + { + return ActiveExecInitContinue( aState, aError ); + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::ActiveExecCancel +// ----------------------------------------------------------------------------- +// +void CLcVtSession::ActiveExecCancel( + CLcVtActiveExec& /*aActiveExec*/, + TInt aState ) + { + ActiveExecInitCancel( aState ); + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::ActiveExecDone +// ----------------------------------------------------------------------------- +// +void CLcVtSession::ActiveExecDone( + CLcVtActiveExec& /*aActiveExec*/, + const TInt aInitialState ) + { + ActiveExecInitDone( aInitialState ); + } + + +// ----------------------------------------------------------------------------- +// CLcVtSession::ActiveExecInitCancel +// ----------------------------------------------------------------------------- +// +void CLcVtSession::ActiveExecInitCancel( + const TInt /*aState*/ ) + { + __VTPRINTENTER( "CLcVtSession.InitExecCancel" ) + + delete iCmdExecutor; + + if ( iShutdownRequest ) + { + User::RequestComplete( iShutdownRequest, KErrCancel ); + iShutdownRequest = NULL; + } + __VTPRINTEXIT( "CLcVtSession.InitExecCancel" ) + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::ActiveExecInitDone +// ----------------------------------------------------------------------------- +// +void CLcVtSession::ActiveExecInitDone( + const TInt aInitialState ) + { + __VTPRINTENTER( "CLcVtSession.ExecInitDone" ) + __VTPRINT2( DEBUG_GEN, "CLcVtSession.InitExecDone.ini=%d", aInitialState ) + // Operation succeeded + + // Now we have finished. + if ( iState ) + { + if ( aInitialState == EVtSessionAnswered ) + { + TRAP_IGNORE( iState->LcVtStartupPhase2DoneL() ); + iSessionState = EOpen; + iObserver->StateChanged( *this ); + } + else if ( aInitialState == EVtSessionShutdown ) + { + TRAP_IGNORE( iState->ShutdownDoneL() ); + } + else // EVtSessionStartup + { + TRAP_IGNORE( iState->LcVtStartupPhase1DoneL() ); + } + } + __VTPRINTEXIT( "CLcVtSession.ExecInitDone" ) + } + + +// ----------------------------------------------------------------------------- +// CLcVtSession::ActiveExecInitExecuteL +// ----------------------------------------------------------------------------- +// +TBool CLcVtSession::ActiveExecInitExecuteL( + const TInt aState, + TInt& aNextState, + TRequestStatus& aRequest ) + { + __VTPRINTENTER( "CLcVtSession.ActiveExecInitExecuteL" ) + __VTPRINT2( DEBUG_GEN, "CLcVtSession.ActiveExecInitExecuteL.st=%d", aState ) + + TBool synch = EFalse; + + switch ( aState ) + { + // Startup chain: + case EVtSessionStartupInitEngine: + //ChangeApplicationFocus(ETrue); +#if defined (__WINS__) + ActiveExecInitExecuteCommandL( KVtEngInitializeEngineDiag, aRequest ); +#else + ActiveExecInitExecuteCommandL( KVtEngInitializeEngine, aRequest ); +#endif + aNextState = EVtSessionStartupPrepareViewfinder; + //aNextState = EVtSessionStartupFinish; + break; + + case EVtSessionStartupPrepareViewfinder: + //iSessionState = EOpen; + //iObserver->StateChanged( *this ); + +#ifdef NGA_VIDEO_RENDER + CreateVideoWindowsL(); +#endif + ActiveExecInitPrepareViewFinderL( aRequest ); + aNextState = EVtSessionStartupPrepareRemoteRender; + break; + + case EVtSessionStartupPrepareRemoteRender: + ActiveExecInitPrepareRemoteRenderL( aRequest ); + aNextState = EVtSessionStartupFinish; + break; + + case EVtSessionStartupFinish: + aNextState = EVtSessionNone; + synch = ETrue; + break; + + + // Shutdown chain: + case EVtSessionShutdownHideApplication: + ChangeApplicationFocus( EFalse ); + synch = ETrue; + aNextState = EVtSessionShutdownResetEngine; + break; + case EVtSessionShutdownResetEngine: + { + aRequest = KRequestPending; + + MVtEngCommandHandler& command = iModel->CommandHandler(); + // There should not be any commands ongoing because + // we have canceled all dialogs (and this should + // be the only command without dialog). + command.CancelCommand( command.PendingCommand() ); // ignore error + command.ExecuteL( KVtEngResetEngine, NULL ); + iShutdownRequest = &aRequest; + + aNextState = EVtSessionNone; + } + break; + + + + // Answered chain: + case EVtSessionAnsweredStartRemoteRender: + { + ActiveExecInitExecuteCommandL( KVtEngStartRenderRemote, aRequest ); + //TRequestStatus* status = &aRequest; + //User::RequestComplete( status, KErrNone ); + + MVtEngSessionInfo& session = iModel->Session(); + MVtEngMedia& media = iModel->Media(); + if ( LcVtUtility::HasCameras( media ) ) + { + //aNextState = EVtSessionAnsweredDoPrepareCamera; + aNextState = EVtSessionAnsweredSetlectNone; + } + else + { + aNextState = EVtSessionAnsweredSetlectNone; + } + } + break; + + case EVtSessionAnsweredSetlectNone: + { + ActiveExecInitSetSourceL( MVtEngMedia::EMediaNone, aRequest ); + aNextState = EVtSessionAnsweredStartViewFinder; + } + break; + case EVtSessionAnsweredDoPrepareCamera: + { + MVtEngMedia& media = iModel->Media(); + MVtEngMedia::TMediaSource source = MVtEngMedia::EMediaCamera; + ActiveExecInitPrepareCameraL( source, aRequest ); + aNextState = EVtSessionAnsweredSetlectCamera; + } + break; + + case EVtSessionAnsweredSetlectCamera: + ActiveExecInitSetSourceL( MVtEngMedia::EMediaCamera, aRequest ); + aNextState = EVtSessionAnsweredStartViewFinder; + break; + + case EVtSessionAnsweredStartViewFinder: + ActiveExecInitExecuteCommandL( KVtEngStartViewFinder, aRequest ); + aNextState = EVtSessionAnsweredBringToForeground; + break; + + case EVtSessionAnsweredBringToForeground: + { + //CreateVideoWindowsL(); + + ChangeApplicationFocus(ETrue); + TRequestStatus* status = &aRequest; + User::RequestComplete( status, KErrNone ); + aNextState = EVtSessionAnsweredFinish; + } + break; + + case EVtSessionAnsweredFinish: + { + //iRwGroup->SetOrdinalPosition( 1 , ECoeWinPriorityNormal ); + + TBool handleAsForeground( ETrue ); + TPtrC8 params( reinterpret_cast< TUint8* >( &handleAsForeground ), sizeof( TBool ) ); + MVtEngCommandHandler& command = iModel->CommandHandler(); + TRAPD( err, command.ExecuteL( KVtEngSetUIForeground, ¶ms )); + if(err != KErrNone) + { + err = KErrNone; + } + + iLcVtStates->Update(); + + iObserver->StateChanged( *iLocalVideoPlayer ); + iObserver->StateChanged( *iRemoteVideoPlayer ); + + synch = ETrue; + aNextState = EVtSessionNone; + } + break; + } + + __VTPRINT2( DEBUG_GEN, "CLcVtSession.ActiveExecInitExecuteL.sync=%d", synch ) + __VTPRINT2( DEBUG_GEN, "CLcVtSession.ActiveExecInitExecuteL.next=%d", aNextState ) + __VTPRINTEXITR( "CLcVtSession.ActiveExecInitExecuteL %d", synch ) + return synch; + + } + + +// ----------------------------------------------------------------------------- +// CLcVtSession::ActiveExecInitContinue +// ----------------------------------------------------------------------------- +// +TBool CLcVtSession::ActiveExecInitContinue( + TInt& aState, + const TInt /*aError*/ ) + { + __VTPRINTENTER( "CLcVtSession.InitExecCont" ) + __VTPRINT2( DEBUG_GEN, "CLcVtSession.InitExecCont.st=%d", aState ) + + const TBool cont = EFalse; + __VTPRINT2( DEBUG_GEN, "VtUi.InitExecCont.cont=%d", cont ) + + if ( !cont ) + { + // Operation failed. + if ( iState ) + { + TRAP_IGNORE( iState->LcVtStartupFailedL() ); + } + } + __VTPRINTEXITR( "VtUi.InitExecCont %d", cont ) + return cont; + } + + +// ----------------------------------------------------------------------------- +// CLcVtSession::ActiveExecInitExecuteCommandL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::ActiveExecInitExecuteCommandL( + const TVtEngCommandId aCommand, + TRequestStatus& aRequest ) + { + iCmdExecutor = + ExecuteCmdAsyncL( + &iCmdExecutor, + aCommand, + aRequest ); + } + + +// ----------------------------------------------------------------------------- +// CLcVtSession::ActiveExecInitPrepareViewFinderL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::ActiveExecInitPrepareViewFinderL( + TRequestStatus& aRequest ) + { + + __VTPRINTENTER( "CLcVtSession.ActiveExecInitPrepareViewFinderL" ) + + TRect VFRect = LocalVideoPlayer()->LcWindow()->LcWindowRect(); + TSize size (VFRect.Size()); + +#ifdef NGA_VIDEO_RENDER + + __VTPRINT3(DEBUG_GEN, "CLcVtSession.ActiveExecInitPrepareViewFinderL size(%d,%d)", size.iWidth, size.iHeight ) + + iLocalVideoWindow->SetPosition( VFRect.iTl ); + iLocalVideoWindow->SetSize( VFRect.Size() ); + + iRwSession.Flush(); + + __VTPRINT2( DEBUG_MEDIA , " LocalVideoPlayer.VFRect.iTl.iX: %d", VFRect.iTl.iX ) + __VTPRINT2( DEBUG_MEDIA , " LocalVideoPlayer.VFRect.iTl.iY: %d", VFRect.iTl.iY ) + __VTPRINT2( DEBUG_MEDIA , " LocalVideoPlayer.VFRect.iWidth: %d", VFRect.Width() ) + __VTPRINT2( DEBUG_MEDIA , " LocalVideoPlayer.VFRect.iHeight: %d", VFRect.Height() ) + + TVtEngRenderingOptionsNGA configViewfinder( *iLocalVideoWindow, iRwSession ); + iCmdExecutor = + ExecuteCmdAsyncL( + &iCmdExecutor, + KVtEngPrepareViewFinder, + configViewfinder, + aRequest ); + + + /* + TPoint point( 0, 0 ); + TRect vfRect( point, size ); + + TVtEngRenderingOptionsDSA configViewfinder(*iEventObserver, iRwSession ,*iDev, *iLocalVideoWindow, vfRect, vfRect); + + iCmdExecutor = + ExecuteCmdAsyncL( + &iCmdExecutor, + KVtEngPrepareViewFinderDSA, + configViewfinder, + aRequest ); + */ + +#else + + __VTPRINT3(DEBUG_GEN, "CLcVtSession.ActiveExecInitPrepareViewFinderL size(%d,%d)", size.iWidth, size.iHeight ) + + TVtEngRenderingOptions configViewfinder(*iEventObserver, size); + + iCmdExecutor = + ExecuteCmdAsyncL( + &iCmdExecutor, + KVtEngPrepareViewFinder, + configViewfinder, + aRequest ); + +#endif + } + + +// ----------------------------------------------------------------------------- +// CLcVtSession::ActiveExecInitPrepareRemoteRenderL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::ActiveExecInitPrepareRemoteRenderL( + TRequestStatus& aRequest ) + { + + TRect RMRect = RemoteVideoPlayer()->LcWindow()->LcWindowRect(); + const TSize KRMsize( RMRect.Size()); + TRect screen( KRMsize ); + TRect clip( KRMsize ); + +#ifdef NGA_VIDEO_RENDER + + iRemoteVideoWindow->SetPosition( RMRect.iTl ); + iRemoteVideoWindow->SetSize( RMRect.Size() ); + + iRwSession.Flush(); + + __VTPRINT2( DEBUG_MEDIA , " RemoteVideoPlayer.RMRect.iTl.iX: %d", RMRect.iTl.iX ) + __VTPRINT2( DEBUG_MEDIA , " RemoteVideoPlayer.RMRect.iTl.iY: %d", RMRect.iTl.iY ) + __VTPRINT2( DEBUG_MEDIA , " RemoteVideoPlayer.RMRect.iWidth: %d", RMRect.Width() ) + __VTPRINT2( DEBUG_MEDIA , " RemoteVideoPlayer.RMRect.iHeight: %d", RMRect.Height() ) + + + TVtEngRenderingOptionsNGA configRemoteRender( *iRemoteVideoWindow, iRwSession ); + iCmdExecutor = + ExecuteCmdAsyncL( + &iCmdExecutor, + KVtEngPrepareRemoteRenderNGA, + configRemoteRender, + aRequest ); + +#else + + const TPoint KRMcordinate( RMRect.iTl.iX, RMRect.iTl.iY ); + + TVtEngRenderingOptionsDP configRemoteRender(*iEventObserver, *iWsSession ,*iWsSessionScreenDev, *iMainWindow, screen, clip, KRMcordinate ); + + iCmdExecutor = + ExecuteCmdAsyncL( + &iCmdExecutor, + KVtEngPrepareRemoteRenderDP, + configRemoteRender, + aRequest ); + +#endif + + } + + +// ----------------------------------------------------------------------------- +// CLcVtSession::ActiveExecInitPrepareCameraL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::ActiveExecInitPrepareCameraL( + const MVtEngMedia::TMediaSource aSource, + TRequestStatus& aRequest ) + { + MVtEngMedia::TPrepareCameraParams params; + params.iMediaSource = aSource; + params.iInitialize = ETrue; + iCmdExecutor = + ExecuteCmdAsyncL( + &iCmdExecutor, + KVtEngPrepareCamera, + params, + aRequest ); + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::ActiveExecInitSetSourceL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::ActiveExecInitSetSourceL( + const MVtEngMedia::TMediaSource aSource, + TRequestStatus& aRequest ) + { + MVtEngMedia::TMediaSource source = + aSource; + iCmdExecutor = + ExecuteCmdAsyncL( + &iCmdExecutor, + KVtEngSetSource, + source, + aRequest ); + } + + +// ----------------------------------------------------------------------------- +// CLcVtSession::ExecuteCmdAsyncL +// ----------------------------------------------------------------------------- +// +CLcVtCmdExecutor* CLcVtSession::ExecuteCmdAsyncL( + CLcVtCmdExecutor** aDialogPtr, + const TVtEngCommandId aCommand, + TRequestStatus& aStatus ) + { + return DoExecuteCmdAsyncL( aDialogPtr, aCommand, NULL, aStatus ); + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::ExecuteCmdAsyncL +// ----------------------------------------------------------------------------- +// +template< class T > +CLcVtCmdExecutor* CLcVtSession::ExecuteCmdAsyncL( + CLcVtCmdExecutor** aDialogPtr, + const TVtEngCommandId aCommand, + T& aParam, + TRequestStatus& aStatus ) + { + TPtrC8 params( reinterpret_cast< TUint8* >( &aParam ), sizeof( T ) ); + return DoExecuteCmdAsyncL( aDialogPtr, aCommand, ¶ms, aStatus ); + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::DoExecuteCmdAsyncL +// ----------------------------------------------------------------------------- +// +CLcVtCmdExecutor* CLcVtSession::DoExecuteCmdAsyncL( + CLcVtCmdExecutor** aDialogPtr, + const TVtEngCommandId aCommand, + TDesC8* aParams, + TRequestStatus& aStatus ) + { + __VTPRINT2( DEBUG_GEN, "CLcVtSession.DoExecAsync.cmd=%d", aCommand ) + MVtEngCommandHandler& command = iModel->CommandHandler(); + const TInt caps = command.GetCommandCaps( aCommand ); + + if ( caps >= KErrNone ) + { + const TBool asynchronous = + ( caps & MVtEngCommandHandler::EAttribAsync ); + + if ( asynchronous ) + { + CLcVtCmdExecutor* executor = + new ( ELeave ) CLcVtCmdExecutor( + aDialogPtr, + iModel->CommandHandler(), + *iEventObserver ); + executor->ExecuteCmdL( aCommand, aParams, &aStatus ); + return executor; + } + else + { + command.ExecuteL( aCommand, aParams ); + RefreshStatesL(); + TRequestStatus* status = &aStatus; + User::RequestComplete( status, KErrNone ); + } + } + else + { + // Failed. + User::Leave( caps ); + } + + return NULL; + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::ExecuteCmdL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::ExecuteCmdL( const TVtEngCommandId aCommand ) + { + DoExecuteCmdL( aCommand, NULL ); + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::ExecuteCmdL +// ----------------------------------------------------------------------------- +// +template< class T > +void CLcVtSession::ExecuteCmdL( + const TVtEngCommandId aCommand, + T& aParam ) + { + TPtrC8 params( reinterpret_cast< TUint8* >( &aParam ), sizeof( T ) ); + DoExecuteCmdL( aCommand, ¶ms ); + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::DoExecuteCmdL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::DoExecuteCmdL( + const TVtEngCommandId aCommand, + TDesC8* aParams ) + { + __VTPRINT2( DEBUG_GEN, "CLcVtSession.DoExec.cmd=%d", aCommand ) + MVtEngCommandHandler& command = iModel->CommandHandler(); + const TInt caps = command.GetCommandCaps( aCommand ); + + if ( caps >= KErrNone ) + { + const TBool asynchronous = + ( caps & MVtEngCommandHandler::EAttribAsync ); + + if ( asynchronous ) + { + CLcVtCmdExecutor* executor = + new ( ELeave ) CLcVtCmdExecutor( + NULL, + iModel->CommandHandler(), + *iEventObserver ); + iUiProvider->BlockUi(ETrue); + //executor->ExecuteCmdL( aCommand, aParams, NULL ); + TRAPD( err, executor->ExecuteCmdL( aCommand, aParams, NULL ) ); + iUiProvider->BlockUi(EFalse); + if(err != KErrNone) + User::Leave(err); + + } + else + { + command.ExecuteL( aCommand, aParams ); + RefreshStatesL(); + } + } + else + { + // Failed. + User::Leave( caps ); + } + } + + +// ----------------------------------------------------------------------------- +// CLcVtSession::Execute +// ----------------------------------------------------------------------------- +// +TInt CLcVtSession::Execute( const TVtEngCommandId aCommand, TDesC8* aParam ) + { + MVtEngCommandHandler& command = iModel->CommandHandler(); + TRAPD( err, command.ExecuteL( aCommand, aParam ) ); +#ifdef VTDEBUG + if ( err != KErrNone ) + { + __VTPRINT3( DEBUG_GEN, "CLcVtSession.Execute.Nok.cmd=%d,err=%d", aCommand, err ) + } +#endif // VTDEBUG + return err; + } + + +// ----------------------------------------------------------------------------- +// CLcVtSession::ChangeApplicationFocus +// ----------------------------------------------------------------------------- +// +void CLcVtSession::ChangeApplicationFocus( const TBool aForeground ) + { + __VTPRINTENTER( "CLcVtSession.ChangeApplicationFocus" ) + if ( iUiProvider ){ + iUiProvider->HandleForegroundStatus(aForeground); + } + __VTPRINTEXIT( "CLcVtSession.ChangeApplicationFocus" ) + } + + +// ----------------------------------------------------------------------------- +// CLcVtSession::ChangeState +// ----------------------------------------------------------------------------- +// +void CLcVtSession::ChangeState( TLcVtStateBase* aState ) + { + __VTPRINTENTER( "CLcVtSession.ChangeState" ) + iState = aState; + __VTPRINTEXIT( "CLcVtSession.ChangeState" ) + } + +#if 0 +// ----------------------------------------------------------------------------- +// CLcVtSession::StartDtmfTone +// ----------------------------------------------------------------------------- +// +void CLcVtSession::StartDtmfTone( const TChar& aTone ) + { + // should be called only through current application state + iDtmfTone = aTone; + __VTPRINT2( DEBUG_GEN, "CLcVtSession.DTMF.Start.%d", iDtmfTone() ) + if ( Execute( KVtEngStartDtmfTone, &iDtmfTone ) != KErrNone ) + { + iDtmfTone = 0; + } + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::StopDtmfTone +// ----------------------------------------------------------------------------- +// +void CLcVtSession::StopDtmfTone() + { + // should be called only through current application state + if ( iDtmfTone() ) + { + __VTPRINT( DEBUG_GEN, "CLcVtSession.DTMF.STOP" ) + (void) Execute( KVtEngStopDtmfTone, NULL ); + iDtmfTone = 0; + } + } +#endif +// ----------------------------------------------------------------------------- +// CLcVtSession::SetCallIdL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::SetCallIdL( const TInt aCallId ) + { + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::SetCallNameL +// ----------------------------------------------------------------------------- +// +TBool CLcVtSession::SetCallNameL( const TDesC& aName ) + { + HBufC* name = aName.AllocL(); + delete iRemoteDisplayName; + iRemoteDisplayName = name; + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::SetCallNameL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::SetCallNumberL( const TDesC& aNumber ) + { + HBufC* number = aNumber.AllocL(); + delete iRemoteDetails; + iRemoteDetails = number; + } + + +// ----------------------------------------------------------------------------- +// CLcVtSession::StartShutdown +// ----------------------------------------------------------------------------- +// +void CLcVtSession::StartShutdown() + { + __VTPRINTENTER( "CLcVtSession.StartShutdown" ) + iSessionState = EClosing; + if ( iObserver != NULL ) + { + iObserver->StateChanged( *this ); + } + //iUiProvider->BlockUi(ETrue); + __VTPRINTEXIT( "CLcVtSession.StartShutdown" ) + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::NumberSource +// ----------------------------------------------------------------------------- +// +TDesC* CLcVtSession::NumberSource() const + { + return NULL; + } + + +// ----------------------------------------------------------------------------- +// CLcVtSession::RefreshL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::RefreshL( const TInt aRefreshFlags ) + { + } + + +// ----------------------------------------------------------------------------- +// CLcVtSession::RefreshStatesL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::RefreshStatesL() + { + __VTPRINTENTER( "CLcVtSession.RefreshStatesL" ) + // If transaction (set of commands) is pending refresh in delayed until + // all of them are processed. + __VTPRINTEXIT( "CLcVtSession.RefreshStatesL" ) + } + +#if 0 +// ----------------------------------------------------------------------------- +// CLcVtSession::HandleLayoutChanged +// ----------------------------------------------------------------------------- +// +TInt CLcVtSession::HandleLayoutChanged() + { + __VTPRINTENTER( "CLcVtSession.HandleLayoutChanged" ) + iLayoutChangeCallback->CallBack(); + __VTPRINTEXIT( "CLcVtSession.HandleLayoutChanged" ) + return KErrNone; + } + + +// ----------------------------------------------------------------------------- +// CLcVtSession::DelayedHandleLayoutChanged +// ----------------------------------------------------------------------------- +// +TInt CLcVtSession::DelayedHandleLayoutChanged( TAny* aPtr ) + { + __VTPRINTENTER( "CLcVtSession.DelayedHandleLayoutChanged" ) + CLcVtSession* self = reinterpret_cast< CLcVtSession* > ( aPtr ); + //self->iUiStates->SetDisableBlindSetting( ETrue ); + TRAPD( err, self->HandleLayoutChangedL() ); + //self->iUiStates->SetDisableBlindSetting( EFalse ); + //self->RefreshBlind(); + __VTPRINTENTER( "CLcVtSession.DelayedHandleLayoutChanged" ) + return err; + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::HandleLayoutChangedL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::HandleLayoutChangedL() + { + __VTPRINTENTER( "CLcVtSession.LayoutChg" ) + + if ( iState ) + { + iState->HandleLayoutChangedL(); + } + + /* + if ( !iAllowVideoDlgShowed ) + { + if ( iState ) + { + iState->HandleLayoutChangedL(); + } + } + else + { + iUiStates->SetLayoutChangeNeeded( EFalse ); + DoHandleLayoutChangedL(); + } + */ + __VTPRINTEXIT( "CLcVtSession.LayoutChg" ) + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::DoHandleLayoutChangedL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::DoHandleLayoutChangedL() + { + __VTPRINTENTER( "CLcVtSession.DoLayoutChg" ) + + // Fully update rendering parameters + UpdateRenderingParametersL(); + // Notify engine about layout change + //iLayoutChg = ETrue; + TRAPD( error, ExecuteCmdL( KVtEngHandleLayoutChange ) ); + //iLayoutChg = EFalse; + + // Not ready error is allowed to happen (e.g. when sharing) + if ( error && ( error != KErrNotReady ) ) + { + User::Leave( error ); + } + else + { + __VTPRINT( DEBUG_GEN, + "CLcVtSession.DoLayoutChg KVtEngHandleLayoutChange == KErrNotReady (ok)" ) + } + + __VTPRINTEXIT( "CLcVtSession.DoLayoutChg" ) + } +#endif + +// ----------------------------------------------------------------------------- +// CLcVtSession::UpdateRenderingParametersL +// ----------------------------------------------------------------------------- +// +#ifdef NGA_VIDEO_RENDER + +void CLcVtSession::UpdateRenderingParametersL() + { + __VTPRINTENTER( "CLcVtSession.UpdateRenderingParametersL" ) + + iRwGroup->SetOrdinalPosition( 1 , ECoeWinPriorityNormal ); + + TRect RMRect = RemoteVideoPlayer()->LcWindow()->LcWindowRect(); + iRemoteVideoWindow->SetExtent( RMRect.iTl, RMRect.Size() ); + iRemoteVideoWindow->SetOrdinalPosition( 1 , ECoeWinPriorityNeverAtFront ); + iRemoteVideoWindow->SetTransparencyAlphaChannel(); + + __VTPRINT2( DEBUG_MEDIA , " RemoteVideoPlayer.RMRect.iTl.iX: %d", RMRect.iTl.iX ) + __VTPRINT2( DEBUG_MEDIA , " RemoteVideoPlayer.RMRect.iTl.iY: %d", RMRect.iTl.iY ) + __VTPRINT2( DEBUG_MEDIA , " RemoteVideoPlayer.RMRect.iWidth: %d", RMRect.Width() ) + __VTPRINT2( DEBUG_MEDIA , " RemoteVideoPlayer.RMRect.iHeight: %d", RMRect.Height() ) + + + TRect VFRect = LocalVideoPlayer()->LcWindow()->LcWindowRect(); + iLocalVideoWindow->SetExtent( VFRect.iTl, VFRect.Size() ); + iLocalVideoWindow->SetOrdinalPosition( 1, ECoeWinPriorityNeverAtFront ); + iLocalVideoWindow->SetTransparencyAlphaChannel(); + + __VTPRINT2( DEBUG_MEDIA , " LocalVideoPlayer.VFRect.iTl.iX: %d", VFRect.iTl.iX ) + __VTPRINT2( DEBUG_MEDIA , " LocalVideoPlayer.VFRect.iTl.iY: %d", VFRect.iTl.iY ) + __VTPRINT2( DEBUG_MEDIA , " LocalVideoPlayer.VFRect.iWidth: %d", VFRect.Width() ) + __VTPRINT2( DEBUG_MEDIA , " LocalVideoPlayer.VFRect.iHeight: %d", VFRect.Height() ) + + iRwSession.Flush(); + + __VTPRINTEXIT( "CLcVtSession.UpdateRenderingParametersL" ) + + } + + +#else + +void CLcVtSession::UpdateRenderingParametersL() + { + + __VTPRINTENTER( "CLcVtSession.UpdateRenderingParametersL" ) + + MVtEngMedia& media = iModel->Media(); + const TBool viewFinderStarted = + media.RenderingStarted( MVtEngMedia::EMediaOutgoing ); + const TBool remoteRenderStarted = + media.RenderingStarted( MVtEngMedia::EMediaIncoming ); + + // Stop viewfinder & remote render. + if( viewFinderStarted ) + { + ExecuteCmdL( KVtEngStopViewFinder ); + } + ExecuteCmdL( KVtEngStopRenderRemote ); + + TRect VFRect = LocalVideoPlayer()->LcWindow()->LcWindowRect(); + TSize size (VFRect.Size()); + + TVtEngRenderingOptions configViewfinder(*iEventObserver,size); + + ExecuteCmdL( KVtEngPrepareViewFinder, configViewfinder ); + + // Prepare remote render. + TRect RMRect = RemoteVideoPlayer()->LcWindow()->LcWindowRect(); + const TSize KRMsize( RMRect.Size()); + TRect screen( KRMsize ); + TRect clip( KRMsize ); + const TPoint KRMcordinate( RMRect.iTl.iX, RMRect.iTl.iY ); + + TVtEngRenderingOptionsDP configRemoteRender(*iEventObserver, *iWsSession ,*iWsSessionScreenDev, *iMainWindow, screen, clip, KRMcordinate ); + + TRAPD ( err, ExecuteCmdL( + KVtEngPrepareRemoteRenderDP, + configRemoteRender ) ); + + if ( err != KErrNone ) + { + if ( viewFinderStarted ) + { + // Start viewfinder. + ExecuteCmdL( KVtEngStartViewFinder ); + } + User::Leave ( err ); + } + + // Start remote render. + TRAP_IGNORE( ExecuteCmdL( KVtEngStartRenderRemote ) ); + + if ( viewFinderStarted ) + { + // Start viewfinder. + ExecuteCmdL( KVtEngStartViewFinder ); + } + + __VTPRINTEXIT( "CLcVtSession.UpdateRenderingParametersL" ) + + } + +#endif + +// ----------------------------------------------------------------------------- +// CLcVtSession::HandleEngineResetL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::HandleEngineResetL() + { + __VTPRINTENTER( "CLcVtSession.HandleEngineResetL" ) + if ( iShutdownRequest ) + { + __VTPRINT( DEBUG_GEN, " CLcVtSession.HandleEngineResetL shutdown" ) + User::RequestComplete( iShutdownRequest, KErrNone ); + iShutdownRequest = NULL; + } + __VTPRINTEXIT( "CLcVtSession.HandleEngineResetL" ) + } + + +// ----------------------------------------------------------------------------- +// CLcVtSession::HandleShutdownReady +// ----------------------------------------------------------------------------- +// +void CLcVtSession::HandleShutdownReady() + { + __VTPRINTENTER( "CLcVtSession.HandleShutdownReady" ) + + if(iAsyncCallback->IsActive()) + { + iAsyncCallback->Cancel(); + } + + iAsyncCallback->Set( + TCallBack( &DoExit, this ) ); + iAsyncCallback->CallBack(); + __VTPRINTEXIT( "CLcVtSession.HandleShutdownReady" ) + } + + +// ----------------------------------------------------------------------------- +// CLcVtSession::DoExit +// ----------------------------------------------------------------------------- +// +TInt CLcVtSession::DoExit( TAny* aSession ) + { + __VTPRINTENTER( "CLcVtSession.DoExit" ) + CLcVtSession* self = static_cast< CLcVtSession* >( aSession ); + self->iAsyncCallback->Cancel(); + // Before exiting ensure there are no pending actions. + self->ActiveExecInitCancel( 0 ); + self->CloseApp(); + __VTPRINTEXIT( "CLcVtSession.DoExit" ) + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::CloseApp +// ----------------------------------------------------------------------------- +// +void CLcVtSession::CloseApp() + { + __VTPRINTENTER( "CLcVtSession.CloseApp" ) + //iUiProvider->BlockUi(EFalse); +#if 0 + if(iEventObserver) + { + delete iEventObserver; + iEventObserver = NULL; + } +#endif + iSessionState = EClosed; + iObserver->StateChanged( *this ); + __VTPRINTEXIT( "CLcVtSession.CloseApp" ) + } + +// Implementation of CLcVtSession::CEventObserver + +// ----------------------------------------------------------------------------- +// CLcVtSession::CEventObserver::CEventObserver +// ----------------------------------------------------------------------------- +// +CLcVtSession::CEventObserver::CEventObserver( CLcVtSession& aSession ) + :iSession(aSession), + iCommandObservers( KLcVtCommandObserverArrayGranularity ) + { + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::CEventObserver::ConstructL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::CEventObserver::ConstructL() + { + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::CEventObserver::NewL +// ----------------------------------------------------------------------------- +// +CLcVtSession::CEventObserver* CLcVtSession::CEventObserver::NewL( CLcVtSession& aSession ) + { + CEventObserver* self = new ( ELeave ) CEventObserver(aSession ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::CEventObserver::~CEventObserver +// ----------------------------------------------------------------------------- +// +CLcVtSession::CEventObserver::~CEventObserver() + { + iCommandObservers.Close(); + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::CEventObserver::AddObserverL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::CEventObserver::AddObserverL( + MVtEngCommandObserver& aObserver ) + { + User::LeaveIfError( + iCommandObservers.Append( &aObserver ) ); + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::CEventObserver::RemoveObserver +// ----------------------------------------------------------------------------- +// +void CLcVtSession::CEventObserver::RemoveObserver( + MVtEngCommandObserver& aObserver ) + { + const TInt pos = iCommandObservers.Find( &aObserver ); + if ( pos != KErrNotFound ) + { + if ( !iInCommandPerformed ) + { + iCommandObservers.Remove( pos ); + } + else + { + iCommandObservers[ pos ] = NULL; + } + } + } + + +void CLcVtSession::CEventObserver::HandleVtEventL( TInt aEvent ) + { + __VTPRINTENTER( "CEventObserver.HandleVtEventL" ) + __VTPRINT2( DEBUG_GEN, "CEventObserver.HandleVtEventL event=%d ",aEvent ); + + /** Allow application state to handle event first. It may also deny further + * handling by indicating the event was handled */ + if ( iSession.iState && + iSession.iState->HandleVtEventL( aEvent ) + == TLcVtStateBase::EEventHandled ) + { + __VTPRINTEXITR( "CEventObserver.HandleVtEventL %d", 0 ) + return; + } + + iSession.iLcVtStates->Update(); + + iSession.iObserver->Updated(*(iSession.iLocalVideoPlayer)); + iSession.iObserver->Updated(*(iSession.iRemoteVideoPlayer)); + + __VTPRINTEXIT( "CEventObserver.HandleVtEventL" ) + } + +void CLcVtSession::CEventObserver::HandleVTCommandPerformedL( + TVtEngCommandId aCommand, + const TInt aError ) + { + __VTPRINTENTER( "CEventObserver.HandleVTCommandPerformedL" ) + __VTPRINT3( DEBUG_GEN, "CEventObserver.HandleVTCommandPerformedL cmd=%d , result=%d",aCommand, aError ); + + if ( iSession.iState && + iSession.iState->HandleVTCommandPerformedL( aCommand, aError ) == + TLcVtStateBase::EEventHandled ) + { + // state didn't allow further processing of command completion + __VTPRINTEXITR( "CEventObserver.HandleVTCommandPerformedL %d", 0 ) + return; + } + + iSession.RefreshStatesL(); + + iSession.iLcVtStates->Update(); + + const TInt count = iCommandObservers.Count(); + TInt nullPosition = KErrNotFound; + + iInCommandPerformed = ETrue; + + // iInCommandPerformed equals ETrue while inside the following loop; + // Exceptions must not be raised. + for ( TInt index = 0; index < count; index++ ) + { + MVtEngCommandObserver* obs = iCommandObservers[ index ]; + if ( obs ) + { + TRAP_IGNORE( obs->HandleVTCommandPerformedL( aCommand, aError ) ); + } + else + { + // We store only one position; eventually all NULL elements of the + // array will be removed. + nullPosition = index; + } + } + iInCommandPerformed = EFalse; + + if ( nullPosition != KErrNotFound ) + { + iCommandObservers.Remove( nullPosition ); + } + + + // Specific handling of some commands: + if ( aCommand == KVtEngResetEngine ) // Engine has been reset + { + //__ASSERT_ALWAYS( !aError, VtUiPanic::Panic( EVtUiPanicResetFailed ) ); + iSession.HandleEngineResetL(); + } + + + __VTPRINTEXITR( "CEventObserver.HandleVTCommandPerformedL %d", 1 ) + + } + +#ifndef NGA_VIDEO_RENDER +void CLcVtSession::CEventObserver::vtHandleFrameL( + TFrameType aType, + CFbsBitmap* aBitmap ) + { + iSession.vtHandleFrameL( aBitmap); + } + +void CLcVtSession::CEventObserver::vtSetFrame( + TFrameType aType, + CFbsBitmap* aBitmap ) + { + } +#endif + +TBool CLcVtSession::IsFeatureSupported( CLcEngine::TLcFeature aLcFeature ) +{ + __VTPRINT2( DEBUG_GEN, "CLcVtSession.IsFeatureSupported feature=%d", aLcFeature) + TBool flag = EFalse; + switch ( aLcFeature ) + { + case CLcEngine::ELcSendVideoQuery: + { + MVtEngSessionInfo::TDirection direction; + if ( iModel->Session().GetDirection( direction ) != KErrNone ) + { + direction = MVtEngSessionInfo::EDirectionMT; + } + __VTPRINT2( DEBUG_GEN, "CLcVtSession.IsFeatureSupported direction=%d", direction ) + flag = ( direction == MVtEngSessionInfo::EDirectionMT ); + } + break; + + default: + break; + } + + // return feature not supported if not handled + return flag; +} + +// End of file + +/* + * +// ----------------------------------------------------------------------------- +// CLcVtSession::UpdateLocalVideoRenderParamL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::UpdateLocalVideoRenderParamL() + { + __VTPRINTENTER( "CLcVtSession.UpdateLocalVideoRenderParamL" ) + + if(iLcVtStates->ExecState() != TLcVtStates::EExecStateRunning ) + { + __VTPRINTEXIT( "CLcVtSession.UpdateLocalVideoRenderParamL -- not running state" ) + return; + } + + MVtEngMedia& media = Model().Media(); + const TBool viewFinderStarted = + media.RenderingStarted( MVtEngMedia::EMediaOutgoing ); + + if( viewFinderStarted ) + { + ExecuteCmdL( KVtEngStopViewFinder ); + } + + TRect VFRect = LocalVideoPlayer()->LcWindow()->LcWindowRect(); + TSize size (VFRect.Size()); + + TVtEngRenderingOptions configViewfinder(*iEventObserver,size); + + ExecuteCmdL( KVtEngPrepareViewFinder, configViewfinder ); + + if ( viewFinderStarted ) + { + // Start viewfinder. + ExecuteCmdL( KVtEngStartViewFinder ); + } + + __VTPRINTEXIT( "CLcVtSession.UpdateLocalVideoRenderParamL" ) + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::UpdateRemoteVideoRenderParamL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::UpdateRemoteVideoRenderParamL() + { + __VTPRINTENTER( "CLcVtSession.UpdateRemoteVideoRenderParamL" ) + + if(iLcVtStates->ExecState() != TLcVtStates::EExecStateRunning ) + { + __VTPRINTEXIT( "CLcVtSession.UpdateRemoteVideoRenderParamL -- not running state" ) + return; + } + + MVtEngMedia& media = Model().Media(); + const TBool remoteRenderStarted = + media.RenderingStarted( MVtEngMedia::EMediaIncoming ); + + ExecuteCmdL( KVtEngStopRenderRemote ); + + TRect RMRect = RemoteVideoPlayer()->LcWindow()->LcWindowRect(); + const TSize KRMsize( RMRect.Size()); + TRect screen( KRMsize ); + TRect clip( KRMsize ); + const TPoint KRMcordinate( RMRect.iTl.iX, RMRect.iTl.iY ); + + __VTPRINT2( DEBUG_MEDIA , " RMRect.iTl.iX: %d", RMRect.iTl.iX) + __VTPRINT2( DEBUG_MEDIA , " RMRect.iTl.iY: %d", RMRect.iTl.iY ) + __VTPRINT2( DEBUG_MEDIA , " RMRect.iWidth: %d", RMRect.Width() ) + __VTPRINT2( DEBUG_MEDIA , " RMRect.iHeight: %d", RMRect.Height() ) + + TVtEngRenderingOptionsDP configRemoteRender(*iEventObserver, *iWsSession ,*iWsSessionScreenDev, *iMainWindow, screen, clip, KRMcordinate ); + + ExecuteCmdL( + KVtEngPrepareRemoteRenderDP, + configRemoteRender ); + + TRAP_IGNORE( ExecuteCmdL( KVtEngStartRenderRemote ) ); + + __VTPRINTEXIT( "CLcVtSession.UpdateRemoteVideoRenderParamL" ) + + } + +// ----------------------------------------------------------------------------- +// CLcVtSession::LayoutChangedL +// ----------------------------------------------------------------------------- +// +void CLcVtSession::LayoutChangedL() + { + __VTPRINTENTER( "CLcVtSession.LayoutChangedL" ) + + if(iLcVtStates->ExecState() != TLcVtStates::EExecStateRunning ) + { + __VTPRINTEXIT( "CLcVtSession.LayoutChangedL -- not running state" ) + return; + } + + TRAPD( error, ExecuteCmdL( KVtEngHandleLayoutChange ) ); + + __VTPRINTEXIT( "CLcVtSession.LayoutChangedL" ) + } + + */ diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/src/base/dllmain.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/src/base/dllmain.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,39 @@ +/* +* ============================================================================== +* Name : dllmain.cpp +* Part of : +* Description : +* Version : +* +* Copyright ?2004 Nokia Corporation. +* This material, including documentation and any related +* computer programs, is protected by copyright controlled by +* Nokia Corporation. All rights are reserved. Copying, +* including reproducing, storing, adapting or translating, any +* or all of this material requires the prior written consent of +* Nokia Corporation. This material also contains confidential +* information which may not be disclosed to others without the +* prior written consent of Nokia Corporation. +* ============================================================================== +*/ +#include +#include +#include "clcvtengine.h" + +// Map the interface UIDs to implementation factory functions +const TImplementationProxy Implementations[] = + { + IMPLEMENTATION_PROXY_ENTRY( 0x20021342, CLcVtEngine::NewL ) + }; + +// ----------------------------------------------------------------------------- +// ImplementationGroupProxy +// +// Exported proxy for instantiation method resolution +// ----------------------------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aCount ) + { + aCount = sizeof( Implementations ) / sizeof( TImplementationProxy ); + return Implementations; + } diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/src/common/lcvtutility.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/src/common/lcvtutility.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,319 @@ +/* +* Copyright (c) 2008 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: Implementation of the VtUiUtility class. +* +*/ + + + +// INCLUDE FILES +#include "lcvtutility.h" +#include +#include +#include + +// Characters to open number entry. +//_LIT( KVtUiDTMFCharacters, "0123456789*#" ); + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// LcVtUtility::GetAudioRoutingAvailability +// ----------------------------------------------------------------------------- +// +void LcVtUtility::GetAudioRoutingAvailability( + MVtEngAudio& aAudio, + TInt& aAvailable ) + { + aAvailable = 0; + //const TBool bluetoothAudioSupported = ETrue; + + MVtEngAudio::TAudioRoutingState routingState; + if ( aAudio.GetRoutingState( routingState ) == KErrNone ) + { + // Deactivate BT handsfree. + if ( /*bluetoothAudioSupported &&*/ + IsAudioRoutingAvailable( + aAudio, + routingState, + MVtEngAudio::EAudioBT, + MVtEngAudio::EAudioHandset ) ) + { + aAvailable |= EDeactivateBtHandsfree; + } + + // Activate BT handsfree. + if ( /*bluetoothAudioSupported &&*/ + ( IsAudioRoutingAvailable( + aAudio, + routingState, + MVtEngAudio::EAudioHandset, + MVtEngAudio::EAudioBT ) || + IsAudioRoutingAvailable( + aAudio, + routingState, + MVtEngAudio::EAudioLoudspeaker, + MVtEngAudio::EAudioBT ) ) ) + { + aAvailable |= EActivateBtHandsfree; + } + + // Deactivate loudspeaker + if ( IsAudioRoutingAvailable( + aAudio, + routingState, + MVtEngAudio::EAudioLoudspeaker, + MVtEngAudio::EAudioHandset ) ) + { + aAvailable |= EDeactivateLoudspeaker; + } + + // Activate loudspeaker + if ( IsAudioRoutingAvailable( + aAudio, + routingState, + MVtEngAudio::EAudioHandset, + MVtEngAudio::EAudioLoudspeaker ) || + ( /*bluetoothAudioSupported &&*/ + IsAudioRoutingAvailable( + aAudio, + routingState, + MVtEngAudio::EAudioBT, + MVtEngAudio::EAudioLoudspeaker ) ) ) + { + aAvailable |= EActivateLoudspeaker; + } + } + } + +// ----------------------------------------------------------------------------- +// LcVtUtility::GetOutgoingMediaState +// ----------------------------------------------------------------------------- +// +void LcVtUtility::GetOutgoingMediaState( + MVtEngMedia& aMedia, + TInt& aAvailable ) + { + TInt outgoingMediaState; + const TInt err = + aMedia.GetMediaState( + MVtEngMedia::EMediaOutgoing, + outgoingMediaState ); + if ( err == KErrNone ) + { + // If source is still image, then video sending is off. + MVtEngMedia::TMediaSource source; + if ( aMedia.GetSource( source ) == KErrNone ) + { + if ( source == MVtEngMedia::EMediaStillImage ) + { + outgoingMediaState &= ~MVtEngMedia::EMediaVideo; + } + } + TBool freezeSupported; + if( aMedia.GetFreezeSupported( freezeSupported ) == KErrNone ) + { + TBool isFrozen; + if( freezeSupported && aMedia.GetFreezeState( isFrozen ) == KErrNone ) + { + if( isFrozen ) + { + outgoingMediaState &= ~MVtEngMedia::EMediaVideo; + } + } + } + } + else + { + outgoingMediaState = + ( MVtEngMedia::EMediaAudio | MVtEngMedia::EMediaVideo ); + } + aAvailable = outgoingMediaState; + } + +// ----------------------------------------------------------------------------- +// LcVtUtility::GetIncomingMediaState +// ----------------------------------------------------------------------------- +// +void LcVtUtility::GetIncomingMediaState( + MVtEngMedia& aMedia, + TInt& aAvailable ) + { + TInt mediaState; + const TInt err = + aMedia.GetMediaState( + MVtEngMedia::EMediaIncoming, + mediaState ); + if ( err != KErrNone ) + { + mediaState = + ( MVtEngMedia::EMediaAudio | MVtEngMedia::EMediaVideo ); + } + + aAvailable = mediaState; + } + +// ----------------------------------------------------------------------------- +// LcVtUtility::HasStillImage +// ----------------------------------------------------------------------------- +// +TBool LcVtUtility::HasStillImage( + MVtEngMedia& aMedia ) + { + TInt caps; + const TInt capsErr = aMedia.GetSourcesCaps( caps ); + return ( capsErr == KErrNone ) && + ( caps & MVtEngMedia::ESourceCapsStillImage ); + } + +// ----------------------------------------------------------------------------- +// LcVtUtility::GetFreezeState +// ----------------------------------------------------------------------------- +// +TBool LcVtUtility::GetFreezeState( + MVtEngMedia& aMedia ) + { + TBool isFrozen; + const TInt err = aMedia.GetFreezeState( isFrozen ); + if ( err == KErrNone ) + { + return isFrozen; + } + else //provider was not ready + { + return EFalse; + } + } + +// ----------------------------------------------------------------------------- +// LcVtUtility::IsFreezeSupported +// ----------------------------------------------------------------------------- +// +TBool LcVtUtility::IsFreezeSupported( + MVtEngMedia& aMedia ) + { + TBool isFreezeSupported; + const TInt err = aMedia.GetFreezeSupported( isFreezeSupported ); + if ( err == KErrNone ) + { + return isFreezeSupported; + } + else //provider was not ready + { + return EFalse; + } + } + +// ----------------------------------------------------------------------------- +// LcVtUtility::GetVideoQuality +// ----------------------------------------------------------------------------- +// +void LcVtUtility::GetVideoQuality( + MVtEngMedia& aMedia, + MVtEngMedia::TVideoQuality& aVideoQuality ) + { + aMedia.GetVideoQuality( aVideoQuality ); + } + +// ----------------------------------------------------------------------------- +// LcVtUtility::GetObjectSharingState +// ----------------------------------------------------------------------------- +// +void LcVtUtility::GetObjectSharingState( + MVtEngMedia& aMedia, + MVtEngMedia::TShareObjectState& aShareObjectState ) + { + aMedia.GetObjectSharingState( aShareObjectState ); + } + + +// ----------------------------------------------------------------------------- +// LcVtUtility::IsZoomAllowed +// ----------------------------------------------------------------------------- +// +TBool LcVtUtility::IsZoomAllowed( + MVtEngMedia& aMedia ) + { + TBool result = EFalse; + + TInt currentStep; + if ( aMedia.GetCurrentZoomStep( currentStep ) == KErrNone ) + { + TInt max; + if ( aMedia.GetMaxZoomStep( max ) == KErrNone ) + { + // Zooming is allowed if maximum zoom step is greater than + // zero and camera is in use (and not still image / none). + TInt avail; + GetOutgoingMediaState( aMedia, avail ); + + result = ( max > 0 ) && ( avail & MVtEngMedia::EMediaVideo ); + } + } + + __VTPRINT2( DEBUG_GEN, "Ui.AllowZoom.%d", result ) + return result; + } + +// ----------------------------------------------------------------------------- +// LcVtUtility::HasCameras +// ----------------------------------------------------------------------------- +// +TBool LcVtUtility::HasCameras( MVtEngMedia& aMedia ) + { + TInt sourceCaps; + if ( aMedia.GetSourcesCaps( sourceCaps ) != KErrNone ) + { + sourceCaps = 0; + } + return ( sourceCaps & MVtEngMedia::ESourceCapsPrimaryCamera ) || + ( sourceCaps & MVtEngMedia::ESourceCapsSecondaryCamera ); + } + +// ----------------------------------------------------------------------------- +// LcVtUtility::IsAudioRoutingAvailable +// ----------------------------------------------------------------------------- +// +TBool LcVtUtility::IsAudioRoutingAvailable( + MVtEngAudio& aAudio, + const MVtEngAudio::TAudioRoutingState aCurrent, + const MVtEngAudio::TAudioRoutingState aSource, + const MVtEngAudio::TAudioRoutingState aTarget ) + { + TBool result = EFalse; + if ( aCurrent == aSource ) + { + TBool available = EFalse; + TInt err = aAudio.GetRoutingAvailability( aTarget, available ); + + result = ( ( err == KErrNone ) && ( available ) ); + } + + return result; + } + +// ----------------------------------------------------------------------------- +// LcVtUtility::IsDTMFCharacter +// ----------------------------------------------------------------------------- +// +TBool LcVtUtility::IsDTMFCharacter( const TChar aChar ) + { + return EFalse; + /* + return + ( KVtUiDTMFCharacters().Locate( aChar ) != KErrNotFound ); + */ + } + +// End of File diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/src/common/tlcvtaudiostate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/src/common/tlcvtaudiostate.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,71 @@ +/* +* Copyright (c) 2008 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: Audio state class. +* +*/ + + +#include + +#include "tlcvtaudiostate.h" +#include "lcvtutility.h" + +// ----------------------------------------------------------------------------- +// TLcVtAudioState::UpdateFlags +// ----------------------------------------------------------------------------- +// +void TLcVtAudioState::UpdateFlags() + { + TInt avail( 0 ); + + LcVtUtility::GetAudioRoutingAvailability( iModel.Audio(), avail ); + + const TBool videoCallConnected ( iModel.Media().VideoCallConnected()); + //Before update AudioRouting, video call state must to be checked. + //AudioRouting can not be changed if call is not in EConnected state. + if ( videoCallConnected ) + { + if ( avail & LcVtUtility::EDeactivateBtHandsfree ) + { + SetFlag( ECanDeactivateBtHf ); + } + if ( avail & LcVtUtility::EActivateBtHandsfree ) + { + SetFlag( ECanActivateBtHf ); + } + if ( avail & LcVtUtility::EDeactivateLoudspeaker ) + { + SetFlag( ECanDeactivateLoudspeaker ); + } + if ( avail & LcVtUtility::EActivateLoudspeaker ) + { + SetFlag( ECanActivateLoudspeaker ); + } + } + + LcVtUtility::GetOutgoingMediaState( iModel.Media(), avail ); + + if ( avail & MVtEngMedia::EMediaAudio ) + { + SetFlag( EIsAudio ); + } + + TInt status ( 0 ); + iModel.Media().GetMediaState( MVtEngMedia::EMediaOutgoing, status ); + if ( !(status & MVtEngMedia::EMediaAudioChannelOpen ) ) + { + SetFlag( EIsAudioPermanentlyStopped ); + } + + } diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/src/common/tlcvtmediastate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/src/common/tlcvtmediastate.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,132 @@ +/* +* Copyright (c) 2008 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: Media state class. +* +*/ + + +#include +#include +#include + +#include "tlcvtmediastate.h" +#include "lcvtutility.h" + +// ----------------------------------------------------------------------------- +// TLcVtMediaState::UpdateFlags +// ----------------------------------------------------------------------------- +// +void TLcVtMediaState::UpdateFlags() + { + __VTPRINTENTER( "MediaState.UpdateFlags" ) + TInt avail( 0 ); + + LcVtUtility::GetOutgoingMediaState( iMedia, avail ); + + if ( avail & MVtEngMedia::EMediaVideo ) + { + SetFlag( EIsVideo ); + } + + if ( LcVtUtility::HasCameras( iMedia ) ) + { + SetFlag( EHasCamera ); + } + + if ( LcVtUtility::IsFreezeSupported( iMedia ) ) + { + SetFlag( EIsFreezeSupported ); + } + + if ( LcVtUtility::GetFreezeState( iMedia ) ) + { + SetFlag( EIsFrozen ); + } + + MVtEngMedia::TShareObjectState shareObjectState; + LcVtUtility::GetObjectSharingState( iMedia, shareObjectState ); + + if ( shareObjectState == MVtEngMedia::ESharingImage ) + { + SetFlag( EIsSharing ); + } + else if ( ( shareObjectState == MVtEngMedia::EInitializingShareImage ) || + ( shareObjectState == MVtEngMedia::EInitializingShareVideoClip ) ) + { + SetFlag( EIsInitializingShare ); + } + else if ( shareObjectState == MVtEngMedia::ENotAbleToShare ) + { + SetFlag( EIsNotAbleToShare ); + } + // Camera configuration + + MVtEngMedia::TCameraId cameraId; + TInt err = iMedia.GetCurrentCameraId( cameraId ); + + // Don't care if camera is not ready, just what is selected camera + if ( err == KErrNone || err == KErrNotReady ) + { + SetFlag( ( cameraId == MVtEngMedia::EPrimaryCamera ) ? + EIsPrimaryCameraInUse : EIsSecondaryCameraInUse ); + } + + TInt sourcesCaps( 0 ); + iMedia.GetSourcesCaps( sourcesCaps ); + if ( sourcesCaps & MVtEngMedia::ESourceCapsPrimaryCamera ) + { + SetFlag( EHasPrimaryCamera ); + } + if ( sourcesCaps & MVtEngMedia::ESourceCapsSecondaryCamera ) + { + SetFlag( EHasSecondaryCamera ); + } + + TInt status ( 0 ); + iMedia.GetMediaState( MVtEngMedia::EMediaOutgoing, status ); + if ( !( status & MVtEngMedia::EMediaVideoChannelOpen ) ) + { + SetFlag( EIsVideoPermanentlyStopped ); + } + + __VTPRINTEXITR( "MediaState.UpdateFlags bits = %b", Value() ) + + // Video preferences +/* + TInt caps( iCommandHandler.GetCommandCaps( KVtEngSetContrast ) ); + if ( caps & MVtEngCommandHandler::EAttribEnabled ) + { + SetFlag( EIsContrastSupported ); + } + + caps = iCommandHandler.GetCommandCaps( KVtEngSetBrightness ); + if ( caps & MVtEngCommandHandler::EAttribEnabled ) + { + SetFlag( EIsBrightnessSupported ); + } + + caps = iCommandHandler.GetCommandCaps( KVtEngSetWhiteBalance ); + if ( caps & MVtEngCommandHandler::EAttribEnabled ) + { + SetFlag( EIsWhiteBalanceSupported ); + } + + caps = iCommandHandler.GetCommandCaps( KVtEngSetColorTone ); + if ( caps & MVtEngCommandHandler::EAttribEnabled ) + { + SetFlag( EIsColorToneSupported ); + } + +*/ + } diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/src/common/tlcvtstates.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/src/common/tlcvtstates.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,136 @@ +/* +* Copyright (c) 2008 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 UI states class. +* +*/ + + +#include +#include +#include + +#include "tlcvtstates.h" + +// ----------------------------------------------------------------------------- +// TLcVtStates::TLcVtStates +// ----------------------------------------------------------------------------- +// +TLcVtStates::TLcVtStates( CVtEngModel& aModel ) + : iMediaState( aModel.Media(), aModel.CommandHandler() ), iAudioState( aModel ), + iModel( aModel ), iExecState( EExecStateStarting) + { + // get camera preferences + iCameraPref = static_cast + ( iModel.Extension( KVtEngExtensionCameraPreferences ) ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::Update +// ----------------------------------------------------------------------------- +// +void TLcVtStates::Update() + { + __VTPRINTENTER( "TLcVtStates.Update" ) + iMediaState.Update(); + iAudioState.Update(); + __VTPRINTEXIT( "TLcVtStates.Update" ) + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::IsColorToneSettingAvailable +// ----------------------------------------------------------------------------- +// +TBool TLcVtStates::IsColorToneSettingAvailable() const + { + __VTPRINTENTER( "TLcVtStates.IsColorToneSettingAvailable" ) + TUint32 supportedModes; + // Get supported whitebalance modes + if ( iCameraPref ) + { + if ( iCameraPref->GetSupportedColorTones( supportedModes ) ) + { + // error occured + __VTPRINTEXIT( "TLcVtStates.IsColorToneSettingAvailableErr" ) + return EFalse; + } + } + + // Clean the flag, flags that are possible are + // A bitfield of suported colortones + // ENormal = 0x00, + // ESepia = 0x01, + // EGrayscale = 0x02, + // ENegative = 0x04 + supportedModes &= 0x07; + + // If supported modes is 0 automatic,then return EFalse + __VTPRINTEXIT( "TLcVtStates.IsColorToneSettingAvailable" ) + return supportedModes; + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::IsWhiteBalanceSettingAvailable +// ----------------------------------------------------------------------------- +// +TBool TLcVtStates::IsWhiteBalanceSettingAvailable() const + { + __VTPRINTENTER( "TLcVtStates.IsWhiteBalanceSettingAvailable" ) + TUint32 supportedModes; + // Get supported whitebalance modes + if ( iCameraPref ) + { + if ( iCameraPref->GetSupportedWhiteBalanceModes( supportedModes ) ) + { + // error occured + __VTPRINTEXIT( "TLcVtStates.IsWhiteBalanceSettingAvailableErr" ) + return EFalse; + } + } + __VTPRINT2( DEBUG_GEN, "IsWhiteBalanceSettingAvailable=%d", supportedModes ) + // If supported modes is 0 ,then return EFalse + __VTPRINTEXIT( "TLcVtStates.IsWhiteBalanceSettingAvailable2" ) + return supportedModes; + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::IsContrastSettingAvailable +// ----------------------------------------------------------------------------- +// +TBool TLcVtStates::IsContrastSettingAvailable() const + { + __VTPRINTENTER( "TLcVtStates.IsContrastSettingAvailable" ) + TBool ret( ETrue ); + if ( iCameraPref ) + { + TInt temp; + ret = !iCameraPref->GetContrast( temp ); + } + return ret; + } + +// ----------------------------------------------------------------------------- +// TLcVtStates::IsBrightnessSettingAvailable +// ----------------------------------------------------------------------------- +// +TBool TLcVtStates::IsBrightnessSettingAvailable() const + { + __VTPRINTENTER( "TLcVtStates.IsBrightnessSettingAvailable" ) + TBool ret( ETrue ); + if ( iCameraPref ) + { + TInt temp; + ret = !iCameraPref->GetBrightness( temp ); + } + return ret; + } diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/src/control/clcvtlocalvideoplayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/src/control/clcvtlocalvideoplayer.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,176 @@ +/* +* Copyright (c) 2008 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: LiveComm Videotelephony's Local Video Player +* +*/ + +#include "clcvtlocalvideoplayer.h" +#include "tlcvtcamerahandler.h" +#include "lcvtplugincommand.h" + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// + +CLcVtLocalVideoPlayer* CLcVtLocalVideoPlayer::NewL( + CLcVtSession* avtSession, + MLcAudioControl& aLcAudioControl, + TVtCameraHandler& aCameraHandler) + { + CLcVtLocalVideoPlayer* self = + new( ELeave )CLcVtLocalVideoPlayer( + avtSession, + aLcAudioControl, + aCameraHandler); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CLcVtLocalVideoPlayer::CLcVtLocalVideoPlayer( + CLcVtSession* avtSession, + MLcAudioControl& aLcAudioControl, + TVtCameraHandler& aCameraHandler) : + CLcVtVideoPlayerBase( avtSession, aLcAudioControl ), + iCameraHandler( aCameraHandler ) + { + iIsPlaying = ETrue; + iOrientationChanged = EFalse; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CLcVtLocalVideoPlayer::ConstructL() + { + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CLcVtLocalVideoPlayer::~CLcVtLocalVideoPlayer() + { + } + +// ----------------------------------------------------------------------------- +// From MLcVideoPlayer +// ----------------------------------------------------------------------------- +// +MLcVideoPlayer::TLcVideoPlayerState +CLcVtLocalVideoPlayer::LcVideoPlayerState() const + { + TLcVideoPlayerState playerState = MLcVideoPlayer::EPlaying; + return playerState; + } + +// ----------------------------------------------------------------------------- +// From MLcVideoPlayer +// ----------------------------------------------------------------------------- +// +TBool CLcVtLocalVideoPlayer::LcIsPlayingL() + { + TBool result = ivtSession->LcVtStates().MediaState().IsVideo(); + __VTPRINT2( DEBUG_GEN, "CLcVtLocalVideoPlayer.LcIsPlayingL = %d", result ) + return result; + } + +// ----------------------------------------------------------------------------- +// From MLcVideoPlayer +// ----------------------------------------------------------------------------- +// +void CLcVtLocalVideoPlayer::LcPlayL(TLcVideoPlayerSource /*aSource*/) + { + __VTPRINT( DEBUG_GEN, "CLcVtLocalVideoPlayer.LcPlayL" ) + iIsPlaying = ETrue; + ivtSession->HandleCommandL(EPluginCmdEnableVideo); + } + +// ----------------------------------------------------------------------------- +// From MLcVideoPlayer +// ----------------------------------------------------------------------------- +// +void CLcVtLocalVideoPlayer::LcPauseL() + { + __VTPRINT( DEBUG_GEN, "CLcVtLocalVideoPlayer.LcPauseL" ) + iIsPlaying = EFalse; + ivtSession->HandleCommandL(EPluginCmdDisableVideo); + } + +// ----------------------------------------------------------------------------- +// From MLcVideoPlayer +// ----------------------------------------------------------------------------- +// +MLcCameraControl* CLcVtLocalVideoPlayer::LcCameraControl() + { + return &iCameraHandler; + } + + +// ----------------------------------------------------------------------------- +// From MLcVideoPlayer +// ----------------------------------------------------------------------------- +// +MLcZoomControl* CLcVtLocalVideoPlayer::LcZoomControl() + { + return &iCameraHandler; + } + +// ----------------------------------------------------------------------------- +// From MLcVideoPlayer +// ----------------------------------------------------------------------------- +// +MLcBrightnessControl* CLcVtLocalVideoPlayer::LcBrightnessControl() + { + return &iCameraHandler; + } + +// ----------------------------------------------------------------------------- +// From MLcWindow +// ----------------------------------------------------------------------------- +// +void CLcVtLocalVideoPlayer::SetLcWindowRectL( TRect aRect ) + { + __VTPRINT2( DEBUG_MEDIA , " LocalVideoPlayer.RMRect.iTl.iX: %d", aRect.iTl.iX ) + __VTPRINT2( DEBUG_MEDIA , " LocalVideoPlayer.RMRect.iTl.iY: %d", aRect.iTl.iY ) + __VTPRINT2( DEBUG_MEDIA , " LocalVideoPlayer.RMRect.iWidth: %d", aRect.Width() ) + __VTPRINT2( DEBUG_MEDIA , " LocalVideoPlayer.RMRect.iHeight: %d", aRect.Height() ) + + CLcVtVideoPlayerBase::SetLcWindowRectL( aRect ); + } + +// ----------------------------------------------------------------------------- +// From MLcWindow +// ----------------------------------------------------------------------------- +// +void CLcVtLocalVideoPlayer::SetLcWindowOrientationL( TLcWindowOrientation aOrientation ) + { + __VTPRINT2( DEBUG_MEDIA , "CLcVtLocalVideoPlayer.SetLcWindowOrientationL: %d", aOrientation ) + iOrientationChanged = EFalse; + if( aOrientation != iWindowOrientation ) + iOrientationChanged = ETrue; + CLcVtVideoPlayerBase::SetLcWindowOrientationL( aOrientation ); + } + +TBool CLcVtLocalVideoPlayer::IsOrientationChanged() + { + return iOrientationChanged; + } diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/src/control/clcvtremotevideoplayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/src/control/clcvtremotevideoplayer.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,95 @@ +/* +* Copyright (c) 2008 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: LiveComm Videotelephony's Remte Video Player +* +*/ + +#include "clcvtremotevideoplayer.h" +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CLcVtRemoteVideoPlayer* CLcVtRemoteVideoPlayer::NewL( + CLcVtSession* avtSession, + MLcAudioControl& aLcAudioControl ) + { + CLcVtRemoteVideoPlayer* self = + new( ELeave ) CLcVtRemoteVideoPlayer( avtSession, aLcAudioControl ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CLcVtRemoteVideoPlayer::CLcVtRemoteVideoPlayer( + CLcVtSession* avtSession, + MLcAudioControl& aLcAudioControl ) : + CLcVtVideoPlayerBase( avtSession, aLcAudioControl ) + { + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CLcVtRemoteVideoPlayer::ConstructL() + { + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CLcVtRemoteVideoPlayer::~CLcVtRemoteVideoPlayer() + { + } + +// ----------------------------------------------------------------------------- +// From MLcVideoPlayer +// ----------------------------------------------------------------------------- +// +MLcVideoPlayer::TLcVideoPlayerState +CLcVtRemoteVideoPlayer::LcVideoPlayerState() const + { + TLcVideoPlayerState playerState = MLcVideoPlayer::EPlaying; + return playerState; + } + +// ----------------------------------------------------------------------------- +// From MLcVideoPlayer +// ----------------------------------------------------------------------------- +// +TBool CLcVtRemoteVideoPlayer::LcIsPlayingL() + { + return ETrue; + } + +// ----------------------------------------------------------------------------- +// From MLcWindow +// ----------------------------------------------------------------------------- +// +void CLcVtRemoteVideoPlayer::SetLcWindowRectL( TRect aRect ) + { + __VTPRINT2( DEBUG_MEDIA , " RemoteVideoPlayer.RMRect.iTl.iX: %d", aRect.iTl.iX ) + __VTPRINT2( DEBUG_MEDIA , " RemoteVideoPlayer.RMRect.iTl.iY: %d", aRect.iTl.iY ) + __VTPRINT2( DEBUG_MEDIA , " RemoteVideoPlayer.RMRect.iWidth: %d", aRect.Width() ) + __VTPRINT2( DEBUG_MEDIA , " RemoteVideoPlayer.RMRect.iHeight: %d", aRect.Height() ) + + CLcVtVideoPlayerBase::SetLcWindowRectL( aRect ); + } + diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/src/control/clcvtvideoplayerbase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/src/control/clcvtvideoplayerbase.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,199 @@ +/* +* Copyright (c) 2008 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: LiveComm Videotelephony's Video Player Base Class +* +*/ + +#include "clcvtvideoplayerbase.h" +#include "clcvtsession.h" + + +CLcVtVideoPlayerBase::CLcVtVideoPlayerBase( + CLcVtSession* avtSession, + MLcAudioControl& aLcAudioControl ) : + ivtSession( avtSession ), + iLcAudioControl( aLcAudioControl ) + { + iIsWindowEnabled = ETrue; + iWindowOrientation = MLcWindow::EPortrait; + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CLcVtVideoPlayerBase::~CLcVtVideoPlayerBase() + { + } + + +// ----------------------------------------------------------------------------- +// From MLcVideoPlayer +// ----------------------------------------------------------------------------- +// +#if 0 +MLcVideoPlayer::TLcVideoPlayerState +CLcVtVideoPlayerBase::LcVideoPlayerState() const + { + return MLcVideoPlayer::EUnavailable; + } + +// ----------------------------------------------------------------------------- +// From MLcVideoPlayer +// ----------------------------------------------------------------------------- +// +TBool CLcVtVideoPlayerBase::LcIsPlayingL() + { + return EFalse; + } +#endif +// ----------------------------------------------------------------------------- +// From MLcVideoPlayer +// ----------------------------------------------------------------------------- +// +void CLcVtVideoPlayerBase::LcPlayL( TLcVideoPlayerSource /*aSource*/ ) + { + // NOP + __VTPRINT( DEBUG_GEN, "CLcVtVideoPlayerBase.LcPlayL" ) + } + +// ----------------------------------------------------------------------------- +// From MLcVideoPlayer +// ----------------------------------------------------------------------------- +// +void CLcVtVideoPlayerBase::LcPauseL() + { + // NOP + __VTPRINT( DEBUG_GEN, "CLcVtVideoPlayerBase.LcPauseL" ) + } + +// ----------------------------------------------------------------------------- +// From MLcVideoPlayer +// ----------------------------------------------------------------------------- +// +MLcWindow* CLcVtVideoPlayerBase::LcWindow() + { + return this; + } + +// ----------------------------------------------------------------------------- +// From MLcVideoPlayer +// ----------------------------------------------------------------------------- +// +MLcCameraControl* CLcVtVideoPlayerBase::LcCameraControl() + { + return NULL; + } + +// ----------------------------------------------------------------------------- +// From MLcVideoPlayer +// ----------------------------------------------------------------------------- +// +MLcSourceFileControl* CLcVtVideoPlayerBase::LcSourceFileControl() + { + return NULL; + } + +// ----------------------------------------------------------------------------- +// From MLcVideoPlayer +// ----------------------------------------------------------------------------- +// +MLcDestinationFileControl* CLcVtVideoPlayerBase::LcDestinationFileControl() + { + return NULL; + } + +// ----------------------------------------------------------------------------- +// From MLcVideoPlayer +// ----------------------------------------------------------------------------- +// +MLcAudioControl* CLcVtVideoPlayerBase::LcAudioControl() + { + return &iLcAudioControl; + } + +// ----------------------------------------------------------------------------- +// From MLcVideoPlayer +// ----------------------------------------------------------------------------- +// +MLcZoomControl* CLcVtVideoPlayerBase::LcZoomControl() + { + return NULL; + } + +// ----------------------------------------------------------------------------- +// From MLcVideoPlayer +// ----------------------------------------------------------------------------- +// +MLcBrightnessControl* CLcVtVideoPlayerBase::LcBrightnessControl() + { + return NULL; + } + +// ----------------------------------------------------------------------------- +// From MLcWindow +// ----------------------------------------------------------------------------- +// +void CLcVtVideoPlayerBase::EnableLcWindowL( TBool aEnable ) + { + iIsWindowEnabled = aEnable; + } + +// ----------------------------------------------------------------------------- +// From MLcWindow +// ----------------------------------------------------------------------------- +// +TBool CLcVtVideoPlayerBase::IsLcWindowEnabled() + { + return iIsWindowEnabled; + } + +// ----------------------------------------------------------------------------- +// From MLcWindow +// ----------------------------------------------------------------------------- +// +void CLcVtVideoPlayerBase::SetLcWindowRectL( TRect aRect ) + { + iWindowRect = aRect; + } + + +// ----------------------------------------------------------------------------- +// From MLcWindow +// ----------------------------------------------------------------------------- +// +TRect CLcVtVideoPlayerBase::LcWindowRect() + { + return iWindowRect; + } + +// ----------------------------------------------------------------------------- +// From MLcWindow +// ----------------------------------------------------------------------------- +// +void CLcVtVideoPlayerBase::SetLcWindowOrientationL( + TLcWindowOrientation aOrientation ) + { + iWindowOrientation = aOrientation; + } + +// ----------------------------------------------------------------------------- +// From MLcWindow +// ----------------------------------------------------------------------------- +// +MLcWindow::TLcWindowOrientation CLcVtVideoPlayerBase::LcWindowOrientationL() + { + return iWindowOrientation; + } diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/src/control/tlcvtcamerahandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/src/control/tlcvtcamerahandler.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,239 @@ +/* +* Copyright (c) 2008 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: LiveComm Videotelephony's Camera Handler +* +*/ + + +#include "tlcvtcamerahandler.h" +#include "clcvtsession.h" +#include "tlcvtstates.h" +#include "lcvtplugincommand.h" +#include "lcvtutility.h" +#include "cvtengmodel.h" + + +TVtCameraHandler::TVtCameraHandler() : +ivtSession( NULL ) + { + } + +// ----------------------------------------------------------------------------- +// From MLcCameraControl +// ----------------------------------------------------------------------------- +// +TInt TVtCameraHandler::LcCameraCountL() + { + return 2; + } + +// ----------------------------------------------------------------------------- +// From MLcCameraControl +// ----------------------------------------------------------------------------- +// +TInt TVtCameraHandler::CurrentLcCameraIndex() + { + if(ivtSession->LcVtStates().MediaState().IsPrimaryCameraInUse()) + return EFrontCamera; + + return EBackCamera; + } + +// ----------------------------------------------------------------------------- +// From MLcCameraControl +// ----------------------------------------------------------------------------- +// +void TVtCameraHandler::ToggleLcCameraL() + { + if(ivtSession->LcVtStates().MediaState().IsPrimaryCameraInUse()) + ivtSession->HandleCommandL(EPluginCmdUseSecondaryCamera); + else + ivtSession->HandleCommandL(EPluginCmdUsePrimaryCamera); + } + +// ----------------------------------------------------------------------------- +// From MLcBrightnessControl +// ----------------------------------------------------------------------------- +// +TInt TVtCameraHandler::MinLcBrightnessL() + { + return 0; + } + +// ----------------------------------------------------------------------------- +// From MLcBrightnessControl +// ----------------------------------------------------------------------------- +// +TInt TVtCameraHandler::MaxLcBrightnessL() + { + return 0; + } + +// ----------------------------------------------------------------------------- +// From MLcBrightnessControl +// ----------------------------------------------------------------------------- +// +TInt TVtCameraHandler::LcBrightnessL() + { + return 0; + } + +// ----------------------------------------------------------------------------- +// From MLcBrightnessControl +// ----------------------------------------------------------------------------- +// +void TVtCameraHandler::SetLcBrightnessL( TInt aValue ) + { + } + +// ----------------------------------------------------------------------------- +// From MLcBrightnessControl +// ----------------------------------------------------------------------------- +// +void TVtCameraHandler::IncreaseLcBrightnessL() + { + } + +// ----------------------------------------------------------------------------- +// From MLcBrightnessControl +// ----------------------------------------------------------------------------- +// +void TVtCameraHandler::DecreaseLcBrightnessL() + { + } + +// ----------------------------------------------------------------------------- +// From MLcZoomControl +// ----------------------------------------------------------------------------- +// +TInt TVtCameraHandler::MinLcZoomL() + { + return 0; + } + +// ----------------------------------------------------------------------------- +// From MLcZoomControl +// ----------------------------------------------------------------------------- +// +TInt TVtCameraHandler::MaxLcZoomL() + { + MVtEngMedia& media = ivtSession->Model().Media(); + + if(!LcVtUtility::IsZoomAllowed(media)) + { + __VTPRINT( DEBUG_GEN, "TVtCameraHandler.MaxLcZoomL ZoomNotAllow" ) + return 0; + } + + TInt max( 0 ); + const TInt error( media.GetMaxZoomStep( max ) ); + max = ( error ? 0 : max ); + + __VTPRINT2( DEBUG_GEN, "TVtCameraHandler.MaxLcZoomL value=%d", max ) + + return max; + } + +// ----------------------------------------------------------------------------- +// From MLcZoomControl +// ----------------------------------------------------------------------------- +// +TInt TVtCameraHandler::LcZoomValueL() + { + MVtEngMedia& media = ivtSession->Model().Media(); + + if(!LcVtUtility::IsZoomAllowed(media)) + { + __VTPRINT( DEBUG_GEN, "TVtCameraHandler.LcZoomValueL ZoomNotAllow" ) + return 0; + } + + TInt current( 0 ); + const TInt error( media.GetCurrentZoomStep( current ) ); + current = ( error ? 0 : current ); + __VTPRINT2( DEBUG_GEN, "TVtCameraHandler.LcZoomValueL value=%d", 0 ) + return current; + } + +// ----------------------------------------------------------------------------- +// From MLcZoomControl +// ----------------------------------------------------------------------------- +// +void TVtCameraHandler::SetLcZoomValueL( TInt aValue ) + { + MVtEngMedia& media = ivtSession->Model().Media(); + + if(!LcVtUtility::IsZoomAllowed(media)) + { + __VTPRINT( DEBUG_GEN, "TVtCameraHandler.SetLcZoomValueL ZoomNotAllow" ) + return; + } + + if( aValue < 0 || aValue > MaxLcZoomL() ) + { + __VTPRINT( DEBUG_GEN, "TVtCameraHandler.SetLcZoomValueL - Invalidate value" ) + return; + } + + __VTPRINT2( DEBUG_GEN, "TVtCameraHandler.SetLcZoomValueL Call SetZoomFactorL(%d)" , aValue ); + ivtSession->SetZoomFactorL( aValue ); + + } + +// ----------------------------------------------------------------------------- +// From MLcZoomControl +// ----------------------------------------------------------------------------- +// +void TVtCameraHandler::LcZoomInL() + { + MVtEngMedia& media = ivtSession->Model().Media(); + + if(!LcVtUtility::IsZoomAllowed(media)) + { + __VTPRINT( DEBUG_GEN, "TVtCameraHandler.LcZoomInL ZoomNotAllow" ) + return; + } + + __VTPRINT( DEBUG_GEN, "TVtCameraHandler.LcZoomInL Call SetLcZoomValueL" ) + SetLcZoomValueL(LcZoomValueL() + 1); + } + +// ----------------------------------------------------------------------------- +// From MLcZoomControl +// ----------------------------------------------------------------------------- +// +void TVtCameraHandler::LcZoomOutL() + { + MVtEngMedia& media = ivtSession->Model().Media(); + + if(!LcVtUtility::IsZoomAllowed(media)) + { + __VTPRINT( DEBUG_GEN, "TVtCameraHandler.LcZoomOutL ZoomNotAllow" ) + return; + } + + __VTPRINT( DEBUG_GEN, "TVtCameraHandler.LcZoomOutL Call SetLcZoomValueL" ) + SetLcZoomValueL(LcZoomValueL() - 1); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void TVtCameraHandler::SetSession( CLcVtSession* aSession ) + { + ivtSession = aSession; + } + + diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/src/states/tlcvtstatebase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/src/states/tlcvtstatebase.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,382 @@ +/* +* Copyright (c) 2008 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: base class for lc vt plugin states +* +*/ + + +#include "tlcvtstatebase.h" +#include "tlcvtstates.h" +#include "tlcvtpluginstates.h" +#include "clcvtappshutter.h" +#include "mlcvtstatecontext.h" +#include +#include +#include +#include +#include + +// By default call ending command is allowed to send to call handling. + +// Initially no shutdown request +TBool TLcVtStateBase::iShutdownRequested = EFalse; + +// ----------------------------------------------------------------------------- +// c++ constructor +// ----------------------------------------------------------------------------- +// +TLcVtStateBase::TLcVtStateBase( + MLcVtStateContext& aCtx, + TLcVtStates& aUiStates ) : iCtx(aCtx), iUiStates( aUiStates ) + { + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +// +TLcVtStateBase::~TLcVtStateBase() + { + } + +// ----------------------------------------------------------------------------- +// TLcVtStateBase::LcVtStartupPhase1DoneL +// ----------------------------------------------------------------------------- +// +void TLcVtStateBase::LcVtStartupPhase1DoneL() + { + // no default behavior + } + +// ----------------------------------------------------------------------------- +// TLcVtStateBase::LcVtStartupPhase2DoneL +// ----------------------------------------------------------------------------- +// +void TLcVtStateBase::LcVtStartupPhase2DoneL() + { + // no default behavior + } + +// ----------------------------------------------------------------------------- +// TLcVtStateBase::ShutdownDoneL +// ----------------------------------------------------------------------------- +// +void TLcVtStateBase::ShutdownDoneL() + { + // no default behavior + } +#if 0 +// ----------------------------------------------------------------------------- +// TLcVtStateBase::HandleForegroundChangedL +// ----------------------------------------------------------------------------- +// +TBool TLcVtStateBase::HandleForegroundChangedL( + const TBool /*aIsForegroung*/ ) + { + // no default behavior + return EFalse; + } + +// ----------------------------------------------------------------------------- +// TLcVtStateBase::PreHandleForegroundChangedL +// ----------------------------------------------------------------------------- +// +TBool TLcVtStateBase::PreHandleForegroundChangedL( + const TBool /*aIsForegroung*/ ) + { + // no default behavior + return EFalse; + } + +// ----------------------------------------------------------------------------- +// TLcVtStateBase::StartDtmfTone +// ----------------------------------------------------------------------------- +// +void TLcVtStateBase::StartDtmfTone( const TChar& /*aTone*/ ) + { + // no default behavior + } + +// ----------------------------------------------------------------------------- +// TLcVtStateBase::StopDtmfTone +// ----------------------------------------------------------------------------- +// +void TLcVtStateBase::StopDtmfTone() + { + // no default behavior + } +#endif + +// ----------------------------------------------------------------------------- +// TLcVtStateBase::SetInitialStateL +// ----------------------------------------------------------------------------- +// +void TLcVtStateBase::SetInitialStateL( + MLcVtStateContext& aCtx, + TLcVtStates& aUiStates ) + { + __VTPRINTENTER( "TLcVtStateBase.SetInitialState" ) + TLcVtStateBase* initialState = + TLcVtStateStarting::InstanceL( aCtx, aUiStates ); + aCtx.ChangeState( initialState ); + initialState->OpenL(); + __VTPRINTEXIT( "TLcVtStateBase.SetInitialState" ) + } + +// ----------------------------------------------------------------------------- +// TLcVtStateBase::LcVtStartupFailedL +// ----------------------------------------------------------------------------- +// +void TLcVtStateBase::LcVtStartupFailedL() + { + __VTPRINTENTER( "TLcVtStateBase.AppUiStartupFailedL" ) + // Shutdown + ChangeStateL( *TLcVtStateResetting::InstanceL( iCtx, iUiStates ) ); + __VTPRINTEXIT( "TLcVtStateBase.AppUiStartupFailedL" ) + } +#if 0 +// ----------------------------------------------------------------------------- +// TLcVtStateBase::OpenL +// ----------------------------------------------------------------------------- +// +void TLcVtStateBase::OpenL() + { + } + +// ----------------------------------------------------------------------------- +// TLcVtStateBase::Close +// ----------------------------------------------------------------------------- +// +void TLcVtStateBase::Close() + { + } +#endif + +// ----------------------------------------------------------------------------- +// TLcVtStateBase::ChangeStateL +// ----------------------------------------------------------------------------- +// +void TLcVtStateBase::ChangeStateL( TLcVtStateBase& aNewState ) + { + __VTPRINTENTER( "TLcVtStateBase.ChangeStateL" ) + + // Check for transition to already active state. + TLcVtStateBase* state = &aNewState; + if ( state == this ) + { + __VTPRINTEXITR( "TLcVtStateBase.ChangeStateL %d", 0 ) + return; + } + const TVtEngCommandId pending = + iCtx.Model().CommandHandler().PendingCommand(); + if ( pending != KVtEngCommandNone && + state == TLcVtStateResetting::InstanceL( iCtx, iUiStates ) ) + { + // delay shutdown until engine command completes + __VTPRINT2( DEBUG_GEN, "TLcVtStateBase.ChangeStateL, pengind command is: %d", pending ); + TLcVtStateBase::iShutdownRequested = ETrue; + + if ( pending == KVtEngInitializeShareImage ) + { + iCtx.Model().CommandHandler().CancelCommand( pending ); + } + + __VTPRINTEXITR( "TLcVtStateBase.ChangeStateL %d", KErrNotReady ) + return; + } + __VTPRINT( DEBUG_GEN, + " TLcVtStateBase.ChangeStateL !! STATE TRANSITION !!" ) + iCtx.ChangeState( &aNewState ); + Close(); + // perform entry action for new state + aNewState.OpenL(); + __VTPRINTEXITR( "TLcVtStateBase.ChangeStateL %d", 1 ) + } + +// ----------------------------------------------------------------------------- +// TLcVtStateBase::CleanupResetPushL +// ----------------------------------------------------------------------------- +// +void TLcVtStateBase::CleanupResetPushL() + { + // Shutdown if leave occurs in critical ops. + CleanupStack::PushL( + TCleanupItem( TransitionToReset, this ) ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStateBase::TransitionToReset +// ----------------------------------------------------------------------------- +// +void TLcVtStateBase::TransitionToReset( TAny* aAny ) + { + TLcVtStateBase* state = reinterpret_cast< TLcVtStateBase* >( aAny ); + TRAP_IGNORE( state->ChangeStateL( *TLcVtStateResetting::InstanceL( + state->iCtx, state->iUiStates ) ) ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStateBase::HandleVTCommandPerformedL +// ----------------------------------------------------------------------------- +// +TLcVtStateBase::TEventResponse TLcVtStateBase::HandleVTCommandPerformedL( + TVtEngCommandId /*aCommand*/, + const TInt /*aError*/ ) + { + __VTPRINTENTER( "TLcVtStateBase.HandleVTCommandPerformedL" ) + // By default all UI is allowed to handle all command completions. + TEventResponse handled = EEventNotHandled; + + // check if shutdown requested while command was pending + const TVtEngCommandId pending = iCtx.Model().CommandHandler().PendingCommand(); + if ( pending == KVtEngCommandNone && + TLcVtStateBase::iShutdownRequested ) + { + __VTPRINT( DEBUG_GEN, "Handling delayed shutdown" ); + ChangeStateL( *TLcVtStateResetting::InstanceL( + iCtx, iUiStates ) ); + } + __VTPRINTEXIT( "TLcVtStateBase.HandleVTCommandPerformedL" ) + return handled; + } + +// ----------------------------------------------------------------------------- +// TLcVtStateBase::HandleVtEventL +// ----------------------------------------------------------------------------- +// +TLcVtStateBase::TEventResponse TLcVtStateBase::HandleVtEventL( + const TInt aEvent ) + { + __VTPRINTENTER( "TLcVtStateBase.HandleVtEventL" ) + TEventResponse handled = EEventHandled; + switch ( aEvent ) + { + case KVtEngDeviceLockOn: + case KVtEngDeviceLockOff: + HandleDeviceLockEventL( aEvent == KVtEngDeviceLockOn ); + break; + case KVtEngRemoteDisconnect: + /** Don't allow sending of end active call command to call handling + * because requesting disconnect from the network after NW originated + * termination violates standards. + */ + break; + default: + handled = EEventNotHandled; + break; + } + __VTPRINTEXIT( "TLcVtStateBase.HandleVtEventL" ) + return handled; + } + +// ----------------------------------------------------------------------------- +// TLcVtStateBase::HandleCommandL +// ----------------------------------------------------------------------------- +// +TLcVtStateBase::TEventResponse TLcVtStateBase::HandleCommandL( + const TInt /*aCommand*/ ) + { + __VTPRINTENTER( "TLcVtStateBase.HandleCommandL" ) + TEventResponse handled = EEventNotHandled; + __VTPRINTEXITR( "TLcVtStateBase.HandleCommandL %d", handled ) + return handled; + } +#if 0 +// ----------------------------------------------------------------------------- +// TLcVtStateBase::HandleLayoutChangedL +// ----------------------------------------------------------------------------- +// +void TLcVtStateBase::HandleLayoutChangedL( ) + { + __VTPRINTENTER( "TLcVtStateBase.HandleLayoutChangedL" ) + // By default only indicate that layout change needs to be handled. + iUiStates.SetLayoutChangeNeeded( ETrue ); + __VTPRINTEXIT( "TLcVtStateBase.HandleLayoutChangedL" ) + } +#endif +// ----------------------------------------------------------------------------- +// TLcVtStateBase::HandleShutdownReady +// ----------------------------------------------------------------------------- +// +void TLcVtStateBase::HandleShutdownReady() + { + __VTPRINTENTER( "TLcVtStateBase.HandleShutdownReady" ) + // forwarded to AppUi which handles UI framework exit + iCtx.HandleShutdownReady(); + iCtx.ChangeState( NULL ); + // deletes current state + Close(); + __VTPRINTEXIT( "TLcVtStateBase.HandleShutdownReady" ) + } + +// ----------------------------------------------------------------------------- +// TLcVtStateBase::HandleDeviceLockEventL +// +// ----------------------------------------------------------------------------- +// +void TLcVtStateBase::HandleDeviceLockEventL( const TBool aDeviceIsLocked ) + { + __VTPRINTENTER( "TLcVtStateBase.HandleDeviceLockEventL" ) + iUiStates.SetDeviceLockOn( aDeviceIsLocked ); + if ( aDeviceIsLocked ) + { + iCtx.ChangeApplicationFocus( EFalse ); + } + __VTPRINTEXITR( "TLcVtStateBase.HandleDeviceLockEventL lock state=%d", + aDeviceIsLocked ) + } + +// ----------------------------------------------------------------------------- +// TLcVtStateBase::CheckEndActiveCallL +// ----------------------------------------------------------------------------- +// +TBool TLcVtStateBase::CheckEndActiveCallL() + { + __VTPRINTENTER( "TLcVtStateBase.CheckEndActiveCallL" ) + const MVtEngSessionInfo::TSessionState state = SessionState( EFalse ); + TBool shutdownStarted( EFalse ); + if ( state == MVtEngSessionInfo::EIdle ) + { + __VTPRINT( DEBUG_GEN, "VtUi.Release bearer" ) + // h.245 session is ended + ChangeStateL( *TLcVtStateResetting::InstanceL( iCtx, iUiStates ) ); + shutdownStarted = ETrue; + } + __VTPRINTEXITR( "TLcVtStateBase.CheckEndActiveCallL %d", + shutdownStarted ) + return shutdownStarted; + } + +// ----------------------------------------------------------------------------- +// TLcVtStateBase::SessionState +// ----------------------------------------------------------------------------- +// +MVtEngSessionInfo::TSessionState TLcVtStateBase::SessionState( + const TBool aUpdate ) const + { + const CVtEngModel& model = iCtx.Model(); + const MVtEngSessionInfo& session = model.Session(); + return session.State( aUpdate ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStateBase::SetExecState +// ----------------------------------------------------------------------------- +// +void TLcVtStateBase::SetExecState( const TLcVtStates::TLcVtExecState aState ) + { + __VTPRINTENTER( "TLcVtStateBase.SetExecState" ) + iUiStates.SetExecState( aState ); + __VTPRINTEXITR( "TLcVtStateBase.SetExecState %d", aState ) + } diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/src/states/tlcvtstateresetting.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/src/states/tlcvtstateresetting.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,254 @@ +/* +* Copyright (c) 2008 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: waiting details application state +* +*/ + + +#include "tlcvtstates.h" +#include "tlcvtpluginstates.h" +#include "mlcvtstatecontext.h" +#include "clcvtappshutter.h" +#include +#include + +TLcVtStateResetting* TLcVtStateResetting::iInstance = NULL; + +// c++ constructor +TLcVtStateResetting::TLcVtStateResetting( + MLcVtStateContext& aCtx, + TLcVtStates& aUiStates, + const TVtEngCommandId aCommand ) + : TLcVtStateBase( aCtx, aUiStates ), + iCommand( aCommand ) + { + __VTPRINT2( DEBUG_GEN, "TLcVtStateResetting.ctr iCommand=%d", iCommand ) + iCtx.StartShutdown(); + } + +// Destructor +TLcVtStateResetting::~TLcVtStateResetting() + { + } + +// ----------------------------------------------------------------------------- +// TLcVtStateResetting:: +// ----------------------------------------------------------------------------- +// +TLcVtStateResetting* TLcVtStateResetting::InstanceL( + MLcVtStateContext& aCtx, + TLcVtStates& aUiStates, + const TVtEngCommandId aCommand ) + { + __VTPRINTENTER( "TLcVtStateResetting.InstanceL" ) + if ( iInstance == NULL ) + { + iInstance = new ( ELeave ) TLcVtStateResetting( + aCtx, aUiStates, aCommand ); + } + else if ( aCommand != KVtEngCommandNone ) + { // if call ending is UI originated, command is given + iInstance->iCommand = aCommand; + __VTPRINT2( DEBUG_GEN, "TLcVtStateResetting.InstanceL iCommand=%d", + iInstance->iCommand ) + } + __VTPRINTEXIT( "TLcVtStateResetting.InstanceL" ) + return iInstance; + } + +// ----------------------------------------------------------------------------- +// TLcVtStateResetting::ShutdownDoneL +// AppUi has finished its own shutdown steps. Notify app shutter that it may +// proceed. +// +// ----------------------------------------------------------------------------- +// +void TLcVtStateResetting::ShutdownDoneL() + { + __VTPRINTENTER( "TLcVtStateResetting.ShutdownDone" ) + CLcVtAppShutter* shutter = CLcVtAppShutter::InstanceL( *this ); + shutter->StartShutdown(); + __VTPRINTEXIT( "TLcVtStateResetting.ShutdownDone" ) + } + +// ----------------------------------------------------------------------------- +// TLcVtStateResetting::AppUiStartupFailedL +// ----------------------------------------------------------------------------- +// +void TLcVtStateResetting::LcVtStartupFailedL() + { + __VTPRINTENTER( "TLcVtStateResetting.LcVtStartupFailedL" ) + // no-op (overrides default behavior) + __VTPRINTEXIT( "TLcVtStateResetting.LcVtStartupFailedL" ) + } + +// ----------------------------------------------------------------------------- +// TLcVtStateResetting::HandleVTCommandPerformedL +// ----------------------------------------------------------------------------- +// +TLcVtStateBase::TEventResponse TLcVtStateResetting::HandleVTCommandPerformedL + ( + TVtEngCommandId aCommand, + const TInt /*aError*/ ) + { + __VTPRINTENTER( "TLcVtStateResetting.HandleVTCommandPerformedL" ) + // By default responses to commands are ignored while resetting + TEventResponse handled = EEventHandled; + switch ( aCommand ) + { + case KVtEngResetEngine: + // Allow UI to process reset command response + handled = EEventNotHandled; + break; + case KVtEngTerminateSession: + case KVtEngSwitchToVoice: + // + handled = EEventNotHandled; + iCtx.ShutdownL(); + break; + default: + break; + } + __VTPRINTEXIT( "TLcVtStateResetting.HandleVTCommandPerformedL" ) + return handled; + } + +// ----------------------------------------------------------------------------- +// TLcVtStateResetting::HandleVtEventL +// ----------------------------------------------------------------------------- +// +TLcVtStateBase::TEventResponse TLcVtStateResetting::HandleVtEventL( + const TInt aEvent ) + { + __VTPRINTENTER( "TLcVtStateResetting.HandleVtEventL" ) + TEventResponse handled = EEventHandled; + switch ( aEvent ) + { + // While resetting appUi should not handle these events. + case KVtEngSourceChanged: + case KVtEngCameraChanged: + case KVtEngSourceCapsChanged: + case KVtEngSessionStateChanged: + case KVtEngDurationSettingChanged: + case KVtEngAudioOutputVolumeChanged: + case KVtEngAudioRoutingAvailabilityChanged: + case KVtEngAudioRoutingChanged: + case KVtEngAudioMuted: + case KVtEngAudioUnmuted: + case KVtEngRemoteVideoStopped: + case KVtEngSessionWaitingCallActive: + case KVtEngSessionWaitingCallInactive: + break; + default: + // allow appUi to handle other events + handled = EEventNotHandled; + break; + } + __VTPRINTEXIT( "TLcVtStateResetting.HandleVtEventL" ) + return handled; + } + +// ----------------------------------------------------------------------------- +// TLcVtStateResetting::HandleCommandL +// ----------------------------------------------------------------------------- +// +TLcVtStateBase::TEventResponse TLcVtStateResetting::HandleCommandL( + const TInt /*aCommand*/ ) + { + __VTPRINTENTER( "TLcVtStateResetting.HandleCommandL" ) + /* All commands ignored while resetting. CAknAppUi::Exit() is called + when shutdown is completed with asistance of CVtUiAppShutter */ + __VTPRINTEXIT( "TLcVtStateResetting.HandleCommandL" ) + return EEventHandled; + } + +// ----------------------------------------------------------------------------- +// TLcVtStateResetting::HandleForegroundChangedL +// ----------------------------------------------------------------------------- +// +TBool TLcVtStateResetting::HandleForegroundChangedL( + const TBool /*aIsForeground*/ ) + { + __VTPRINTENTER( "TLcVtStateResetting.HandleForegroundChangedL" ) + __VTPRINTEXIT( "TLcVtStateResetting.HandleForegroundChangedL" ) + // not on "foreground" while resetting + return EFalse; + } + +// ----------------------------------------------------------------------------- +// TLcVtStateResetting::PreHandleForegroundChangedL +// ----------------------------------------------------------------------------- +// +TBool TLcVtStateResetting::PreHandleForegroundChangedL( + const TBool /*aIsForegroung*/ ) + { + // no default behavior + return EFalse; + } + +#if 0 +// ----------------------------------------------------------------------------- +// TLcVtStateResetting::HandleLayoutChangedL +// ----------------------------------------------------------------------------- +// +void TLcVtStateResetting::HandleLayoutChangedL() + { + __VTPRINTENTER( "TLcVtStateResetting.HandleLayoutChangedL" ) + // no-op (overrides default behavior) + __VTPRINTEXIT( "TLcVtStateResetting.HandleLayoutChangedL" ) + } +#endif +// ----------------------------------------------------------------------------- +// TLcVtStateResetting::OpenL +// ----------------------------------------------------------------------------- +// +void TLcVtStateResetting::OpenL() + { + __VTPRINTENTER( "TLcVtStateResetting.OpenL" ) + SetExecState( TLcVtStates::EExecStateResetting ); + //iCtx.StopDtmfTone(); + iCtx.ChangeApplicationFocus( EFalse ); + + if ( iCommand != KVtEngCommandNone ) + { + // Command is either KVtEngTerminateSession or KVtEngSwitchToVoice + // Need to wait for callback before ShutdownL can be called on context. + iCtx.DoExecuteCmdL( iCommand, NULL ); + } + else + { + // This branch is executed when resetting state is opened due + // to emergency call or state change to one causing shutdown. + // No need to wait for any callbacks (emergency call callback + // handled by CVtUiAppShutter). + iCtx.ShutdownL(); + } + __VTPRINTEXIT( "TLcVtStateResetting.OpenL" ) + } + +// ----------------------------------------------------------------------------- +// TLcVtStateResetting::Close +// ----------------------------------------------------------------------------- +// +void TLcVtStateResetting::Close() + { + __VTPRINTENTER( "TLcVtStateResetting.Close" ) + SetExecState( TLcVtStates::EExecStateFinalized ); + if ( TLcVtStateResetting::iInstance ) + { + delete TLcVtStateResetting::iInstance; + TLcVtStateResetting::iInstance = NULL; + } + __VTPRINTEXIT( "TLcVtStateResetting.Close" ) + } diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/src/states/tlcvtstaterunning.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/src/states/tlcvtstaterunning.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,291 @@ +/* +* Copyright (c) 2008 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: running (normal operation) application state +* +*/ + + +#include "tlcvtstates.h" +#include "tlcvtpluginstates.h" +#include "mlcvtstatecontext.h" +#include "clcvtappshutter.h" +#include +#include +#include +#include "lcvtplugincommand.h" + +TLcVtStateRunning* TLcVtStateRunning::iInstance = NULL; + +// c++ constructor +TLcVtStateRunning::TLcVtStateRunning( + MLcVtStateContext& aCtx, TLcVtStates& aUiStates ) + : TLcVtStateBase( aCtx, aUiStates ) + { + } + +// Destructor +TLcVtStateRunning::~TLcVtStateRunning() + { + } + +// ----------------------------------------------------------------------------- +// TLcVtStateRunning::InstanceL +// ----------------------------------------------------------------------------- +// +TLcVtStateRunning * TLcVtStateRunning::InstanceL( + MLcVtStateContext& aCtx, + TLcVtStates& aUiStates ) + { + __VTPRINTENTER( "TLcVtStateRunning.InstanceL" ) + if ( iInstance == NULL ) + iInstance = new ( ELeave ) TLcVtStateRunning( aCtx, aUiStates ); + __VTPRINTEXIT( "TLcVtStateRunning.InstanceL" ) + return iInstance; + } + +// ----------------------------------------------------------------------------- +// TLcVtStateRunning::HandleVtEventL +// ----------------------------------------------------------------------------- +// +TLcVtStateBase::TEventResponse TLcVtStateRunning::HandleVtEventL( + const TInt aEvent ) + { + __VTPRINTENTER( "TLcVtStateRunning.HandleVtEventL" ) + // let TVtUiAppStateBase base class do common tasks + TEventResponse handled = TLcVtStateBase::HandleVtEventL( aEvent ); + switch ( aEvent ) + { + case KVtEngDeviceLockOn: + case KVtEngDeviceLockOff: + TLcVtStateBase::HandleVtEventL( aEvent ); + if ( aEvent == KVtEngDeviceLockOff ) + { + iCtx.ChangeApplicationFocus( ETrue ); + } + break; + case KVtEngSessionStateChanged: + if ( CheckEndActiveCallL() ) + { + // At this point shutdown is in progress. Don't allow + // appUi to do actions due to this event. + handled = EEventHandled; + } + break; + default: + break; + } + __VTPRINTEXIT( "TLcVtStateRunning.HandleVtEventL" ) + return handled; + } + + +// ----------------------------------------------------------------------------- +// TLcVtStateRunning::HandleCommandL +// ----------------------------------------------------------------------------- +// +TLcVtStateBase::TEventResponse TLcVtStateRunning::HandleCommandL( + const TInt aCommand ) + { + __VTPRINTENTER( "TLcVtStateRunning.HandleCommandL" ) + /** By default all commands are enabled by running state. + * Other details command validations are done elsewhere + */ + TEventResponse handled = EEventHandled; + + switch ( aCommand ) + { + case EPluginCmdEndActiveCall: + ShutdownWithEngineCommandL( KVtEngTerminateSession ); + break; + case EPluginCmdCreateVoice: + CreateVoiceCallL(); + break; + case EPluginCmdDialEmergency: + // Attempt emergency call. Note that emergency number check is done + // after calling DialEmergencyCallL and if supplied number is not + // emergency leave occurs. + TRAP_IGNORE( DialEmergencyCallL() ); + break; + default: + handled = TLcVtStateBase::HandleCommandL( aCommand ); + break; + } + + __VTPRINTEXITR( "TLcVtStateRunning.HandleCommandL %d", handled ) + return handled; + } + + +// ----------------------------------------------------------------------------- +// TLcVtStateRunning::HandleForegroundChangedL +// ----------------------------------------------------------------------------- +// +TBool TLcVtStateRunning::HandleForegroundChangedL( const TBool aIsForeground ) + { + __VTPRINTENTER( "TLcVtStateRunning.HandleForegroundChangedL" ) + + iCtx.RefreshL( MLcVtStateContext::ENaviPane ); + + TBool handleAsForeground( aIsForeground ); + TPtrC8 params( reinterpret_cast< TUint8* >( &handleAsForeground ), + sizeof( TBool ) ); + iCtx.DoExecuteCmdL( KVtEngSetUIForeground, ¶ms ); + __VTPRINTEXIT( "TLcVtStateRunning.HandleForegroundChangedL" ) + return handleAsForeground; + } + +// ----------------------------------------------------------------------------- +// TLcVtStateRunning::PreHandleForegroundChangedL +// ----------------------------------------------------------------------------- +// +TBool TLcVtStateRunning::PreHandleForegroundChangedL( const TBool aIsForeground ) + { + __VTPRINTENTER( "TLcVtStateRunning.PreHandleForegroundChangedL" ) + TBool handleAsForeground( aIsForeground ); + TPtrC8 params( reinterpret_cast< TUint8* >( &handleAsForeground ), sizeof( TBool ) ); + iCtx.DoExecuteCmdL( KVtEngSetUIForeground, ¶ms ); + __VTPRINTEXIT( "TLcVtStateRunning.PreHandleForegroundChangedL" ) + return handleAsForeground; + } +#if 0 +// ----------------------------------------------------------------------------- +// TLcVtStateRunning::HandleLayoutChangedL +// ----------------------------------------------------------------------------- +// +void TLcVtStateRunning::HandleLayoutChangedL( ) + { + __VTPRINTENTER( "TLcVtStateRunning.HandleLayoutChangedL" ) + iUiStates.SetLayoutChangeNeeded( EFalse ); + iCtx.DoHandleLayoutChangedL(); + __VTPRINTEXIT( "TLcVtStateRunning.HandleLayoutChangedL" ) + } + +// ----------------------------------------------------------------------------- +// TLcVtStateRunning::StartDtmfTone +// ----------------------------------------------------------------------------- +// +void TLcVtStateRunning::StartDtmfTone( const TChar& aTone ) + { + iCtx.StartDtmfTone( aTone ); + } + +// ----------------------------------------------------------------------------- +// TLcVtStateRunning::StopDtmfTone +// ----------------------------------------------------------------------------- +// +void TLcVtStateRunning::StopDtmfTone() + { + iCtx.StopDtmfTone(); + } +#endif +// ----------------------------------------------------------------------------- +// TLcVtStateRunning::CreateVoiceCallL +// ----------------------------------------------------------------------------- +// +void TLcVtStateRunning::CreateVoiceCallL() + { + __VTPRINTENTER( "TLcVtStateRunning.CreateVoiceCallL" ) + + //TInt result( KErrNone ); + /* + HBufC* prompt = + StringLoader::LoadLC( R_VIDEOTELUI_QTN_QUERY_CREATE_VOICE_CALL ); + + // Create and initialize query dialog + CAknQueryDialog* createVoiceCallDlg = CAknQueryDialog::NewL(); + CleanupStack::PushL( createVoiceCallDlg ); + createVoiceCallDlg->SetPromptL( *prompt ); + CleanupStack::Pop(); // createVoiceCallDlg + + iCreateVoiceCallDlg = createVoiceCallDlg; + TInt result( KErrNone ); + TRAPD( error, result = iCreateVoiceCallDlg->ExecuteLD( + R_VIDEOTELUI_CREATE_VOICE_QUERY ) ); + // Just set to NULL because ExecuteLD() deletes instance + iCreateVoiceCallDlg = NULL; + // Leave if ExecuteLD() left + User::LeaveIfError( error ); + CleanupStack::PopAndDestroy( ); // prompt + if ( result ) + { + //user answered yes + iCtx.DoExecuteCmdL( KVtEngSwitchToVoice, NULL ); + } + */ + __VTPRINTEXITR( "TLcVtStateRunning.CreateVoiceCallL %d", KErrNone ) + } + +// ----------------------------------------------------------------------------- +// TLcVtStateRunning::ShutdownWithEngineCommandL +// Starts shutdown with command to engine. +// ----------------------------------------------------------------------------- +// +void TLcVtStateRunning::ShutdownWithEngineCommandL( const TInt aCommand ) + { + __VTPRINTENTER( + "TLcVtStateRunning.ShutdownWithEngineCommandL" ) + TLcVtStateBase* resetState = + TLcVtStateResetting::InstanceL( iCtx, iUiStates, aCommand ); + CLcVtAppShutter* shutter = CLcVtAppShutter::InstanceL( *resetState ); + + // open resetting state, handles engine command request/reply + ChangeStateL( *resetState ); + + __VTPRINTEXIT( "TLcVtStateRunning.ShutdownWithEngineCommandL" ) + } + +// ----------------------------------------------------------------------------- +// TLcVtStateRunning::DialEmergencyCallL +// ----------------------------------------------------------------------------- +// +void TLcVtStateRunning::DialEmergencyCallL() + { + __VTPRINTENTER( + "TLcVtStateRunning.DialEmergencyCallL" ) + TLcVtStateBase* resetState = + TLcVtStateResetting::InstanceL( iCtx, iUiStates ); + CLcVtAppShutter* shutter = CLcVtAppShutter::InstanceL( *resetState ); + if ( shutter ) + { + // Make emergency call and proceed when 1) state has given permission + // and 2) callback from emergency call api is received + shutter->ShutdownWithEmergencyCallL( iCtx ); + ChangeStateL( *resetState ); + } + __VTPRINTEXIT( "TLcVtStateRunning.DialEmergencyCallL" ) + } + +// ----------------------------------------------------------------------------- +// TLcVtStateRunning::OpenL +// ----------------------------------------------------------------------------- +// +void TLcVtStateRunning::OpenL() + { + __VTPRINTENTER( "TLcVtStateRunning.OpenL" ) + SetExecState( TLcVtStates::EExecStateRunning ); + iCtx.RefreshStatesL(); + __VTPRINTEXIT( "TLcVtStateRunning.OpenL" ) + } + +// ----------------------------------------------------------------------------- +// TLcVtStateRunning::Close +// ----------------------------------------------------------------------------- +// +void TLcVtStateRunning::Close() + { + __VTPRINTENTER( "TLcVtStateRunning.Close" ) + delete TLcVtStateRunning::iInstance; + TLcVtStateRunning::iInstance = NULL; + __VTPRINTEXIT( "TLcVtStateRunning.Close" ) + } diff -r d9b6a8729acd -r dcbddbbaf8fd vtuis/lcvtplugin/src/states/tlcvtstatestarting.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/src/states/tlcvtstatestarting.cpp Wed Jun 23 18:14:26 2010 +0300 @@ -0,0 +1,317 @@ +/* +* Copyright (c) 2008 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: waiting details application state +* +*/ + + +#include "tlcvtstates.h" +#include "tlcvtpluginstates.h" +#include "mlcvtstatecontext.h" +#include "clcvtappshutter.h" +#include +#include +#include +#include +#include + + +TLcVtStateStarting* TLcVtStateStarting::iInstance = NULL; + +// c++ constructor +TLcVtStateStarting::TLcVtStateStarting( + MLcVtStateContext& aCtx, TLcVtStates& aUiStates ) + : TLcVtStateBase( aCtx, aUiStates ) + { + iPreconditions.Set( EWaitingCLI ); + iPreconditions.Set( EWaitingPhase1ToComplete ); + iStartCallback = NULL; + } + +// Destructor + TLcVtStateStarting::~TLcVtStateStarting() + { + delete iStartCallback; + } + +// ----------------------------------------------------------------------------- +// TLcVtStateStarting::InstanceL +// +// ----------------------------------------------------------------------------- +// +TLcVtStateStarting * TLcVtStateStarting::InstanceL( + MLcVtStateContext& aCtx, TLcVtStates& aUiStates ) + { + __VTPRINTENTER( "TLcVtStateStarting.InstanceL" ) + if ( iInstance == NULL ) + { + iInstance = new ( ELeave ) TLcVtStateStarting( aCtx, aUiStates ); + } + __VTPRINTEXIT( "TLcVtStateStarting.InstanceL" ) + return iInstance; + } + +// ----------------------------------------------------------------------------- +// TLcVtStateStarting::LcVtStartupPhase1DoneL +// +// Phase 1 of application startup is completed, check if we can proceed to +// phase 2. +// ----------------------------------------------------------------------------- +// +void TLcVtStateStarting::LcVtStartupPhase1DoneL() + { + __VTPRINTENTER( "TLcVtStateStarting.LcVtStartupPhase1DoneL" ) + // From startup phase point of view we're ready to proceed + // to phase 2. Clear that precondition and proceed if otherwise ready. + CheckPhase2StartupL( EWaitingPhase1ToComplete ); + __VTPRINTEXIT( "TLcVtStateStarting.LcVtStartupPhase1DoneL" ) + } + +// ----------------------------------------------------------------------------- +// TLcVtStateStarting::LcVtStartupPhase2DoneL +// +// ----------------------------------------------------------------------------- +// +void TLcVtStateStarting::LcVtStartupPhase2DoneL() + { + __VTPRINTENTER( "TLcVtStateStarting.LcVtStartupPhase2DoneL" ) + // Phase 2 completed, proceed to next state + ChangeStateL( *TLcVtStateRunning::InstanceL( iCtx, iUiStates ) ); + __VTPRINTEXIT( "TLcVtStateStarting.LcVtStartupPhase2DoneL" ) + } + +// ----------------------------------------------------------------------------- +// TLcVtStateStarting::HandleVtEventL +// +// ----------------------------------------------------------------------------- +// +TLcVtStateBase::TEventResponse TLcVtStateStarting::HandleVtEventL( + const TInt aEvent ) + { + __VTPRINTENTER( "TLcVtStateStarting.HandleVtEventL" ) + TEventResponse handled = EEventHandled; + switch ( aEvent ) + { + case KVtEngRemoteDisconnect: + // base class handles this. + handled = TLcVtStateBase::HandleVtEventL( aEvent ); + break; + case KVtEngSessionStateChanged: + { + // check if session state is proper for proceeding to next phase + // in startup. + CheckSessionStateL(); + } + break; + case KVtEngRemoteVideoStarted: + // allow to start remote video rendering + case KVtEngSourceChanged: + // allow handling of source changed event + handled = EEventNotHandled; + break; + case KVtEngCLIAvailable: + HandleCLIReceivedL(); + break; + + case KVtEngDeviceLockOn: + case KVtEngDeviceLockOff: + default: + handled = TLcVtStateBase::HandleVtEventL( aEvent ); + break; + } + __VTPRINTEXIT( "TLcVtStateStarting.HandleVtEventL" ) + return handled; + } + +// ----------------------------------------------------------------------------- +// TLcVtStateStarting::HandleCommandL +// +// ----------------------------------------------------------------------------- +// +TLcVtStateBase::TEventResponse TLcVtStateStarting::HandleCommandL( + const TInt /*aCommand*/ ) + { + __VTPRINTENTER( "TLcVtStateStarting.HandleCommandL" ) + __VTPRINTEXIT( "TLcVtStateStarting.HandleCommandL" ) + //return EEventNotHandled; + return EEventHandled; + } + +// ----------------------------------------------------------------------------- +// TLcVtStateStarting::HandleForegroundChangedL +// +// ----------------------------------------------------------------------------- +// +TBool TLcVtStateStarting::HandleForegroundChangedL( const TBool aIsForeground ) + { + __VTPRINTENTER( "TLcVtStateStarting.HandleForegroundChangedL" ) + + iCtx.RefreshL( MLcVtStateContext::ENaviPane ); + + // behave as in background if CLI (=details) has not yet received + TBool handleAsForeground( aIsForeground && iUiStates.IsDetailsReceived() ); + TLcVtStateBase::ExecuteEngineCommand( KVtEngSetUIForeground, + handleAsForeground ); + + __VTPRINTEXIT( "TLcVtStateStarting.HandleForegroundChangedL" ) + return handleAsForeground; + } + +// ----------------------------------------------------------------------------- +// TLcVtStateStarting::PreHandleForegroundChangedL +// ----------------------------------------------------------------------------- +// +TBool TLcVtStateStarting::PreHandleForegroundChangedL( + const TBool /*aIsForegroung*/ ) + { + // no default behavior + return EFalse; + } + +// ----------------------------------------------------------------------------- +// TLcVtStateStarting::OpenL +// ----------------------------------------------------------------------------- +// +void TLcVtStateStarting::OpenL() + { + __VTPRINTENTER( "TLcVtStateStarting.OpenL" ) + iStartCallback = new ( ELeave ) CAsyncCallBack ( + TCallBack( &AsynchOpen, this ), + CActive::EPriorityStandard ); + iStartCallback->CallBack(); + __VTPRINTEXIT( "TLcVtStateStarting.OpenL" ) + } + +// ----------------------------------------------------------------------------- +// TLcVtStateStarting::AsynchOpen +// asynchronous entry to the state. +// ----------------------------------------------------------------------------- +// +TInt TLcVtStateStarting::AsynchOpen( TAny* aAny ) + { + __VTPRINTENTER( "TLcVtStateStarting.AsynchOpen" ) + TLcVtStateStarting* state = reinterpret_cast( aAny ); + delete state->iStartCallback; + state->iStartCallback = NULL; + TRAPD( res, state->DoOpenL() ); + __VTPRINTEXITR( "TLcVtStateStarting.AsynchOpen err=%d", res ) + return res; + } + +// ----------------------------------------------------------------------------- +// TLcVtStateStarting::DoOpenL +// ----------------------------------------------------------------------------- +// +void TLcVtStateStarting::DoOpenL() + { + __VTPRINTENTER( "TLcVtStateStarting.DoOpenL" ) + if ( !CheckEndActiveCallL() ) + { + // not shutting down, proceed to phase 1 + iCtx.StartupPhase1L(); + } + __VTPRINTEXIT( "TLcVtStateStarting.DoOpenL" ) + } + +// ----------------------------------------------------------------------------- +// TLcVtStateStarting::CheckSessionStateL +// Resolve action based on session state change in the engine. +// ----------------------------------------------------------------------------- +// +void TLcVtStateStarting::CheckSessionStateL() + { + __VTPRINTENTER( "TLcVtStateStarting.CheckSessionStateL" ) + const MVtEngSessionInfo::TSessionState state = SessionState( EFalse ); + switch ( state ) + { + case MVtEngSessionInfo::EConnected: + case MVtEngSessionInfo::ENegotiating: + case MVtEngSessionInfo::EOpen: + // From session state point of view we're ready to proceed. + // Clear precondition and proceed if otherwise ready. + CheckPhase2StartupL( EWaitingSessionState ); + break; + default: + // Is session state such that we need to shutdown? + CheckEndActiveCallL(); + break; + } + __VTPRINTEXIT( "TLcVtStateStarting.CheckSessionStateL" ) + } + +// ----------------------------------------------------------------------------- +// TLcVtStateStarting::CheckPhase2StartupL +// +// mark precondition passed and if no more preconditions exist proceed +// in startup. +// ----------------------------------------------------------------------------- +// +void TLcVtStateStarting::CheckPhase2StartupL( + const TPreconditions aCond ) + { + __VTPRINTENTER( "TLcVtStateStarting.CheckPhase2StartupL" ) + // First check that at least one precondition holds + if ( iPreconditions.Value() ) + { + iPreconditions.Clear( aCond ); + if ( !iPreconditions.Value() ) + { + CleanupResetPushL(); // start shutdown if StartupPhase2L leaves + iCtx.StartupPhase2L(); + CleanupStack::Pop(); // CleanupResetPushL + } + } +#ifdef VTDEBUG + else { + __VTPRINT( DEBUG_GEN, "TLcVtStateStarting.CheckPhase2StartupL NoOp!" ) + } +#endif // VTDEBUG + __VTPRINTEXITR( "TLcVtStateStarting.CheckPhase2StartupL cond=%d", + (TInt) iPreconditions.Value() ) + } + +// ----------------------------------------------------------------------------- +// TLcVtStateStarting::HandleCLIReceivedL +// CLI reception from engine is one of the two preconditions for proceeding +// to phase2 startup. +// ----------------------------------------------------------------------------- +// +void TLcVtStateStarting::HandleCLIReceivedL() + { + __VTPRINTENTER( "TLcVtStateStarting.HandleCLIReceivedL" ) + const MVtEngSessionInfo& session = iCtx.Model().Session(); + MVtEngSessionInfo::TCLI cli; + if ( session.GetCLI( cli ) == KErrNone ) + { + iUiStates.SetDetailsReceived( ETrue ); + iUiStates.SetCLIReceived( cli.iVoiceCallPossible ); + iCtx.SetCallIdL( cli.iCallId ); + iCtx.SetCallNameL( cli.iName ); + iCtx.SetCallNumberL( cli.iCallNumber ); + } + CheckPhase2StartupL( EWaitingCLI ); + __VTPRINTEXIT( "TLcVtStateStarting.HandleCLIReceivedL" ) + } + +// ----------------------------------------------------------------------------- +// TLcVtStateStarting::Close +// ----------------------------------------------------------------------------- +// +void TLcVtStateStarting::Close() + { + __VTPRINTENTER( "TLcVtStateStarting.Close" ) + delete TLcVtStateStarting::iInstance; + TLcVtStateStarting::iInstance = NULL; + __VTPRINTEXIT( "TLcVtStateStarting.Close" ) + }