diff -r 000000000000 -r 72b543305e3a messagingappbase/msgeditor/mediacontrolsrc/MsgVideoControl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/msgeditor/mediacontrolsrc/MsgVideoControl.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,917 @@ +/* +* 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: +* MsgEditor video media control - a Message Editor Base control. +* +*/ + + + +// INCLUDE FILES +#include "MsgVideoControl.h" + +#include +#include +#include +#include // KErrMMPartialPlayback + +#include + +#include "MsgFrameControl.h" +#include "MsgIconControl.h" +#include "MsgVideoAreaControl.h" + +#include "MsgMediaControlLogging.h" + +// ========================================================== + +// EXTERNAL DATA STRUCTURES + +// EXTERNAL FUNCTION PROTOTYPES + +// CONSTANTS + +// MACROS + +// LOCAL CONSTANTS AND MACROS + +//used to reset inactivity timer after one sec so that backlight will not +// be turned on during video playback. +const TInt KResetInactivityAfterOneSecond = 2000000; // 2s + +// MODULE DATA STRUCTURES + +// LOCAL FUNCTION PROTOTYPES + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CMsgVideoControl::CMsgVideoControl +// +// Constructor. Maximum video area is calculated so that height comes from +// mainpane height and width comes from data pane height. This video will +// use whole application area excluding scrollbar area. +// --------------------------------------------------------- +// +CMsgVideoControl::CMsgVideoControl( MMsgBaseControlObserver& aBaseControlObserver, + TMdaPriority aPriority, + TMdaPriorityPreference aPreference, + TInt aFlags ) : + CMsgMediaControl( aBaseControlObserver, EMsgComponentIdVideo, EMsgVideoControl ), + iMaxVideoArea( MsgEditorCommons::MsgMainPane() ), + iMaxVolume( 1 ), + iFlags( aFlags ), + iHasVideo( ETrue ), + iPriority( aPriority ), + iPreference( aPreference ) + { + if ( iFlags & ENoPlayback ) + { + iControlType = EMsgImageControl; + } + + iMaxVideoArea.SetWidth( MsgEditorCommons::MsgDataPane().Width() ); + } + +// --------------------------------------------------------- +// CMsgVideoControl::ConstructL +// --------------------------------------------------------- +// +void CMsgVideoControl::ConstructL( CMsgEditorView& aParent, MMsgAsyncControlObserver* aObserver ) + { + BaseConstructL( aParent, aObserver ); + + SetRect( iMaxVideoArea ); + + iTimer = CPeriodic::NewL( EPriorityLow ); + } + +// --------------------------------------------------------- +// CMsgVideoControl::NewL +// +// Two-phased constructor. +// --------------------------------------------------------- +// +EXPORT_C CMsgVideoControl* CMsgVideoControl::NewL( CMsgEditorView& aParent, + MMsgAsyncControlObserver* aObserver, + TMdaPriority aPriority, + TMdaPriorityPreference aPreference, + TInt aFlags ) + { + CMsgVideoControl* self = new( ELeave ) CMsgVideoControl( aParent, aPriority, aPreference, aFlags ); + + CleanupStack::PushL( self ); + self->ConstructL( aParent, aObserver ); + CleanupStack::Pop( self ); + + return self; + } + +// --------------------------------------------------------- +// CMsgVideoControl::~CMsgVideoControl +// +// Destructor +// --------------------------------------------------------- +// +CMsgVideoControl::~CMsgVideoControl() + { + delete iVideoPlayer; + delete iIdle; + + iVideoFile.Close(); + + delete iTimer; + delete iVideoAreaControl; + } + + +// --------------------------------------------------------- +// CMsgVideoControl::HasAudio +// +// Check if video clip has audio in. +// --------------------------------------------------------- +// +EXPORT_C TBool CMsgVideoControl::HasAudioL( void ) const + { + if ( iVideoPlayer && Error() == KErrNone ) + { + return iVideoPlayer->AudioEnabledL(); + } + return EFalse; + } + +// --------------------------------------------------------- +// CMsgVideoControl::SetVolume +// +// Set volume level. +// --------------------------------------------------------- +// +EXPORT_C void CMsgVideoControl::SetVolumeL( TInt aVolume ) + { + MSGMEDIACONTROLLOGGER_WRITEF( _L("MsgVideoControl::SetVolumeL(): HasAudioL(): %d, iMaxVolume: %d, aVolume: %d"), HasAudioL(), iMaxVolume, aVolume); + if ( HasAudioL() ) + { + iVideoPlayer->SetVolumeL( aVolume ); + iVolume = iVideoPlayer->Volume(); + } + } + +// --------------------------------------------------------- +// CMsgVideoControl::FocusChanged +// +// Called when focus is changing. Playing is paused or stopped +// depending on iContinueOnFocus flag when focus moves out of video control. +// When focus moved back to control playing is started automatically +// if iContinueOnFocus flag is set. +// --------------------------------------------------------- +// +void CMsgVideoControl::FocusChanged( TDrawNow aDrawNow ) + { + MSGMEDIACONTROLLOGGER_WRITEF( _L("MsgVideoControl : FocusChanged: IsFocused(): %d" ), IsFocused() ); + if ( IsFocused() ) + { + if ( iState == EMsgAsyncControlStatePaused && + iContinueOnFocus ) + { + MSGMEDIACONTROLLOGGER_WRITE( "MsgVideoControl : FocusChanged - Delayed start **" ); + // We must use CIdle to perform Play since + // "SizeChanged" event comes only after "FocusChanged" + // and thus the coordinates of the video control might + // be false at this stage. + delete iIdle; + iIdle = NULL; + TRAP_IGNORE( iIdle = CIdle::NewL( CActive::EPriorityIdle ) ); + if ( iIdle ) + { + iIdle->Start( TCallBack( DelayedPlay, this ) ); + } + else + { + MSGMEDIACONTROLLOGGER_WRITE( "MsgVideoControl : FocusChanged - Error in creating iIdle **" ); + Stop(); + } + + } + } + else + { + if ( iContinueOnFocus && + iState == EMsgAsyncControlStatePlaying ) + { + MSGMEDIACONTROLLOGGER_WRITE( "MsgVideoControl : FocusChanged - Pausing video ..." ); + TRAPD( err, PauseL() ); + if ( err ) + { + MSGMEDIACONTROLLOGGER_WRITE( "MsgVideoControl : FocusChanged - Error in pausing -> Stop it **" ); + Stop(); + } + } + else + { + MSGMEDIACONTROLLOGGER_WRITE( "MsgVideoControl : FocusChanged - Stopping video **" ); + Stop(); + } + } + + CMsgMediaControl::FocusChanged( aDrawNow ); + } + +// --------------------------------------------------------- +// CMsgVideoControl::SetAndGetSizeL +// +// Calculates and sets the size of the control and returns new size as +// reference aSize. Video control uses the whole application area excluding +// area that has been reserved for scrollbar when it is used for playback. +// Otherwise it uses the same width but height is calculated so that +// it will icon height + one line height and rounded up to the next whole line. +// --------------------------------------------------------- +// +void CMsgVideoControl::SetAndGetSizeL( TSize& aSize ) + { + MSGMEDIACONTROLLOGGER_WRITEF( _L("MsgVideoControl:: SetAndGetSizeL(): Size: %dx%d"), aSize.iWidth, aSize.iHeight); + + aSize.iWidth = iMaxVideoArea.Width(); + + if ( iFlags & ENoPlayback ) + { + aSize.iHeight = iFrame->FrameSize().iHeight; + + if ( aSize.iHeight % iLineHeight != 0 ) + { + aSize.iHeight += iLineHeight - ( aSize.iHeight % iLineHeight ); + } + + aSize.iHeight += iLineHeight; + } + else + { + aSize.iHeight = iMaxVideoArea.Height(); + } + + MSGMEDIACONTROLLOGGER_WRITEF( _L("MsgVideoControl:: SetAndGetSizeL(): New size: %dx%d"), aSize.iWidth, aSize.iHeight); + SetSize( aSize ); + } + +// --------------------------------------------------------- +// CMsgVideoControl::Reset +// +// Empties the control and sets icon visible. +// --------------------------------------------------------- +// +void CMsgVideoControl::Reset() + { + if( iVideoPlayer ) + { + iVideoPlayer->Stop(); + iVideoPlayer->Close(); + + iTimer->Cancel(); + + delete iVideoPlayer; + iVideoPlayer = NULL; + } + + iVideoFile.Close(); + + iVolume = 0; + iMaxVolume = 1; + + SetIconVisible( ETrue ); + + if ( iVideoAreaControl ) + { + iVideoAreaControl->MakeVisible( EFalse ); + } + + iControlModeFlags |= EMsgControlModeModified; + SetState( EMsgAsyncControlStateIdle ); + } + +// --------------------------------------------------------- +// CMsgVideoControl::Draw +// Draw the skin background when appriate. Normal icon drawing +// is performed when icon is visible. Otherwise when video frame +// is visible we just draw the control area around the video frame. +// Video controller is responsible of drawing the video frame area. +// --------------------------------------------------------- +// +void CMsgVideoControl::Draw( const TRect& aRect ) const + { + MSGMEDIACONTROLLOGGER_ENTERFN( "MsgVideoControl : Draw()" ); + if ( VisiblePlaceholder() ) + { + // Basic icon drawing from base class when icon is visible. + CMsgMediaControl::Draw( aRect ); + } + else + { + if ( !AknsDrawUtils::BackgroundBetweenRects( AknsUtils::SkinInstance(), + AknsDrawUtils::ControlContext( this ), + this, + SystemGc(), + aRect, + iVideoFrameArea ) ) + { + SystemGc().SetBrushColor( AKN_LAF_COLOR( 0 ) ); + SystemGc().SetBrushStyle( CGraphicsContext::ESolidBrush ); + SystemGc().SetPenStyle( CGraphicsContext::ENullPen ); + SystemGc().DrawRect( aRect ); + } + + if ( !Window().IsFaded() ) + { + // Should prevent race conditions between DSP ans window server. + iCoeEnv->WsSession().Flush(); + TRAP_IGNORE( iVideoPlayer->RefreshFrameL() ) ; + } + } + } + +// --------------------------------------------------------- +// CMsgVideoControl::HandleResourceChange +// --------------------------------------------------------- +// +void CMsgVideoControl::HandleResourceChange( TInt aType ) + { + CMsgMediaControl::HandleResourceChange( aType ); + + if ( aType == KEikDynamicLayoutVariantSwitch ) + { + Stop(); + TRAP_IGNORE( UpdateScaleFactorL() ); + + iMaxVideoArea = MsgEditorCommons::MsgMainPane(); + iMaxVideoArea.SetWidth( MsgEditorCommons::MsgDataPane().Width() ); + } + } + +// --------------------------------------------------------- +// CMsgVideoControl::SizeChanged +// +// Called when size is changed. +// --------------------------------------------------------- +// +void CMsgVideoControl::SizeChanged() + { + MSGMEDIACONTROLLOGGER_WRITEF( _L("MsgVideoControl:: SizeChanged(): New size: %dx%d"), Size().iWidth, Size().iHeight); + + CMsgMediaControl::SizeChanged(); + + SetPosition( Rect().iTl ); + MSGMEDIACONTROLLOGGER_WRITEF( _L("MsgVideoControl:: SizeChanged(): Rect().iTl %dx%d"), Rect().iTl.iX, Rect().iTl.iY); + if ( iVideoPlayer && Error() == KErrNone ) + { + TRAP_IGNORE( SetVideoFrameSizeL() ); + } + } + +// --------------------------------------------------------- +// CMsgVideoControl::LoadL +// --------------------------------------------------------- +// +void CMsgVideoControl::LoadL( RFile& aFileHandle ) + { + MSGMEDIACONTROLLOGGER_ENTERFN( "MsgVideoControl : LoadL()" ); + + iVideoFile.Close(); + User::LeaveIfError( iVideoFile.Duplicate( aFileHandle ) ); + + if ( !iVideoAreaControl ) + { + iVideoAreaControl = CMsgVideoAreaControl::NewL( this ); + } + + if ( !iVideoPlayer ) + { + // Disable frame display as video is not yet visible + TRect rect; + TRect clipRect; + + // Create VideoPlayerUtility instance + iVideoPlayer = CVideoPlayerUtility::NewL( + *this, + iPriority, + iPreference, + ControlEnv()->WsSession(), + *ControlEnv()->ScreenDevice(), + *iVideoAreaControl->DrawableWindow(), + rect, + clipRect ); + // Register for Loading/rebuffering notices + iVideoPlayer->RegisterForVideoLoadingNotification( *this ); + } + else + { + iVideoPlayer->Close(); + } + + TMMFileHandleSource mmSource( iVideoFile, iUniqueContentId ); + iVideoPlayer->OpenFileL( mmSource ); + + SetState( EMsgAsyncControlStateOpening ); + + MSGMEDIACONTROLLOGGER_LEAVEFN( "MsgVideoControl : LoadL()" ); + } + +// --------------------------------------------------------- +// CMsgVideoControl::Cancel +// --------------------------------------------------------- +// +void CMsgVideoControl::Cancel() + { + if ( iState == EMsgAsyncControlStateOpening ) + { + iVideoPlayer->Close(); + + SetState( EMsgAsyncControlStateIdle ); + } + } + +// --------------------------------------------------------- +// CMsgVideoControl::VideoResolution +// +// Gives the resolution of the video in display (Symbian OS bitmap) +// --------------------------------------------------------- +// +EXPORT_C TSize CMsgVideoControl::VideoResolutionL() const + { + TSize retVal( 0, 0 ); + if ( iVideoPlayer && Error() == KErrNone ) + { + iVideoPlayer->VideoFrameSizeL( retVal ); + } + return retVal; + } + +// --------------------------------------------------------- +// DelayedExit +// --------------------------------------------------------- +// +TInt CMsgVideoControl::DelayedPlay( TAny* aThis ) + { + TRAPD( error, static_cast( aThis )->PlayL() ); + return error; + } + +// --------------------------------------------------------- +// CMsgVideoControl::PlayL +// +// Starts video playback. +// --------------------------------------------------------- +// +void CMsgVideoControl::PlayL() + { + MSGMEDIACONTROLLOGGER_ENTERFN( "MsgVideoControl : PlayL()" ); + + // When DSP is used for audio/video playing, dsp resources are not always available. + // It is handled by setting normal 'ready' icon. No error notes occur. + if ( iVideoPlayer && + ( Error() == KErrNone || + ( iState == EMsgAsyncControlStateCorrupt + && ( Error() == KErrAccessDenied + || Error() == KErrSessionClosed ) ) ) && + !( iFlags & ENoPlayback ) ) + { + if ( iHasVideo ) + { + // Only hide icon if video file has video stream. + if ( iIconControl->IsVisible() ) + { + UpdateScaleFactorL(); + + SetIconVisible( EFalse ); + iVideoAreaControl->MakeVisible( ETrue ); + + // Enable frame display + SetVideoFrameSizeL(); + } + + iTimer->Cancel(); //just in case + + // Disable backlight turn off during video playback when video contains + // video stream. + iTimer->Start( KResetInactivityAfterOneSecond, + KResetInactivityAfterOneSecond, + TCallBack( DoResetInactivityTimer, NULL ) ); + } + + iVideoPlayer->Play(); + + if ( iState == EMsgAsyncControlStatePaused ) + { + SetState( EMsgAsyncControlStatePlaying ); + } + else + { + if (iState == EMsgAsyncControlStateReady ) + { + // First time + SetState( EMsgAsyncControlStateAboutToPlay ); + } + else + { + // State must be stop. Video has earlier played + SetState( EMsgAsyncControlStatePlaying ); + } + } + } + MSGMEDIACONTROLLOGGER_LEAVEFN( "MsgVideoControl : PlayL()" ); + } + +// --------------------------------------------------------- +// CMsgVideoControl::Stop +// +// Stops video. +// --------------------------------------------------------- +// +void CMsgVideoControl::Stop() + { + MSGMEDIACONTROLLOGGER_ENTERFN( "MsgVideoControl : Stop()" ); + + if ( iState == EMsgAsyncControlStatePlaying || + iState == EMsgAsyncControlStatePaused ) + { + iVideoPlayer->Stop(); + + // Enable backlight to turn on after video playback has been stopped. + iTimer->Cancel(); + + SetState( EMsgAsyncControlStateStopped ); + } + } + +// --------------------------------------------------------- +// CMsgVideoControl::PauseL +// +// Pauses video. +// --------------------------------------------------------- +// +void CMsgVideoControl::PauseL() + { + MSGMEDIACONTROLLOGGER_ENTERFN( "MsgVideoControl : PauseL()" ); + if ( iState == EMsgAsyncControlStatePlaying ) + { + iVideoPlayer->PauseL(); + + // Enable backlight to turn on after video playback has been paused. + iTimer->Cancel(); + + SetState( EMsgAsyncControlStatePaused ); + } + } + +// --------------------------------------------------------- +// CMsgVideoControl::IsOffScreen +// +// Returns ETrue if control is off screen. +// --------------------------------------------------------- +// +EXPORT_C TBool CMsgVideoControl::IsOffScreen() const + { + TRect rect( Rect() ); + if ( rect.iTl.iY < 0 || rect.iBr.iY > iMaxVideoArea.Height() ) + { + return ETrue; + } + else + { + return EFalse; + } + } + + +// --------------------------------------------------------- +// CMsgVideoControl::SetVideoFrameSizeL +// +// --------------------------------------------------------- +// +void CMsgVideoControl::SetVideoFrameSizeL() + { + MSGMEDIACONTROLLOGGER_ENTERFN( "MsgVideoControl : DoSizeChangedL()" ); + + TRect rect; + TRect clipRect; + + if ( VisiblePlaceholder() ) + { + // Disable frame display if icon is visible + iVideoFrameArea = TRect(); + } + else + { + TSize videoSize( iOriginalSize.iWidth * iScaleFactor, + iOriginalSize.iHeight * iScaleFactor ); + + TPoint videoPosition( Rect().Center() ); + + videoPosition.iX -= videoSize.iWidth / 2; + videoPosition.iY -= videoSize.iHeight / 2; + + // Rect & clipRect are relative to screen coordinates. + rect = TRect( videoPosition, videoSize ); + rect.Move( 0, iMaxVideoArea.iTl.iY ); + + clipRect = rect; + clipRect.iTl.iY = Max( clipRect.iTl.iY, iMaxVideoArea.iTl.iY ); + clipRect.iTl.iY = Min( clipRect.iTl.iY, iMaxVideoArea.iBr.iY ); + clipRect.iBr.iY = Min( clipRect.iBr.iY, iMaxVideoArea.iBr.iY ); + clipRect.iBr.iY = Max( clipRect.iBr.iY, iMaxVideoArea.iTl.iY ); + + // iVideoFrameArea is relative to window coordinates. + iVideoFrameArea = clipRect; + iVideoFrameArea.Move( 0, -iBaseControlObserver->ViewRect().iTl.iY ); + + MSGMEDIACONTROLLOGGER_WRITE( "MsgVideoControl : DoSizeChangedL() - Calling SetDisplayWindowL" ); + MSGMEDIACONTROLLOGGER_WRITEF( _L("MsgVideoControl:: SizeChanged(): rect (%d,%d),( %d,%d)"), rect.iTl.iX, rect.iTl.iY, rect.iBr.iX, rect.iBr.iY); + MSGMEDIACONTROLLOGGER_WRITEF( _L("MsgVideoControl:: SizeChanged(): cliRect (%d,%d),( %d,%d)"), clipRect.iTl.iX, clipRect.iTl.iY, clipRect.iBr.iX, clipRect.iBr.iY); + } + + // iVideoAreaControl is relative to screen coordinates. + iVideoPlayer->SetDisplayWindowL( + ControlEnv()->WsSession(), + *ControlEnv()->ScreenDevice(), + *iVideoAreaControl->DrawableWindow(), + rect, + clipRect ); + iVideoAreaControl->SetRect( iVideoFrameArea ); + + MSGMEDIACONTROLLOGGER_LEAVEFN( "MsgVideoControl : DoSizeChangedL()" ); + } + + +// ========================================================= +// Callbacks from VideoPlayerutility +// ========================================================= + +// --------------------------------------------------------- +// see MVideoPlayerUtilityObserver::MvpuoOpenComplete +// --------------------------------------------------------- +// +void CMsgVideoControl::MvpuoOpenComplete( TInt aError ) + { + MSGMEDIACONTROLLOGGER_ENTERFN( "MsgVideoControl : MvpuoOpenComplete()" ); + + // Close the handle now + iVideoFile.Close(); + + iMaxVolume = iVideoPlayer->MaxVolume(); + iVolume = iVideoPlayer->Volume(); + + // Needed so that video controller won't consume DRM rights automatically. + MMMFDRMCustomCommand* customCommand = iVideoPlayer->GetDRMCustomCommand(); + if ( customCommand ) + { + customCommand->DisableAutomaticIntent( ETrue ); + } + + HandleCallback( aError, iState ); + // Remember that MvpuoPrepareComplete() follows + + MSGMEDIACONTROLLOGGER_LEAVEFN( "MsgVideoControl : MvpuoOpenComplete()" ); + } + +// --------------------------------------------------------- +// see MVideoPlayerUtilityObserver::MvpuoPrepareComplete +// --------------------------------------------------------- +// +void CMsgVideoControl::MvpuoPrepareComplete( TInt aError ) + { + MSGMEDIACONTROLLOGGER_ENTERFN( "MsgVideoControl : MvpuoPrepareComplete()" ); + + // Determine whether video file contains video stream (i.e. it has something + // to show on the screen). + TRAP_IGNORE( + { + if ( iVideoPlayer->VideoFrameRateL() == 0 && iVideoPlayer->VideoBitRateL() == 0 ) + { + MSGMEDIACONTROLLOGGER_WRITE( "MsgVideoControl : no video stream" ); + + // If both video frame rate and bit rate are zeros then we can be pretty + // sure that there is no video stream on the file. + iHasVideo = EFalse; + } + + iVideoPlayer->VideoFrameSizeL( iOriginalSize ); + } ); + + HandleCallback( aError, EMsgAsyncControlStateReady ); + + MSGMEDIACONTROLLOGGER_LEAVEFN( "MsgVideoControl : MvpuoPrepareComplete()" ); + } + +// --------------------------------------------------------- +// see MVideoPlayerUtilityObserver::MvpuoFrameReady +// --------------------------------------------------------- +// +void CMsgVideoControl::MvpuoFrameReady( CFbsBitmap& /*aFrame*/,TInt /*aError*/ ) + { + MSGMEDIACONTROLLOGGER_ENTERFN( "MsgVideoControl : MvpuoFrameReady()" ); + MSGMEDIACONTROLLOGGER_LEAVEFN( "MsgVideoControl : MvpuoFrameReady()" ); + } + +// --------------------------------------------------------- +// see MVideoPlayerUtilityObserver::MvpuoPlayComplete +// Trapping callback as leaving not allowed. +// --------------------------------------------------------- +// +void CMsgVideoControl::MvpuoPlayComplete( TInt aError ) + { + MSGMEDIACONTROLLOGGER_ENTERFN( "MsgVideoControl : MvpuoPlayComplete()" ); + + // Enable backlight to turn on after video playback has ended. + iTimer->Cancel(); + + HandleCallback( aError, EMsgAsyncControlStateStopped ); + + MSGMEDIACONTROLLOGGER_LEAVEFN( "MsgVideoControl : MvpuoPlayComplete()" ); + } + +// --------------------------------------------------------- +// see MVideoPlayerUtilityObserver::MvpuoEvent +// Trapping callback as leaving not allowed. +// --------------------------------------------------------- +// +void CMsgVideoControl::MvpuoEvent( const TMMFEvent& /*aEvent*/ ) + { + MSGMEDIACONTROLLOGGER_ENTERFN( "MsgVideoControl : MvpuoEvent()" ); + MSGMEDIACONTROLLOGGER_LEAVEFN( "MsgVideoControl : MvpuoEvent()" ); + } + +// --------------------------------------------------------- +// see MVideoLoadingObserver::MvloLoadingStarted +// Trapping callback as leaving not allowed. +// --------------------------------------------------------- +// +void CMsgVideoControl::MvloLoadingStarted() + { + MSGMEDIACONTROLLOGGER_ENTERFN( "MsgVideoControl : MvloLoadingStarted()" ); + + SetState( EMsgAsyncControlStateBuffering ); + + MSGMEDIACONTROLLOGGER_LEAVEFN( "MsgVideoControl : MvloLoadingStarted()" ); + } + +// --------------------------------------------------------- +// see MVideoLoadingObserver::MvloLoadingComplete +// Trapping callback as leaving not allowed. +// --------------------------------------------------------- +// +void CMsgVideoControl::MvloLoadingComplete() + { + MSGMEDIACONTROLLOGGER_ENTERFN( "MsgVideoControl : MvloLoadingComplete()" ); + + SetState( EMsgAsyncControlStatePlaying ); + + MSGMEDIACONTROLLOGGER_LEAVEFN( "MsgVideoControl : MvloLoadingComplete()" ); + } + +// --------------------------------------------------------- +// CMsgVideoControl::HandleCallback +// --------------------------------------------------------- +// +void CMsgVideoControl::HandleCallback( TInt aError, + TMsgAsyncControlState aNewState ) + { + MSGMEDIACONTROLLOGGER_ENTERFN( "MsgVideoControl : HandleCallback()" ); + MSGMEDIACONTROLLOGGER_WRITEF_ERROR_STATE( _L("CMsgVideoControl::HandleCallback: **aError: %d, CurrentState: %S"), aError, iState); + MSGMEDIACONTROLLOGGER_WRITEF_ERROR_STATE( _L("CMsgVideoControl::HandleCallback: **aError: %d, aNewState: %S"), aError, aNewState); + + if ( aError == KErrMMPartialPlayback ) + { + aError = KErrNone; + } + + iError = aError; + switch ( aError ) + { + case KErrNone: + { + SetState( aNewState ); + + if ( iState == EMsgAsyncControlStateOpening ) + { + if ( iVideoPlayer ) + { + iVideoPlayer->Prepare(); + } + } + + break; + } + case DRMCommon::EGeneralError: + case DRMCommon::EUnknownMIME: + case DRMCommon::EVersionNotSupported: + case DRMCommon::ESessionError: + case DRMCommon::ENoRights: + case DRMCommon::ERightsDBCorrupted: + case DRMCommon::EUnsupported: + case DRMCommon::ERightsExpired: + case DRMCommon::EInvalidRights: + { + SetState( EMsgAsyncControlStateNoRights ); + break; + } + case KErrNoMemory: + default: + { + SetState( EMsgAsyncControlStateCorrupt ); + } + } + + MSGMEDIACONTROLLOGGER_LEAVEFN( "MsgVideoControl : HandleCallback()" ); + } + +// --------------------------------------------------------- +// CMsgVideoControl::Reset +// +// Empties the control. +// --------------------------------------------------------- +// +void CMsgVideoControl::Close() + { + MSGMEDIACONTROLLOGGER_ENTERFN( "MsgVideoControl : Close()" ); + + Reset(); + + MSGMEDIACONTROLLOGGER_LEAVEFN( "MsgVideoControl : Close()" ); + } + + +// --------------------------------------------------------- +// CMsgImageControl::HitRegionContains +// +// Note! CONE will do final verification if control is really hit so +// not need to do it here. +// --------------------------------------------------------- +// +#ifdef RD_SCALABLE_UI_V2 +TBool CMsgVideoControl::HitRegionContains( const TPoint& aPoint, + const CCoeControl& /*aControl*/ ) const + { + TBool result( EFalse ); + + CCoeControl* visiblePlaceholder = VisiblePlaceholder(); + + if ( visiblePlaceholder ) + { + result = visiblePlaceholder->Rect().Contains( aPoint ); + } + else + { + result = iVideoFrameArea.Contains( aPoint );; + } + + return result; + } +#else +TBool CMsgVideoControl::HitRegionContains( const TPoint& /*aPoint*/, + const CCoeControl& /*aControl*/ ) const + { + return EFalse; + } + +#endif // RD_SCALABLE_UI_V2 + +// --------------------------------------------------------- +// CMsgVideoControl::HandleResourceChange +// +// Resets inactivity timer and prevents backlight from turning +// off during video playback. +// --------------------------------------------------------- +// +TInt CMsgVideoControl::DoResetInactivityTimer( TAny* /*aObject*/ ) + { + User::ResetInactivityTime(); + return KErrNone; + } + +// --------------------------------------------------------- +// CMsgVideoControl::UpdateScaleFactorL +// --------------------------------------------------------- +// +void CMsgVideoControl::UpdateScaleFactorL() + { + if ( iVideoPlayer ) + { + TReal widthRatio = static_cast( iSize.iWidth ) / + static_cast( iOriginalSize.iWidth ); + TReal heightRatio = static_cast( iSize.iHeight ) / + static_cast( iOriginalSize.iHeight ); + + iScaleFactor = widthRatio < heightRatio ? widthRatio : + heightRatio; + } + } + +// End of File