videoplayback/videohelix/src/mpxvideoseeker.cpp
changeset 0 96612d01cf9f
child 11 5294c000a26d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videoplayback/videohelix/src/mpxvideoseeker.cpp	Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,359 @@
+/*
+* 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: Seek or trickplay
+ *
+*/
+
+// Version : %version: 7 %
+
+
+// INCLUDE FILES
+#include <mpxplaybackpluginobserver.h>
+
+#include "mpxvideoseeker.h"
+#include "mpxvideoplaybackcontroller.h"
+#include "mpxvideo_debug.h"
+
+// CONSTANTS
+
+#if TRICK_PLAY
+const TInt KDefaultPlaySpeed(100);        // 1x
+const TInt KDefaultTrickPlaySpeed(400);   // 4x
+#else
+const TInt KTrickPlayTimeout(5000000);    // 5 sec
+const TInt KSpeedInterval(125000);        // 125 msec
+const TInt KDurationA(90000000);          // 90 sec
+const TInt KDurationB(180000000);         // 180 sec
+const TInt64 KSpeedAIncrements(2000000);  // 2 sec
+const TInt64 KSpeedBIncrements(4000000);  // 4 sec
+#endif
+
+// ============================ MEMBER FUNCTIONS ===================================================
+
+// -------------------------------------------------------------------------------------------------
+// CMPXVideoSeeker::CMPXVideoSeeker
+// C++ default constructor can NOT contain any code, that might leave.
+// -------------------------------------------------------------------------------------------------
+//
+CMPXVideoSeeker::CMPXVideoSeeker( CMPXVideoPlaybackController* aVideoPlaybackCtlr )
+    : iVideoPlaybackCtlr( aVideoPlaybackCtlr )
+{
+    MPX_DEBUG(_L("CMPXVideoSeeker::CMPXVideoSeeker()"));
+}
+
+// -------------------------------------------------------------------------------------------------
+// CMPXVideoSeeker::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -------------------------------------------------------------------------------------------------
+//
+void CMPXVideoSeeker::ConstructL()
+{
+    MPX_DEBUG(_L("CMPXVideoSeeker::ConstructL()"));
+
+    iTrickPlayTimer = CPeriodic::NewL( CActive::EPriorityStandard );
+    iSeekTimer = CPeriodic::NewL( CActive::EPriorityStandard );
+}
+
+// -------------------------------------------------------------------------------------------------
+// CMPXVideoSeeker::NewL
+// Two-phased constructor.
+// -------------------------------------------------------------------------------------------------
+//
+CMPXVideoSeeker* CMPXVideoSeeker::NewL( CMPXVideoPlaybackController* aVideoPlaybackCtlr )
+{
+    MPX_DEBUG(_L("CMPXVideoSeeker::NewL()"));
+
+    CMPXVideoSeeker* self = new( ELeave ) CMPXVideoSeeker( aVideoPlaybackCtlr );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+}
+
+// -------------------------------------------------------------------------------------------------
+// CMPXVideoSeeker::~CMPXVideoSeeker
+// Destructor
+// -------------------------------------------------------------------------------------------------
+//
+CMPXVideoSeeker::~CMPXVideoSeeker()
+{
+    MPX_DEBUG(_L("CMPXVideoSeeker::~CMPXVideoSeeker()"));
+
+    if ( iTrickPlayTimer )
+    {
+        iTrickPlayTimer->Cancel();
+        delete iTrickPlayTimer;
+    }
+
+    if ( iSeekTimer )
+    {
+        iSeekTimer->Cancel();
+        delete iSeekTimer;
+    }
+}
+
+// -------------------------------------------------------------------------------------------------
+// CMPXVideoSeeker::StartSeeking
+// -------------------------------------------------------------------------------------------------
+//
+void CMPXVideoSeeker::StartSeekingL( TBool aForward,
+                                     TMPXVideoPlaybackState aState,
+                                     TInt64 aPosition,
+                                     TInt64 aDuration )
+{
+    MPX_DEBUG(_L("CMPXVideoSeeker::StartSeekingL() forward = (%d)"), aForward );
+
+    TInt err = KErrNone;
+    iPreviousState = aState;
+    iForward = aForward;
+    iPosition = aPosition;
+    iDuration = aDuration;
+
+#if TRICK_PLAY
+    if ( iPreviousState == EMPXVideoPaused )
+    {
+        iVideoPlaybackCtlr->iPlayer->Play();
+    }
+
+    TInt trickplaySpeed = KDefaultTrickPlaySpeed;
+
+    if ( !iForward )
+    {
+        trickplaySpeed *= -1;
+    }
+
+    //
+    // Start trick play with 4x speed as default
+    //
+    MPX_TRAP( iVideoPlaybackCtlr->iPlayer->SetPlayVelocityL( trickplaySpeed ) );
+
+#else
+    if ( iPreviousState == EMPXVideoPlaying )
+    {
+        iVideoPlaybackCtlr->iPlayer->PauseL();
+    }
+
+    iIncrements = KSpeedAIncrements / 2;
+    TInt interval = KSpeedInterval * 2;
+
+    if ( !iForward )
+    {
+        iIncrements *= -1;
+    }
+
+    iSeekTimer->Start( 0,
+                       interval,
+                       TCallBack( CMPXVideoSeeker::UpdatePosition, this ) );
+#endif
+
+    if ( err == KErrNone )
+    {
+        iTrickPlayTimer->Start( KTrickPlayTimeout,
+                                0,
+                                TCallBack( CMPXVideoSeeker::StopTrickPlay, this ) );
+    }
+}
+
+// -------------------------------------------------------------------------------------------------
+// CMPXVideoSeeker::StopSeekingL
+// -------------------------------------------------------------------------------------------------
+//
+void CMPXVideoSeeker::StopSeekingL()
+{
+    MPX_DEBUG(_L("CMPXVideoSeeker::StopSeekingL()"));
+
+    TBool seekTimerActive = EFalse;
+
+    if ( iTrickPlayTimer->IsActive() )
+    {
+        iTrickPlayTimer->Cancel();
+    }
+
+    if ( iSeekTimer->IsActive() )
+    {
+        seekTimerActive = ETrue;
+        iSeekTimer->Cancel();
+    }
+
+    //
+    // If it reaches the end of a clip, issue stop
+    //
+    if ( iDuration <= iPosition )
+    {
+        iVideoPlaybackCtlr->iState->HandleEndOfClip();
+    }
+    else
+    {
+        if ( seekTimerActive )
+        {
+            iVideoPlaybackCtlr->iPlayer->SetPositionL( iPosition );
+
+            if ( iPreviousState == EMPXVideoPlaying )
+            {
+                iVideoPlaybackCtlr->DoHandleCommandL( EPbCmdPlay );
+            }
+            else if (iPreviousState == EMPXVideoPaused )
+            {
+                iVideoPlaybackCtlr->DoHandleCommandL( EPbCmdPause );
+            }
+            else
+            {
+                iVideoPlaybackCtlr->ChangeState( iPreviousState );
+            }
+        }
+
+#if TRICK_PLAY
+        else
+        {
+            //
+            // Start trick play with default speed
+            //
+            MPX_TRAP( iVideoPlaybackCtlr->iPlayer->SetPlayVelocityL( KDefaultPlaySpeed ) );
+
+            if ( iPreviousState == EMPXVideoPaused )
+            {
+                iVideoPlaybackCtlr->DoHandleCommandL( EPbCmdPause );
+            }
+            else if ( iPreviousState == EMPXVideoPlaying )
+            {
+                iVideoPlaybackCtlr->DoHandleCommandL( EPbCmdPlay );
+            }
+        }
+#endif
+    }
+
+}
+
+// -------------------------------------------------------------------------------------------------
+// CMPXVideoSeeker::StopTrickPlay
+// -------------------------------------------------------------------------------------------------
+//
+TInt CMPXVideoSeeker::StopTrickPlay( TAny* aPtr )
+{
+    MPX_DEBUG(_L("CMPXVideoSeeker::StopTrickPlay()"));
+
+	static_cast<CMPXVideoSeeker*>(aPtr)->DoStopTrickPlay();
+
+	return KErrNone;
+}
+
+// -------------------------------------------------------------------------------------------------
+// CMPXVideoSeeker::DoStopTrickPlay
+// -------------------------------------------------------------------------------------------------
+//
+void CMPXVideoSeeker::DoStopTrickPlay()
+{
+    MPX_DEBUG(_L("CMPXVideoSeeker::DoStopTrickPlay()"));
+
+    TInt err = KErrNone;
+
+    //
+    // Stop trick play
+    //
+    if ( iTrickPlayTimer->IsActive() )
+    {
+        iTrickPlayTimer->Cancel();
+    }
+
+#if TRICK_PLAY
+    MPX_TRAP( err,
+              iVideoPlaybackCtlr->iPlayer->SetPlayVelocityL( KDefaultPlaySpeed );
+              iVideoPlaybackCtlr->iPlayer->PauseL() );
+#endif
+
+    if ( err == KErrNone )
+    {
+        ConvertToSeeking();
+    }
+}
+
+// -------------------------------------------------------------------------------------------------
+// CMPXVideoSeeker::ConvertToSeeking
+// -------------------------------------------------------------------------------------------------
+//
+void CMPXVideoSeeker::ConvertToSeeking()
+{
+    MPX_DEBUG(_L("CMPXVideoSeeker::ConvertToSeeking()"));
+
+    //
+    // Start seeking (increments in every 125 msec)
+    // - ~ 90sec      : Increment is 2 sec
+    // - 91sec~180sec : Increment is 4 sec
+    // - 181sec~      : Increment depends on the duration
+    //                  ( 0.5 % * duration ) + 3 sec
+    //
+    if ( iDuration < KDurationA )
+    {
+        iIncrements = KSpeedAIncrements;
+    }
+    else
+    {
+        if ( iDuration < KDurationB )
+        {
+            iIncrements = KSpeedBIncrements;
+        }
+        else
+        {
+            iIncrements = (TInt)( iDuration / 200 ) + 3;
+        }
+    }
+
+    if ( !iForward )
+    {
+        iIncrements *= -1;
+    }
+
+    if ( iSeekTimer->IsActive() )
+    {
+        iSeekTimer->Cancel();
+    }
+
+    iSeekTimer->Start( 0, KSpeedInterval, TCallBack( CMPXVideoSeeker::UpdatePosition, this ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+// CMPXVideoSeeker::UpdatePosition
+// -------------------------------------------------------------------------------------------------
+//
+TInt CMPXVideoSeeker::UpdatePosition( TAny* aPtr )
+{
+    MPX_DEBUG(_L("CMPXVideoSeeker::UpdatePosition()"));
+
+    static_cast<CMPXVideoSeeker*>(aPtr)->DoUpdatePosition();
+    return KErrNone;
+}
+
+// -------------------------------------------------------------------------------------------------
+// CMPXVideoSeeker::DoUpdatePosition
+// -------------------------------------------------------------------------------------------------
+//
+void CMPXVideoSeeker::DoUpdatePosition()
+{
+    MPX_DEBUG(_L("CMPXVideoSeeker::DoUpdatePosition()"));
+
+    iPosition += iIncrements;
+
+    if ( iPosition > iDuration )
+    {
+        iPosition = iDuration;
+    }
+    else if ( iPosition < 0 )
+    {
+        iPosition = 0;
+    }
+
+    iVideoPlaybackCtlr->iPlaybackMode->UpdateSeekPosition( iPosition );
+}
+
+//  End of File