tsrc/consoleplayer/player/src/mmf/mmfplayerwindow.cpp
changeset 35 b0f0be18af85
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tsrc/consoleplayer/player/src/mmf/mmfplayerwindow.cpp	Fri Sep 17 08:31:33 2010 +0300
@@ -0,0 +1,507 @@
+/*
+ * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies 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 the MMF Player Window.
+ * 
+ */
+
+#include "mmfplayerwindow.h"
+
+bool IgnoreError( TInt aError )
+    {
+    bool ignore = false;
+    // Some errors should be ignored.
+    
+    if( aError == -12017 )  
+        {
+        // partial playback - do not treat as an error
+        ignore = true;
+        RDebug::Printf( "CONSOLEPLAYER partial playback" );            
+        }
+    
+    return ignore;
+    }
+
+CMmfPlayerWindow* CMmfPlayerWindow::NewL( RFs& aFs, 
+                                          RWsSession& aWs,
+                                          CWsScreenDevice& aScreenDevice,
+                                          const RWindowTreeNode &aParentWindow,
+                                          TPoint aTopRight,
+                                          TSize aSize,
+                                          bool aTransparent,
+                                          TRgb aBackgroundColor,
+                                          bool aSuppressGraphicsContext,
+                                          TUint32 aControllerUid )
+    {
+    CMmfPlayerWindow* self = new(ELeave) CMmfPlayerWindow( aFs, aWs, aScreenDevice, aSuppressGraphicsContext, aControllerUid );
+    CleanupStack::PushL( self );
+    self->ConstructL( aParentWindow, aTopRight, aSize, aTransparent, aBackgroundColor );
+    CleanupStack::Pop();
+    return self;   
+    }
+    
+CMmfPlayerWindow::CMmfPlayerWindow( RFs& aFs, RWsSession& aWs, CWsScreenDevice& aScreenDevice, bool aSuppressGraphicsContext, TUint32 aControllerUid ) :
+    CPlayerWindow( aFs, aWs, aScreenDevice, aSuppressGraphicsContext ),
+    iControllerUid( aControllerUid )
+    {    
+    }
+
+CMmfPlayerWindow::~CMmfPlayerWindow()
+    {    
+    delete iVideoPlayer;
+    }
+
+void CMmfPlayerWindow::ConstructL( const RWindowTreeNode &aParentWindow, TPoint aTopRight, TSize aSize, bool aTransparent, TRgb aBackgroundColor )
+    {
+    BaseConstructL( aParentWindow, aTopRight, aSize, aTransparent, aBackgroundColor );
+
+#ifdef __USE_VIDEOPLAYER_1__
+    iVideoPlayer = CVideoPlayerUtility::NewL(*this,
+                                             EMdaPriorityNormal,
+                                             EMdaPriorityPreferenceTimeAndQuality,
+                                             iWs,
+                                             iScreenDevice,
+                                             iWindow,
+                                             TRect(iScreenDevice.SizeInPixels()),
+                                             TRect(iScreenDevice.SizeInPixels()));
+#else
+    iVideoPlayer = CVideoPlayerUtility2::NewL(*this,EMdaPriorityNormal,EMdaPriorityPreferenceTimeAndQuality);
+#endif
+    }
+
+
+void CMmfPlayerWindow::InitializeParameters( TSize& aVideoSize, 
+                                             TTimeIntervalMicroSeconds& aDuration, 
+                                             TInt& aMaxVolume, 
+                                             TInt& aCurrentVolume,
+                                             TInt& aBalanceCenter,
+                                             TInt& aBalanceMaxLeft,
+                                             TInt& aBalanceMaxRight,
+                                             TInt& aDefaultBalance, 
+                                             TInt& aCurrentBalance )
+    {
+    TRAPD( err, iVideoPlayer->VideoFrameSizeL(aVideoSize) );
+    CheckError( err, "VideoFrameSizeL" );
+    TRAP( err, aDuration = iVideoPlayer->DurationL() );
+    CheckError( err, "DurationL" );
+    aMaxVolume = iVideoPlayer->MaxVolume();
+    aCurrentVolume = iVideoPlayer->Volume();
+    aBalanceCenter = KMMFBalanceCenter;
+    aBalanceMaxLeft = KMMFBalanceMaxLeft;
+    aBalanceMaxRight = KMMFBalanceMaxRight;
+    aDefaultBalance = iVideoPlayer->Balance();
+    aCurrentBalance = aDefaultBalance;
+    }
+
+void CMmfPlayerWindow::SetDefaultAutoscaleMode( TAutoscaleMode aDefaultAutoscale )
+    {
+    switch( aDefaultAutoscale )
+        {
+        case EDoNotAutoscale:
+            iAutoScale = EAutoScaleNone;
+            break;
+        case EBestFit:
+            iAutoScale = EAutoScaleBestFit;
+            break;
+        case EStretch:
+            iAutoScale = EAutoScaleStretch;
+            break;
+        }
+    iDefaultAutoScale = iAutoScale;
+#ifdef __USE_VIDEOPLAYER_1__
+    TRAPD(err, iVideoPlayer->SetAutoScaleL(iAutoScale));
+#else
+    TRAPD(err, iVideoPlayer->SetAutoScaleL(iWindow, iAutoScale));
+#endif
+    if( err == KErrNotReady )
+        {
+        // Too soon to call this.  Will get called later, at the appropriate time.
+        }
+    else
+        {
+        CheckError( err, "SetDefaultAutoscaleMode" );
+        }
+    }    
+
+void CMmfPlayerWindow::PreparePlayerWithFile( RFile& aFile )
+    {
+    const TUid KUidController = { iControllerUid };
+    TRAPD( err, iVideoPlayer->OpenFileL(aFile, KUidController) );
+    CheckError( err, "OpenFileL" );
+    
+    // Now wait for MvpuoOpenComplete callback.            
+    }
+
+void CMmfPlayerWindow::PreparePlayerWithUrl( const TDesC& aUrl )
+    {
+    TRAPD( err, iVideoPlayer->OpenUrlL(aUrl) );
+    CheckError( err, "OpenUrlL" );
+
+    // Now wait for MvpuoOpenComplete callback.                
+    }
+
+TInt CMmfPlayerWindow::DoExecuteOperation( TInt /*aOperation*/ )
+    {
+    // Currently there are no MMF-specific commands.
+    return KErrNotSupported;
+    }
+
+TTimeIntervalMicroSeconds CMmfPlayerWindow::Position()
+    {
+    TTimeIntervalMicroSeconds position = 0;
+    TRAPD( err, position = iVideoPlayer->PositionL() );
+    CheckError( err, "PositionL" );
+    return position;
+    }
+
+TInt CMmfPlayerWindow::SetVolume( TInt aVolume )
+    {
+    TRAPD( err, iVideoPlayer->SetVolumeL( aVolume ) );
+    if( err != KErrNone )
+        {
+        RDebug::Printf( "CONSOLEPLAYER SetVolumeL %i err=%i", aVolume, err );
+        }
+    return err;
+    }
+
+TInt CMmfPlayerWindow::SetBalance( TInt aBalance )
+    {
+    TRAPD( err, iVideoPlayer->SetBalanceL( aBalance ) );
+    if( err != KErrNone )
+        {
+        RDebug::Printf( "CONSOLEPLAYER SetBalanceL %i err=%i", aBalance, err );
+        }
+    return err;    
+    }
+
+TInt CMmfPlayerWindow::RotationAngle()
+    {
+    switch( iRotation )
+        {
+        case EVideoRotationClockwise90:
+            return 90;
+        case EVideoRotationClockwise180:
+            return 180;
+        case EVideoRotationClockwise270:
+            return 270;
+        default:
+            return 0;
+        }        
+    }
+
+TInt CMmfPlayerWindow::NextRotationAngle()
+    {
+    switch( iRotation )
+        {
+        case EVideoRotationNone:
+            iRotation = EVideoRotationClockwise90;
+            break;
+        case EVideoRotationClockwise90:
+            iRotation = EVideoRotationClockwise180;
+            break;
+        case EVideoRotationClockwise180:
+            iRotation = EVideoRotationClockwise270;
+            break;
+        case EVideoRotationClockwise270:
+            iRotation = EVideoRotationNone;
+            break;
+        }
+#ifdef __USE_VIDEOPLAYER_1__
+    TRAPD( err, iVideoPlayer->SetRotationL(iRotation) );
+#else
+    TRAPD( err, iVideoPlayer->SetRotationL(iWindow, iRotation) );
+#endif
+    if( err != KErrNone )
+        {
+        RDebug::Printf( "CONSOLEPLAYER SetRotationL(%i) err=%i", iRotation, err );
+        }    
+    return err;
+    }
+
+TInt CMmfPlayerWindow::ResetRotation()
+    {
+    iRotation = EVideoRotationNone;
+#ifdef __USE_VIDEOPLAYER_1__
+    TRAPD( err, iVideoPlayer->SetRotationL(iRotation) );
+#else
+    TRAPD( err, iVideoPlayer->SetRotationL(iWindow, iRotation) );
+#endif
+    if( err != KErrNone )
+        {
+        RDebug::Printf( "CONSOLEPLAYER SetRotationL(reset) err=%i", err );
+        }        
+    return err;
+    }
+
+TInt CMmfPlayerWindow::NextAutoscaleMode()
+    {
+    switch( iAutoScale )
+        {
+        case EAutoScaleNone:
+            iAutoScale = EAutoScaleBestFit;
+            break;
+        case EAutoScaleBestFit:
+            iAutoScale = EAutoScaleClip;
+            break;
+        case EAutoScaleClip:
+            iAutoScale = EAutoScaleStretch;
+            break;
+        case EAutoScaleStretch:
+            iAutoScale = EAutoScaleNone;
+            break;
+        }     
+#ifdef __USE_VIDEOPLAYER_1__
+    TRAPD( err, iVideoPlayer->SetAutoScaleL(iAutoScale) );
+#else
+    TRAPD( err, iVideoPlayer->SetAutoScaleL(iWindow, iAutoScale) );
+#endif
+    if( err != KErrNone )
+        {
+        RDebug::Printf( "CONSOLEPLAYER SetAutoScaleL(%i) err=%i", iAutoScale, err );
+        }    
+    return err;
+    }
+
+TInt CMmfPlayerWindow::ResetAutoscale()
+    {
+    iAutoScale = iDefaultAutoScale;
+#ifdef __USE_VIDEOPLAYER_1__
+    TRAPD( err, iVideoPlayer->SetAutoScaleL(iAutoScale) );
+#else
+    TRAPD( err, iVideoPlayer->SetAutoScaleL(iWindow, iAutoScale) );
+#endif
+    if( err != KErrNone )
+        {
+        RDebug::Printf( "CONSOLEPLAYER SetAutoScaleL(%i) err=%i", iAutoScale, err );
+        }    
+    return err;
+    }
+
+void CMmfPlayerWindow::AppendAutoscaleModeText( TDes& aString )
+    {
+    switch( iAutoScale )
+        {
+        case EAutoScaleNone:
+            aString.Append(_L("None"));
+            break;
+        case EAutoScaleBestFit:
+            aString.Append(_L("Best Fit"));
+            break;
+        case EAutoScaleClip:
+            aString.Append(_L("Clip"));
+            break;
+        case EAutoScaleStretch:
+            aString.Append(_L("Stretch"));
+            break;
+        } 
+    }
+
+TInt CMmfPlayerWindow::SetClipRectangle( TRect aRect )
+    {
+#ifdef __USE_VIDEOPLAYER_1__   
+    TRAPD( err, iVideoPlayer->SetCropRegionL(aRect) );
+    if( err != KErrNone )
+        {
+        RDebug::Printf( "CONSOLEPLAYER SetCropRegionL err=%i", err );
+        }    
+#else
+    TRAPD( err, iVideoPlayer->SetWindowClipRectL(iWindow, aRect) );
+    if( err != KErrNone )
+        {
+        RDebug::Printf( "CONSOLEPLAYER SetCropRegionL err=%i", err );
+        }    
+#endif
+    return err;
+    }
+
+TInt CMmfPlayerWindow::SetVideoExtent( TRect aExtent )
+    {
+#ifdef __USE_VIDEOPLAYER_1__
+    // TODO: HOW DO YOU DO THIS WITH OLD VIDEO PLAYER?
+    TInt err = KErrNotSupported;
+    RDebug::Printf( "CONSOLEPLAYER SetVideoExtent not supported with video player 1" );
+#else
+    TRAPD( err, iVideoPlayer->SetVideoExtentL(iWindow, aExtent) );
+    if( err != KErrNone )
+        {
+        RDebug::Printf( "CONSOLEPLAYER SetVideoExtentL err=%i", err );
+        }    
+#endif
+    return err;
+    }
+
+TInt CMmfPlayerWindow::SetScaleFactor( TReal aWidthScaleFactor, TReal aHeightScaleFactor )
+    {
+#ifdef __USE_VIDEOPLAYER_1__
+    // TODO: WHAT VALUE SHOULD BE USED FOR aAntiAliasFiltering?    
+    TRAPD( err, iVideoPlayer->SetScaleFactorL(aWidthScaleFactor, aHeightScaleFactor, ETrue) );
+#else
+    TRAPD( err, iVideoPlayer->SetScaleFactorL(iWindow, aWidthScaleFactor, aHeightScaleFactor) );
+#endif
+    if( err != KErrNone )
+        {
+        RDebug::Printf( "CONSOLEPLAYER SetScaleFactorL err=%i", err );
+        }    
+    return err;
+    }
+
+TInt CMmfPlayerWindow::Play()
+    {
+    iVideoPlayer->Play();
+    return KErrNone;
+    }
+
+TInt CMmfPlayerWindow::Pause()
+    {
+    TRAPD(err, iVideoPlayer->PauseL());
+    if( err != KErrNone )
+        {
+        RDebug::Printf( "CONSOLEPLAYER PauseL err=%i", err );
+        }        
+    return err;
+    }
+
+TInt CMmfPlayerWindow::Stop()
+    {
+    TInt err = iVideoPlayer->Stop();
+    if( err != KErrNone )
+        {
+        RDebug::Printf( "CONSOLEPLAYER Stop err=%i", err );
+        }        
+    return err;
+    }
+
+TInt CMmfPlayerWindow::SetPosition( TTimeIntervalMicroSeconds aPositionInMs )
+    {
+    TRAPD( err, iVideoPlayer->SetPositionL( aPositionInMs ) );
+    if( err != KErrNone )
+        {
+        RDebug::Printf( "CONSOLEPLAYER SetPositionL err=%i", err );
+        }        
+    return err;
+    }
+
+TInt CMmfPlayerWindow::StepForward()
+    {
+    TRAPD( err, iVideoPlayer->StepFrameL(1) );
+    if( err != KErrNone )
+        {
+        RDebug::Printf( "CONSOLEPLAYER StepFrameL(1) err=%i", err );
+        }            
+    return err;    
+    }
+
+TInt CMmfPlayerWindow::StepBackward()
+    {
+    TRAPD( err, iVideoPlayer->StepFrameL(-1) );
+    if( err != KErrNone )
+        {
+        RDebug::Printf( "CONSOLEPLAYER StepFrameL(-1) err=%i", err );
+        }            
+    return err;   
+    }
+
+TInt CMmfPlayerWindow::SetPlayVelocity( TInt aVelocity )
+    {
+    TRAPD( err,iVideoPlayer->SetPlayVelocityL(aVelocity) );
+    if( err != KErrNone )
+        {
+        RDebug::Printf( "CONSOLEPLAYER SetPlayVelocityL %i err=%i", aVelocity, err );
+        }            
+    return err;
+    }
+    
+// inherited from MVideoPlayerUtilityObserver
+
+void CMmfPlayerWindow::MvpuoOpenComplete(TInt aError)
+    {
+    RDebug::Printf( "CONSOLEPLAYER MvpuoOpenComplete(%i)", aError );
+    
+    if( aError == KErrNone )
+        {
+        iVideoPlayer->Prepare();
+    
+        // Now wait for MvpuoPrepareComplete callback.
+        }
+    else if( !IgnoreError( aError ) )
+        {
+        CheckError( aError, "MvpuOpenComplete" );
+        }
+    }
+
+void CMmfPlayerWindow::MvpuoPrepareComplete(TInt aError)
+    {
+    RDebug::Printf( "CONSOLEPLAYER MvpuoPrepareComplete(%i)", aError );
+    
+    if( aError == KErrNone )
+        {
+#ifdef __USE_VIDEOPLAYER_1__   
+        TRAPD( err, iVideoPlayer->SetDisplayWindowL( iWs, 
+                                                     iScreenDevice, 
+                                                     iWindow, 
+                                                     TRect(iWindow.Position(), iWindow.Size()),
+                                                     TRect(iWindow.Position(), iWindow.Size())) );
+#else
+        TRAPD( err, iVideoPlayer->AddDisplayWindowL( iWs, iScreenDevice, iWindow ) );
+#endif
+        if( err == KErrNone )
+            {
+            Play();
+            ResetAutoscale();
+            }
+        else
+            {
+            RDebug::Printf("CONSOLEPLAYER AddDisplayWindowL failed, err=%i", err );
+            }
+        PlayInitiated();
+        }
+    else if( !IgnoreError( aError ) )
+        {
+        Error( aError );
+        }
+    }
+
+void CMmfPlayerWindow::MvpuoFrameReady(CFbsBitmap& /*aFrame*/,TInt aError)
+    {
+    RDebug::Printf( "CONSOLEPLAYER MvpuoFrameReady(%i)", aError );
+    
+    if( (aError != KErrNone) && !IgnoreError( aError ) )
+        {
+        Error( aError );
+        }
+    }
+
+void CMmfPlayerWindow::MvpuoPlayComplete(TInt aError)
+    {
+    RDebug::Printf( "CONSOLEPLAYER MvpuoPlayComplete(%i)", aError );
+    
+    if( aError == KErrNone )
+        {
+        PlayComplete();
+        }
+    else if( !IgnoreError( aError ) )
+        {
+        Error( aError );
+        }
+    }
+
+void CMmfPlayerWindow::MvpuoEvent(const TMMFEvent& aEvent)
+    {   
+    RDebug::Printf( "CONSOLEPLAYER MvpuoEvent event=%x error=%i", aEvent.iEventType.iUid, aEvent.iErrorCode );    
+
+    if( aEvent.iErrorCode != KErrNone && !IgnoreError( aEvent.iErrorCode ) )
+        {
+        Error( aEvent.iErrorCode );
+        }
+    }