--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videditor/VideoEditorUiComponents/src/VeiVideoDisplay.cpp Fri Jan 29 14:08:33 2010 +0200
@@ -0,0 +1,1025 @@
+/*
+* Copyright (c) 2010 Ixonos Plc.
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - Initial contribution
+*
+* Contributors:
+* Ixonos Plc
+*
+* Description:
+*
+*/
+
+
+// System includes
+#include <gulicon.h>
+#include <coemain.h>
+#include <eikenv.h>
+#include <akniconutils.h>
+#include <aknsdrawutils.h>
+#include <aknsdatacontext.h>
+#include <akniconutils.h>
+#include <aknbitmapanimation.h>
+#include <barsread.h>
+#include <VideoEditorUiComponents.mbg>
+#include <VideoEditorUiComponents.rsg>
+#include <audiopreference.h>
+#include <mmf/common/mmfcontrollerpluginresolver.h>
+#include <ConeResLoader.h>
+#include <data_caging_path_literals.hrh>
+#include <mmf/common/mmfcontrollerframeworkbase.h>
+#include <mmf/common/mmferrors.h>
+#ifdef VERBOSE
+#include <eikappui.h>
+#endif
+
+// User includes
+#include "VeiVideoEditorSettings.h"
+#include "VeiVideoDisplay.h"
+#include "VideoEditorCommon.h"
+#include "VideoEditorUtils.h"
+#include "VideoEditorDebugUtils.h"
+
+// CONSTANTS
+_LIT(KResourceFile, "VideoEditorUiComponents.rsc");
+
+EXPORT_C CVeiVideoDisplay* CVeiVideoDisplay::NewL( const TRect& aRect, const CCoeControl* aParent,
+ MVeiVideoDisplayObserver& aObserver )
+ {
+ CVeiVideoDisplay* self = CVeiVideoDisplay::NewLC( aRect, aParent, aObserver );
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+EXPORT_C CVeiVideoDisplay* CVeiVideoDisplay::NewLC( const TRect& aRect, const CCoeControl* aParent,
+ MVeiVideoDisplayObserver& aObserver )
+ {
+ CVeiVideoDisplay* self = new (ELeave) CVeiVideoDisplay (aObserver);
+ CleanupStack::PushL( self );
+ self->ConstructL( aRect, aParent );
+ return self;
+ }
+
+CVeiVideoDisplay::CVeiVideoDisplay( MVeiVideoDisplayObserver& aObserver ) : iObserver (aObserver)
+ {
+ }
+
+void CVeiVideoDisplay::ConstructL( const TRect& aRect,
+ const CCoeControl* aParent)
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::ConstructL: in");
+
+ TFileName mbmPath( VideoEditorUtils::IconFileNameAndPath(KVideoEditorUiComponentsIconFileId) );
+
+
+// Backgroud squares icon loading is disabled there is no suitable graphic in
+// S60 build at the moment. A new graphic should be requested and added here.
+
+// AknIconUtils::CreateIconL( iBgSquaresBitmap, iBgSquaresBitmapMask,
+// mbmPath, EMbmVideoeditoruicomponentsQgn_graf_ve_novideo,
+// EMbmVideoeditoruicomponentsQgn_graf_ve_novideo_mask );
+
+
+ TRAP_IGNORE( CVeiVideoEditorSettings::GetMediaPlayerVolumeLevelL( iInternalVolume ) );
+
+ iMuted = (iInternalVolume == 0);
+
+ iBorderWidth = 2;
+ iDuration = 0;
+ iMaxVolume = 0;
+ iBlank = ETrue;
+ iAnimationOn = EFalse;
+ iBufferingCompleted = ETrue;
+ SetContainerWindowL( *aParent );
+
+ SetRect( aRect );
+ ActivateL();
+
+ ControlEnv()->AddForegroundObserverL( *this );
+
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::ConstructL: out");
+ }
+
+void CVeiVideoDisplay::SizeChanged()
+ {
+ LOGFMT2(KVideoEditorLogFile, "CVeiVideoDisplay::SizeChanged: in: Size(): (%d,%d)", Size().iWidth, Size().iHeight);
+
+ if ( iVideoPlayerUtility )
+ {
+ TRect screenRect = CalculateVideoPlayerArea();
+ LOGFMT4(KVideoEditorLogFile, "CVeiVideoDisplay::SizeChanged 1, ScreenRect Tl:(%d,%d) Br:(%d,%d)", screenRect.iTl.iX,screenRect.iTl.iY,screenRect.iBr.iX,screenRect.iBr.iY);
+
+ /* Get the required parameters for the video player. */
+ CCoeEnv* coeEnv = CCoeEnv::Static();
+ RWsSession& session = coeEnv->WsSession();
+ CWsScreenDevice* screenDevice = coeEnv->ScreenDevice();
+ RDrawableWindow* drawableWindow = DrawableWindow();
+
+ TRAPD(err, iVideoPlayerUtility->SetDisplayWindowL( session, *screenDevice, *drawableWindow,
+ screenRect, screenRect ) );
+ if( KErrNone != err )
+ {
+ LOGFMT(KVideoEditorLogFile, "CVeiVideoDisplay::SizeChanged: iVideoPlayerUtility->SetDisplayWindowL failed: %d", err);
+ iObserver.NotifyVideoDisplayEvent( MVeiVideoDisplayObserver::EError );
+ }
+ }
+ AknIconUtils::SetSize( iBgSquaresBitmap, Size(), EAspectRatioNotPreserved );
+
+
+ if( iAnimationOn )
+ {
+ iAnimation->CancelAnimation();
+ TRect rect( Rect() );
+ rect.Move( iBorderWidth, iBorderWidth );
+ rect.Resize( -iBorderWidth*2, -iBorderWidth );
+
+ iAnimation->SetRect( rect );
+ TRAPD(err, iAnimation->StartAnimationL() );
+ if( KErrNone != err )
+ {
+ LOGFMT(KVideoEditorLogFile, "CVeiVideoDisplay::SizeChanged: StartAnimationL failed: %d", err);
+ iObserver.NotifyVideoDisplayEvent( MVeiVideoDisplayObserver::EError );
+ }
+ }
+
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::SizeChanged: out");
+ }
+
+TRect CVeiVideoDisplay::CalculateVideoPlayerArea()
+ {
+ /* Calculate regions. */
+ TRect screenRect;
+ TRect rect( Rect() );
+ /* In full screen mode return whole screen rect*/
+ if ( rect.iTl == TPoint( 0,0) )
+ {
+ return rect;
+ }
+ LOGFMT4(KVideoEditorLogFile, "CVeiVideoDisplay::CalculateVideoPlayerArea() 1: Rect() Tl:(%d,%d) Br:(%d,%d)", rect.iTl.iX,rect.iTl.iY,rect.iBr.iX,rect.iBr.iY);
+
+ TPoint position = PositionRelativeToScreen();
+ LOGFMT2(KVideoEditorLogFile, "CVeiVideoDisplay::CalculateVideoPlayerArea() 2: PositionRelativeToScreen(%d,%d)", position.iX, position.iY);
+
+ screenRect = rect;
+ screenRect.Move( TPoint( iBorderWidth, (position.iY-Rect().iTl.iY) + iBorderWidth ) );
+ screenRect.Resize( -(iBorderWidth*2), -(iBorderWidth*2 ));
+ return screenRect;
+ }
+
+TKeyResponse CVeiVideoDisplay::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
+ {
+ LOGFMT2(KVideoEditorLogFile, "CVeiVideoDisplay::OfferKeyEventL: aKeyEvent.iCode:%d, aType:%d", aKeyEvent.iCode, aType);
+
+ if ( iMuted )
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::OfferKeyEventL: volume is muted.");
+ return EKeyWasNotConsumed;
+ }
+
+ if ( aType == EEventKey )
+ {
+ switch (aKeyEvent.iCode)
+ {
+ case EKeyDownArrow:
+ case EStdKeyDecVolume:
+ {
+ AdjustVolumeL( -1 );
+ return EKeyWasConsumed;
+ }
+ case EKeyUpArrow:
+ case EStdKeyIncVolume:
+ {
+ AdjustVolumeL( 1 );
+ return EKeyWasConsumed;
+ }
+ default:
+ {
+ return EKeyWasConsumed;
+ }
+ }
+ }
+ return EKeyWasConsumed;
+ }
+
+EXPORT_C CVeiVideoDisplay::~CVeiVideoDisplay()
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::~CVeiVideoDisplay(): In");
+ // Remove foreground event observer
+ ControlEnv()->RemoveForegroundObserver( *this );
+ if ( iDisplayBitmap )
+ {
+ delete iDisplayBitmap;
+ iDisplayBitmap = NULL;
+ }
+ if ( iDisplayMask )
+ {
+ delete iDisplayMask;
+ iDisplayMask = NULL;
+ }
+ delete iBgSquaresBitmap;
+ delete iBgSquaresBitmapMask;
+
+ if ( iVideoPlayerUtility != NULL )
+ {
+ iVideoPlayerUtility->Close();
+ delete iVideoPlayerUtility;
+ iVideoPlayerUtility = NULL;
+ }
+ delete iAnimation;
+ delete iCallBack;
+ delete iFilename;
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::~CVeiVideoDisplay(): Out");
+ }
+
+EXPORT_C void CVeiVideoDisplay::ShowPictureL( const CFbsBitmap& aBitmap, const CFbsBitmap& aMask )
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::ShowPictureL: In");
+
+ StoreDisplayBitmapL( aBitmap, &aMask );
+
+ DrawDeferred();
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::ShowPictureL: Out");
+ }
+
+EXPORT_C void CVeiVideoDisplay::ShowPictureL( const CFbsBitmap& aBitmap )
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::ShowPicture2: In");
+
+ StoreDisplayBitmapL( aBitmap );
+
+ // set screen size to pause mode
+ if ( iVideoPlayerUtility )
+ {
+ TRect screenRect = TRect( TPoint(0,0), TPoint(0,0) );
+ LOGFMT4(KVideoEditorLogFile, "CVeiVideoDisplay::SizeChanged 1, ScreenRect Tl:(%d,%d) Br:(%d,%d)", screenRect.iTl.iX,screenRect.iTl.iY,screenRect.iBr.iX,screenRect.iBr.iY);
+
+ /* Get the required parameters for the video player. */
+ CCoeEnv* coeEnv = CCoeEnv::Static();
+ RWsSession& session = coeEnv->WsSession();
+ CWsScreenDevice* screenDevice = coeEnv->ScreenDevice();
+ RDrawableWindow* drawableWindow = DrawableWindow();
+
+ iVideoPlayerUtility->SetDisplayWindowL( session, *screenDevice, *drawableWindow,
+ screenRect, screenRect );
+ }
+
+ DrawDeferred();
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::ShowPicture2: Out");
+ }
+
+EXPORT_C void CVeiVideoDisplay::SetPictureL( const CFbsBitmap& aBitmap )
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::SetPictureL: In");
+
+ StoreDisplayBitmapL( aBitmap );
+
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::SetPictureL: Out");
+ }
+
+void CVeiVideoDisplay::StoreDisplayBitmapL( const CFbsBitmap& aBitmap, const CFbsBitmap* aMask )
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::StoreDisplayBitmapL: In");
+
+ iBlank = EFalse;
+ iBlack = EFalse;
+
+ // Delete old bitmaps
+ if ( iDisplayBitmap )
+ {
+ delete iDisplayBitmap;
+ iDisplayBitmap = NULL;
+ }
+ if ( iDisplayMask )
+ {
+ delete iDisplayMask;
+ iDisplayMask = NULL;
+ }
+
+ // Create new bitmaps
+ iDisplayBitmap = new (ELeave) CFbsBitmap;
+ iDisplayBitmap->Duplicate( aBitmap.Handle() );
+ if (aMask)
+ {
+ iDisplayMask = new (ELeave) CFbsBitmap;
+ iDisplayMask->Duplicate( aMask->Handle() );
+ }
+
+#ifdef VERBOSE
+ // Write the display bitmap to disk
+ _LIT(KFileName, "C:\\data\\images\\videoeditor\\iDisplayBitmap.mbm");
+ TFileName saveToFile( KFileName );
+ CEikonEnv* env = CEikonEnv::Static();
+ env->EikAppUi()->Application()->GenerateFileName( env->FsSession(), saveToFile );
+ User::LeaveIfError( iDisplayBitmap->Save( saveToFile ) );
+ LOGFMT(KVideoEditorLogFile, "CVeiVideoDisplay::StoreDisplayBitmapL: saved %S", &saveToFile);
+#endif
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::StoreDisplayBitmapL: Out");
+ }
+
+EXPORT_C void CVeiVideoDisplay::ShowBlackScreen()
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::ShowBlackScreen: In");
+ iBlack = ETrue;
+ DrawDeferred();
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::ShowBlackScreen: Out");
+ }
+EXPORT_C void CVeiVideoDisplay::SetBlackScreen( TBool aBlack )
+ {
+ LOGFMT(KVideoEditorLogFile, "CVeiVideoDisplay::SetBlackScreen: In and out, aBlack:%d", aBlack);
+ iBlack = aBlack;
+ }
+EXPORT_C void CVeiVideoDisplay::ShowBlankScreen()
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::ShowBlankScreen: In and out");
+ iBlank = ETrue;
+ DrawDeferred();
+ }
+
+EXPORT_C TTimeIntervalMicroSeconds CVeiVideoDisplay::PositionL() const
+ {
+ if ( !iVideoPlayerUtility )
+ return TTimeIntervalMicroSeconds(0);
+ else
+ return iVideoPlayerUtility->PositionL();
+ }
+
+EXPORT_C TVideoRotation CVeiVideoDisplay::RotationL() const
+ {
+ if ( iVideoPlayerUtility )
+ {
+ return iVideoPlayerUtility->RotationL();
+ }
+ else
+ {
+ return EVideoRotationNone;
+ }
+ }
+
+EXPORT_C void CVeiVideoDisplay::SetPositionL( const TTimeIntervalMicroSeconds& aPosition )
+ {
+ LOGFMT(KVideoEditorLogFile, "VideoDisplay SetPositionL: %Ld", aPosition.Int64());
+ iStartPoint = aPosition;
+ if ( iVideoPlayerUtility && iBufferingCompleted )
+ {
+ iVideoPlayerUtility->SetPositionL( iStartPoint );
+ }
+ }
+
+EXPORT_C void CVeiVideoDisplay::SetRotationL(TVideoRotation aRotation)
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::SetRotationL: in");
+ if ( iVideoPlayerUtility )
+ {
+ iVideoPlayerUtility->SetRotationL( aRotation );
+ }
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::SetRotationL: out");
+ }
+
+
+EXPORT_C void CVeiVideoDisplay::Stop( TBool aCloseStream )
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::Stop: in");
+ if ( iVideoPlayerUtility )
+ {
+ // this is poor solution, responsibility of taking care of iStartPoint be elsewhere
+ TRAP_IGNORE(iStartPoint = PositionL());
+ iVideoPlayerUtility->Stop();
+
+ if ( aCloseStream )
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::Stop 1, Close CVideoPlayerUtility.");
+ iVideoPlayerUtility->Close();
+ delete iVideoPlayerUtility;
+ iVideoPlayerUtility = NULL;
+ }
+ }
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::Stop 2");
+ iObserver.NotifyVideoDisplayEvent( MVeiVideoDisplayObserver::EStop );
+
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::Stop: out");
+ }
+
+EXPORT_C TInt CVeiVideoDisplay::GetBorderWidth() const
+ {
+ return iBorderWidth;
+ }
+
+EXPORT_C TSize CVeiVideoDisplay::GetScreenSize() const
+ {
+ TRect rect( Rect() );
+ rect.Shrink( iBorderWidth, iBorderWidth-1 );
+ return rect.Size();
+ }
+
+EXPORT_C void CVeiVideoDisplay::Play()
+ {
+ /*LOG(KVideoEditorLogFile, "CVeiVideoDisplay::Play :in");
+ if (iVideoPlayerUtility && iBufferingCompleted )
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::Play :2");
+ //SizeChanged();
+ iVideoPlayerUtility->Play();
+ }
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::Play: out");
+ */
+ PlayL(*iFilename);
+ }
+
+EXPORT_C void CVeiVideoDisplay::PlayMarkedL( const TTimeIntervalMicroSeconds& aStartPoint, const TTimeIntervalMicroSeconds& aEndPoint)
+ {
+ /*
+ LOGFMT2(KVideoEditorLogFile, "CVeiVideoDisplay::PlayMarked:In, aStartPoint:%Ld, aEndPoint:%Ld", aStartPoint.Int64(), aEndPoint.Int64());
+ iVideoPlayerUtility->SetPositionL(aStartPoint);
+ //SizeChanged();
+ iVideoPlayerUtility->Play(aStartPoint, aEndPoint);
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::PlayMarked :Out");
+ */
+ PlayL(*iFilename, aStartPoint, aEndPoint);
+ }
+
+EXPORT_C void CVeiVideoDisplay::PlayL( const TDesC& aFilename,
+ const TTimeIntervalMicroSeconds& aStartPoint,
+ const TTimeIntervalMicroSeconds& aEndPoint )
+ {
+ LOGFMT3(KVideoEditorLogFile, "CVeiVideoDisplay::PlayL(): In, aFilename:%S, aStartPoint:%Ld, aEndPoint:%Ld", &aFilename, aStartPoint.Int64(), aEndPoint.Int64());
+
+ if ( iVideoPlayerUtility && iBufferingCompleted)
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::PlayL 1");
+ if ( aEndPoint.Int64() != 0 )
+ {
+ LOGFMT2(KVideoEditorLogFile, "CVeiVideoDisplay::Play 2, iStartPoint:%Ld, aStartPoint:%Ld", iStartPoint.Int64(), aStartPoint.Int64());
+ iStartPoint = aStartPoint;
+ //iVideoPlayerUtility->SetPositionL(iStartPoint);
+ //SizeChanged();
+ iVideoPlayerUtility->Stop();
+ iVideoPlayerUtility->Play( aStartPoint, aEndPoint );
+ }
+ else
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::PlayL 3");
+ //SizeChanged();
+ //iVideoPlayerUtility->Play(iStartPoint, iVideoPlayerUtility->DurationL());
+ iVideoPlayerUtility->Play();
+ }
+ }
+ else if (!iVideoPlayerUtility && iBufferingCompleted) /* should this be: if (! iVideoPlayerUtility)*/
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::PlayL 4");
+ if ( aEndPoint.Int64() != 0 )
+ {
+ iStartPoint = aStartPoint;
+ iEndPoint = aEndPoint;
+ }
+ OpenFileL( aFilename );
+ }
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::PlayL(): out");
+ }
+
+EXPORT_C void CVeiVideoDisplay::PauseL()
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::PauseL(): in");
+ if ( iVideoPlayerUtility && iBufferingCompleted )
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::PauseL 1, calling pause");
+ iVideoPlayerUtility->PauseL();
+
+ /*
+ //@: for some reason this does not work
+ TDisplayMode dmode = EColor64K;
+ iVideoPlayerUtility->GetFrameL(dmode, ContentAccess::EPlay);
+ */
+
+ /*
+ //@: do not work either:
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::PauseL(): 2, refreshing");
+ TInt err = KErrNone;
+ TRAP(err, iVideoPlayerUtility->RefreshFrameL());
+ LOGFMT(KVideoEditorLogFile, "CVeiVideoDisplay::PauseL(): 3, err:%d", err);
+ */
+ }
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::PauseL(): out");
+ }
+
+EXPORT_C void CVeiVideoDisplay::OpenFileL( const TDesC& aFilename )
+ {
+ LOGFMT(KVideoEditorLogFile, "CVeiVideoDisplay::OpenFileL: In, aFilename:%S", &aFilename);
+
+ /* Calculate regions. */
+ TRect screenRect = CalculateVideoPlayerArea();
+
+ /* Get the required parameters for the video player. */
+ CCoeEnv* coeEnv = CCoeEnv::Static();
+ RWsSession& session = coeEnv->WsSession();
+ CWsScreenDevice* screenDevice = coeEnv->ScreenDevice();
+ RDrawableWindow* drawableWindow = DrawableWindow();
+
+ if ( iVideoPlayerUtility != NULL )
+ {
+ delete iVideoPlayerUtility;
+ iVideoPlayerUtility = NULL;
+ }
+
+ if (!iFilename)
+ {
+ iNewFile = ETrue;
+ iDuration = TTimeIntervalMicroSeconds(0);
+ iFilename = aFilename.AllocL();
+ }
+ else if ((*iFilename).CompareF(aFilename))
+ {
+ iNewFile = ETrue;
+ iDuration = TTimeIntervalMicroSeconds(0);
+ HBufC* temp = aFilename.AllocL();
+ delete iFilename;
+ iFilename = temp;
+ }
+
+ /* Initialize the video player. */
+ iVideoPlayerUtility = CVideoPlayerUtility::NewL( *this,
+ static_cast<enum TMdaPriority>(KAudioPriorityRealOnePlayer),
+ static_cast<enum TMdaPriorityPreference>(KAudioPrefRealOneLocalPlayback),
+ session, *screenDevice, *drawableWindow, screenRect, screenRect );
+
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::OpenFileL 2");
+ iObserver.NotifyVideoDisplayEvent( MVeiVideoDisplayObserver::ELoadingStarted );
+ iVideoPlayerUtility->RegisterForVideoLoadingNotification( *this );
+ /* Open the file. */
+ iVideoPlayerUtility->OpenFileL( *iFilename );
+
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::OpenFileL: Out");
+ }
+// ---------------------------------------------------------
+// CVeiPreviewContainer::MvpuoFrameReady( CFbsBitmap& aFrame, TInt aError )
+// Notification to the client that the frame requested by a call to GetFrameL is ready.
+// ---------------------------------------------------------
+void CVeiVideoDisplay::MvpuoFrameReady( CFbsBitmap& /*aFrame*/, TInt DEBUGLOG_ARG(aError) )
+ {
+ LOGFMT(KVideoEditorLogFile, "CVeiVideoDisplay::MvpuoFrameReady: In and Out, aError:%d", aError);
+ /*
+ @: for some reason this does not work
+ if (KErrNone == aError)
+ {
+ SetPictureL(aFrame);
+ }
+ DrawDeferred();
+ */
+ }
+
+// ---------------------------------------------------------
+// CVeiVideoDisplay::MvpuoOpenComplete( TInt aError )
+// Notification to the client that the opening of the video clip has completed.
+// ---------------------------------------------------------
+void CVeiVideoDisplay::MvpuoOpenComplete( TInt aError )
+ {
+ LOGFMT(KVideoEditorLogFile, "CVeiVideoDisplay::MvpuoOpenComplete: In, aError:%d", aError);
+ if( aError != KErrNone )
+ {
+ iObserver.NotifyVideoDisplayEvent( MVeiVideoDisplayObserver::EError );
+ return;
+ }
+
+ iVideoPlayerUtility->Prepare();
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::MvpuoOpenComplete: Out");
+ }
+
+// ---------------------------------------------------------
+// CVeiVideoDisplay::MvpuoPlayComplete( TInt aError )
+// Notification that video playback has completed.
+// ---------------------------------------------------------
+void CVeiVideoDisplay::MvpuoPlayComplete( TInt aError )
+ {
+ LOGFMT(KVideoEditorLogFile, "CVeiVideoDisplay::MvpuoPlayComplete:In, aError:%d", aError);
+ iStartPoint = TTimeIntervalMicroSeconds(0);
+ /* iBufferingCompleted is set to EFalse in MvloLoadingStarted and set back ETrue in
+ MvloLoadingCompleted.
+ If error occurs in the middle of the loading process the latter one is not called and
+ iBufferingCompleted is left to EFalse, that is why is it set to ETrue here also for safety's sake
+ */
+ iBufferingCompleted = ETrue;
+ iObserver.NotifyVideoDisplayEvent( MVeiVideoDisplayObserver::EPlayComplete, aError );
+
+ // Stop() better to be called from iObserver
+ /*if ( KErrSessionClosed == aError ) // -45 (10/2006)
+ {
+ Stop( ETrue );
+ }
+ */
+
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::MvpuoPlayComplete: Out");
+ }
+
+// ---------------------------------------------------------
+// CVeiPreviewContainer::MvpuoEvent( const TMMFEvent& /*aEvent*/ )
+//
+// ---------------------------------------------------------
+void CVeiVideoDisplay::MvpuoEvent( const TMMFEvent& aEvent )
+ {
+ LOGFMT2(KVideoEditorLogFile, "CVeiVideoDisplay::MvpuoEvent In, aEvent.iEventType:%d, aEvent.iErrorCode:%d",
+ aEvent.iEventType.iUid, aEvent.iErrorCode);
+
+ if (KMMFEventCategoryVideoPlayerGeneralError == aEvent.iEventType &&
+ KErrMMAudioDevice == aEvent.iErrorCode)
+ {
+ iObserver.NotifyVideoDisplayEvent( MVeiVideoDisplayObserver::EError, aEvent.iErrorCode );
+ }
+
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::MvpuoEvent, Out");
+ }
+
+// ---------------------------------------------------------
+// CVeiVideoDisplay::MvpuoPrepareComplete( TInt aError )
+// Notification to the client that the opening of the video clip has been prepared.
+// ---------------------------------------------------------
+void CVeiVideoDisplay::MvpuoPrepareComplete( TInt aError )
+ {
+ LOGFMT(KVideoEditorLogFile, "CVeiVideoDisplay::MvpuoPrepareComplete:In, aError:%d",aError);
+
+ //LocateEntryL();
+ if( KErrNone != aError )
+ {
+ iObserver.NotifyVideoDisplayEvent( MVeiVideoDisplayObserver::EError, aError );
+ return;
+ }
+
+ SetPlaybackVolumeL();
+
+ SetPositionL(iStartPoint);
+ iObserver.NotifyVideoDisplayEvent( MVeiVideoDisplayObserver::EOpenComplete, iStartPoint.Int64() );
+/** If volume is 0(muted) give event so muted icon is drawn to navipane */
+ if ( iInternalVolume == 0 )
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::MvpuoPrepareComplete 1");
+ iObserver.NotifyVideoDisplayEvent( MVeiVideoDisplayObserver::EVolumeLevelChanged);
+ }
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::MvpuoPrepareComplete: Out");
+ }
+
+
+void CVeiVideoDisplay::LocateEntryL()
+ {
+ TInt metaDataCount = iVideoPlayerUtility->NumberOfMetaDataEntriesL();
+ CMMFMetaDataEntry* entry = NULL;
+ // Loop through metadata
+ for ( TInt i = 0; i < metaDataCount; i++ )
+ {
+ entry = iVideoPlayerUtility->MetaDataEntryL( i );
+ HBufC* name = entry->Name().AllocLC();
+ HBufC* value = entry->Value().AllocLC();
+ LOGFMT3(KVideoEditorLogFile, "CVeiVideoDisplay::LocateEntryL, i:%d, name,value:%S,%S", i, name, value);
+ CleanupStack::PopAndDestroy( value );
+ CleanupStack::PopAndDestroy( name );
+ }
+ }
+
+void CVeiVideoDisplay::MvloLoadingStarted()
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::MvloLoadingStarted, In");
+ iBufferingCompleted = EFalse;
+ iObserver.NotifyVideoDisplayEvent( MVeiVideoDisplayObserver::EBufferingStarted );
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::MvloLoadingStarted, Out");
+ }
+
+void CVeiVideoDisplay::MvloLoadingComplete()
+ {
+ LOGFMT(KVideoEditorLogFile, "CVeiVideoDisplay::MvloLoadingComplete, In, iStartPoint:%Ld", iStartPoint.Int64());
+ iBufferingCompleted = ETrue;
+ iObserver.NotifyVideoDisplayEvent( MVeiVideoDisplayObserver::ELoadingComplete, iStartPoint.Int64() );
+ // set screen size to play mode
+ SizeChanged();
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::MvloLoadingComplete, Out");
+ }
+
+void CVeiVideoDisplay::Draw( const TRect& aRect ) const
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::Draw in");
+ CWindowGc& gc = SystemGc();
+
+ TRect rect( Rect() );
+
+ rect.Move(iBorderWidth,iBorderWidth);
+ rect.Resize(-iBorderWidth*2,-iBorderWidth*2);
+ TSize clipRect( rect.Size() );
+
+ if ( Window().DisplayMode() == EColor16MA )
+ {
+ gc.SetDrawMode(CGraphicsContext::EDrawModeWriteAlpha);
+ gc.SetBrushColor(TRgb::Color16MA( 0 ));
+ gc.Clear(aRect);
+ }
+
+ if ( iBlack )
+ {
+/*
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::Draw 1");
+ gc.SetPenStyle( CWindowGc::ENullPen );
+ gc.SetBrushColor( KRgbBlack );
+ gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
+ gc.DrawRect( rect );
+
+ gc.SetPenStyle( CWindowGc::ESolidPen );
+ gc.SetPenSize( TSize(iBorderWidth,iBorderWidth) );
+
+ gc.DrawRoundRect(aRect, TSize(4,4));
+*/
+ return;
+ }
+
+ if ( iBlank )
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::Draw 2");
+ gc.BitBltMasked( rect.iTl, iBgSquaresBitmap, clipRect, iBgSquaresBitmapMask, EFalse);
+ }
+ else
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::Draw 3");
+
+ if ( iDisplayBitmap->SizeInPixels() == GetScreenSize() )
+ {
+
+ gc.BitBlt( rect.iTl, iDisplayBitmap, clipRect);
+ }
+ else
+ {
+
+ TSize clipRectSize = iDisplayBitmap->SizeInPixels();
+ TRect destRect;
+
+ // check which one has bigger aspect ratio, video diplay or thumbnail.
+ TReal displayAR = rect.Width() / TReal(rect.Height());
+ TReal thumbnailAR = clipRectSize.iWidth / TReal(clipRectSize.iHeight);
+
+ if (thumbnailAR > displayAR)
+ {
+ //Create proper destination rect
+ TInt newHeight = (clipRectSize.iHeight * rect.Width() ) / clipRectSize.iWidth;
+ TInt newTLiY = rect.iTl.iY + (rect.Height() - newHeight) / 2;
+ destRect = TRect(TPoint(rect.iTl.iX,newTLiY), TSize(rect.Width(), newHeight));
+ }
+ else
+ {
+ // write here destrect calculation when thumbnailAR < displayAR
+ TInt newWidth = rect.Height()*thumbnailAR;
+ TInt newTLiX = rect.iTl.iX + ((rect.Width()-newWidth)/2);
+ destRect = TRect (TPoint(newTLiX, rect.iTl.iY), TSize(newWidth, rect.Height()));
+ }
+ gc.DrawBitmap( destRect, iDisplayBitmap );
+ }
+ }
+
+/*
+ gc.SetPenStyle( CWindowGc::ESolidPen );
+ gc.SetPenSize( TSize(iBorderWidth,iBorderWidth) );
+
+ rect = Rect();
+ rect.Resize(-(iBorderWidth-1),-(iBorderWidth-1));
+ gc.DrawRoundRect( rect, TSize(4,4));
+*/
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::Draw out");
+ }
+
+
+EXPORT_C TTimeIntervalMicroSeconds CVeiVideoDisplay::TotalLengthL()
+ {
+ if ( !iVideoPlayerUtility )
+ {
+ return iDuration;
+ //return TTimeIntervalMicroSeconds(0);
+ }
+ else
+ {
+ TRAPD( err, iDuration =iVideoPlayerUtility->DurationL() );
+ if ( err == KErrNone )
+ {
+ return iDuration;
+ }
+ else
+ {
+ return TTimeIntervalMicroSeconds(0);
+ }
+ }
+ }
+
+EXPORT_C void CVeiVideoDisplay::AdjustVolumeL( TInt aIncrement )
+ {
+ LOGFMT(KVideoEditorLogFile, "CVeiVideoDisplay::AdjustVolumeL( %d ): in", aIncrement);
+
+ iInternalVolume += aIncrement;
+
+ if ( iInternalVolume < 0 )
+ {
+ iInternalVolume = 0;
+ }
+ if ( iInternalVolume > KMaxVolumeLevel )
+ {
+ iInternalVolume = KMaxVolumeLevel;
+ }
+
+ SetPlaybackVolumeL();
+ iObserver.NotifyVideoDisplayEvent( MVeiVideoDisplayObserver::EVolumeLevelChanged );
+
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::SetVolumeL(): out");
+ }
+
+void CVeiVideoDisplay::SetPlaybackVolumeL()
+ {
+ LOGFMT(KVideoEditorLogFile, "CVeiVideoDisplay::SetPlaybackVolumeL(): in: iInternalVolume: %d", iInternalVolume);
+
+ if ( iVideoPlayerUtility )
+ {
+ // Convert the internal volume to CVideoPlayerUtility's scale.
+ iMaxVolume = iVideoPlayerUtility->MaxVolume();
+
+ TInt vol = iMaxVolume * iInternalVolume / KMaxVolumeLevel;
+ iVideoPlayerUtility->SetVolumeL( vol );
+ }
+
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::SetPlaybackVolumeL(): out");
+ }
+
+EXPORT_C void CVeiVideoDisplay::ShowAnimationL( TInt aResourceId, TInt aFrameIntervalInMilliSeconds )
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::ShowAnimationL: in");
+
+ iAnimationResourceId = aResourceId;
+
+ if ( iAnimation )
+ {
+ delete iAnimation;
+ iAnimation = 0;
+ }
+ /* In slowmotion video thumbnail is shown */
+ if ( aResourceId != R_VEI_SLOW_MOTION_ANIMATION )
+ {
+ iBlack = ETrue;
+ DrawNow();
+ iBlack = EFalse;
+ }
+ else
+ {
+ DrawNow();
+ }
+
+ // Locate and open the resource file
+ TFileName fileName;
+ TParse p;
+
+ Dll::FileName(fileName);
+ p.Set(KResourceFile, &KDC_RESOURCE_FILES_DIR, &fileName);
+ fileName = p.FullName();
+
+ LOGFMT(KVideoEditorLogFile, "CVeiVideoDisplay::ShowAnimationL: Loading resource file: %S", &fileName);
+ RConeResourceLoader coneResLoader (*iCoeEnv);
+ coneResLoader.OpenL( fileName ); // RConeResourceLoader selects the correct language file
+ CleanupClosePushL( coneResLoader );
+
+ // Create animation from resource
+ iAnimation = CAknBitmapAnimation::NewL();
+
+ TResourceReader reader;
+ iCoeEnv->CreateResourceReaderLC( reader, aResourceId );
+ iAnimation->ConstructFromResourceL( reader );
+ TRect rect( Rect() );
+ rect.Move( iBorderWidth, iBorderWidth );
+ rect.Resize( -iBorderWidth*2, -iBorderWidth );
+ iAnimation->SetRect( rect );
+ iAnimation->SetContainerWindowL( *this );
+ iAnimationOn = ETrue;
+ iAnimation->StartAnimationL();
+ CleanupStack::PopAndDestroy(); //reader
+ CBitmapAnimClientData* animClientData = iAnimation->BitmapAnimData();
+ iAnimationFrameIntervalInMilliSeconds = animClientData->FrameIntervalInMilliSeconds();
+
+ CleanupStack::PopAndDestroy(); // coneResLoader
+
+ if ( aFrameIntervalInMilliSeconds > 0 )
+ {
+ SetFrameIntervalL( aFrameIntervalInMilliSeconds );
+ }
+ DrawDeferred();
+
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::ShowAnimationL: out");
+ }
+
+EXPORT_C void CVeiVideoDisplay::StopAnimation()
+ {
+ if ( iAnimationOn )
+ {
+ iAnimation->CancelAnimation();
+ }
+ iAnimationOn = EFalse;
+ DrawDeferred();
+ }
+
+EXPORT_C void CVeiVideoDisplay::SetFrameIntervalL(TInt aFrameIntervalInMilliSeconds)
+ {
+ iAnimationFrameIntervalInMilliSeconds+=aFrameIntervalInMilliSeconds;
+ iAnimation->SetFrameIntervalL( iAnimationFrameIntervalInMilliSeconds );
+ }
+
+void CVeiVideoDisplay::HandleResourceChange(TInt aType)
+ {
+ if( (aType == KEikMessageFadeAllWindows) && iAnimationOn )
+ {
+ iAnimation->CancelAnimation();
+ }
+ else if( (aType == KEikMessageUnfadeWindows) && iAnimationOn )
+ {
+ TRAPD(err, iAnimation->StartAnimationL() );
+ if( KErrNone != err )
+ {
+ LOGFMT(KVideoEditorLogFile, "CVeiVideoDisplay::HandleResourceChange: StartAnimationL failed: %d", err);
+ iObserver.NotifyVideoDisplayEvent( MVeiVideoDisplayObserver::EError );
+ }
+ }
+ }
+
+EXPORT_C TInt CVeiVideoDisplay::Volume() const
+ {
+ return iInternalVolume;
+ }
+
+EXPORT_C void CVeiVideoDisplay::SetMuteL( TBool aMuted )
+ {
+ iMuted = aMuted;
+ }
+
+//=======================================================================================================
+void CVeiVideoDisplay::HandleLosingForeground()
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::HandleLosingForeground(): In");
+
+ if( iAnimationOn )
+ {
+ LOGFMT(KVideoEditorLogFile, "CVeiVideoDisplay::HandleLosingForeground(): stopping animation. iAnimationFrameIntervalInMilliSeconds == %d", iAnimationFrameIntervalInMilliSeconds);
+
+ // Delete the animation when going to backgroung. This should not be necessary, there are some
+ // platforms where the bitmap animation works incorrectly when swithching back (see EFLI-6VL4JS)
+ iStoredAnimationFrameIntervalInMilliSeconds = iAnimationFrameIntervalInMilliSeconds;
+ delete iAnimation;
+ iAnimation = NULL;
+ }
+
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::HandleLosingForeground(): Out");
+ }
+
+//=======================================================================================================
+void CVeiVideoDisplay::HandleGainingForeground()
+ {
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::HandleGainingForeground(): In");
+
+ if( iAnimationOn )
+ {
+ TRAPD(err, ShowAnimationL( iAnimationResourceId, 0 ));
+ if( KErrNone == err )
+ {
+ // restore the animation speed
+ LOGFMT2(KVideoEditorLogFile, "CVeiVideoDisplay::HandleLosingForeground(): animation started. next restoring speed to %d (now it is %d)", iStoredAnimationFrameIntervalInMilliSeconds, iAnimationFrameIntervalInMilliSeconds);
+ iAnimationFrameIntervalInMilliSeconds = iStoredAnimationFrameIntervalInMilliSeconds;
+ // set the animation's frame interval via callback. if set directly after starting the
+ // animation, the rate change does not take effect on screen.
+ SetAnimationFrameIntervalCallbackL();
+ }
+ else
+ {
+ LOGFMT(KVideoEditorLogFile, "CVeiVideoDisplay::SizeChanged: HandleGainingForeground failed: %d", err);
+ iObserver.NotifyVideoDisplayEvent( MVeiVideoDisplayObserver::EError );
+ }
+ }
+
+ LOG(KVideoEditorLogFile, "CVeiVideoDisplay::HandleGainingForeground: Out");
+ }
+
+//=======================================================================================================
+void CVeiVideoDisplay::SetAnimationFrameIntervalCallbackL()
+ {
+ LOG( KVideoEditorLogFile, "CVeiVideoDisplay::DoSetAnimationFrameIntervalL: in");
+
+ if (! iCallBack)
+ {
+ TCallBack cb (CVeiVideoDisplay::SetAnimationFrameIntervalCallbackMethod, this);
+ iCallBack = new (ELeave) CAsyncCallBack(cb, CActive::EPriorityLow);
+ }
+ iCallBack->CallBack();
+
+ LOG( KVideoEditorLogFile, "CVeiVideoDisplay::DoSetAnimationFrameIntervalL: out");
+ }
+
+//=======================================================================================================
+TInt CVeiVideoDisplay::SetAnimationFrameIntervalCallbackMethod(TAny* aThis)
+ {
+ LOG( KVideoEditorLogFile, "CVeiVideoDisplay::SetAnimationFrameIntervalCallbackMethod");
+
+ CVeiVideoDisplay* me = static_cast<CVeiVideoDisplay*>(aThis);
+ TRAPD( err, me->SetFrameIntervalL( 0 ) );
+
+ return err;
+ }
+
+// End of File