videoeditorengine/vedengine/videoprocessor/src/statusmonitor.cpp
author Mikael Laine <mikael.laine@ixonos.com>
Fri, 29 Jan 2010 14:08:33 +0200
changeset 0 951a5db380a0
permissions -rw-r--r--
Committing the Video Editor package under the Eclipse Public License

/*
* 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:  
* Video player status monitor definitions, class CStatusMonitor.
*
*/


//  EXTERNAL RESOURCES  


//  Include Files

#include "movieprocessorimpl.h"
#include "statusmonitor.h"
#include "vedmovie.h"


// LOCAL CONSTANTS AND MACROS
// Debug print macro
#if defined _DEBUG 
#include <e32svr.h>
#define PRINT(x) RDebug::Print x;
#else
#define PRINT(x)
#endif


//  MEMBER FUNCTIONS


//=============================================================================



/*
-----------------------------------------------------------------------------

    CStatusMonitor

    CStatusMonitor()

    Standard C++ constructor

-----------------------------------------------------------------------------
*/

CStatusMonitor::CStatusMonitor(MVedMovieProcessingObserver *anObserver,                               
                               CMovieProcessorImpl *aMovieProcessor,
                               CVedMovie *aMovie, TInt aPriority)
    : CActive(aPriority)
{
    // Remember the objects
    iObserver = anObserver;
    iProcessor = aMovieProcessor;
    iMovie = aMovie;
    // Initialize status:

    iPrepared = EFalse;
    iPreparing = EFalse;

    iProcessingStarted = EFalse;
    iProcessing = EFalse;
    iClipProcessed = EFalse;
    iComplete = EFalse;
    iCancelled = EFalse;
    iError = KErrNone;
    iOutError = KErrNone;

}



/*
-----------------------------------------------------------------------------

    CStatusMonitor

    ~CStatusMonitor()

    Standard C++ destructor

-----------------------------------------------------------------------------
*/

CStatusMonitor::~CStatusMonitor()
{
    Cancel();
}



/*
-----------------------------------------------------------------------------

    CStatusMonitor

    ConstructL()

    Symbian OS second-phase constructor

-----------------------------------------------------------------------------
*/

void CStatusMonitor::ConstructL()
{
    // Add to active scheduler:
    CActiveScheduler::Add(this);
    
    // Make us active:
    if (!IsActive())
    {
        SetActive();
        iStatus = KRequestPending;
    }
}



/*
-----------------------------------------------------------------------------

    CStatusMonitor

    Error()

    An error has occurred

-----------------------------------------------------------------------------
*/

void CStatusMonitor::Error(TInt anErrorCode)
{
    // Remember the error
    iError = anErrorCode;

#ifndef _DEBUG
    if (iError < KErrHardwareNotAvailable)
        iError = KErrGeneral;
#endif

    PRINT((_L("CStatusMonitor::Error()  Error = %d  "), iError )); 

    // Activate the object:
    if ( iStatus == KRequestPending )
    {
        TRequestStatus *status = &iStatus;
        User::RequestComplete(status, KErrNone);
    }
}



/*
-----------------------------------------------------------------------------

    CStatusMonitor

    StartOpening()

    The stream opening has been started

-----------------------------------------------------------------------------
*/

void CStatusMonitor::StartPreparing()
{
    __ASSERT_DEBUG((!iPrepared) && (!iPreparing) && (!iProcessing),
                   User::Panic(_L("CVideoProcessor"), EInvalidStateTransition));
    
    // Note the state change:
    iPreparing = ETrue;
}



/*
-----------------------------------------------------------------------------

    CStatusMonitor

    Opened()

    The stream has been opened and it is ready for playback

-----------------------------------------------------------------------------
*/

void CStatusMonitor::PrepareComplete()
{
    __ASSERT_DEBUG((!iPrepared) && iPreparing && (!iProcessing),
                   User::Panic(_L("CVideoProcessor"), EInvalidStateTransition));
    
    // Note the state change
    iPrepared = ETrue;
    iPreparing = EFalse;
    
}

void CStatusMonitor::StreamEndReached()
{


}

void CStatusMonitor::Progress(TInt aPercentage)
{
    PRINT((_L("CStatusMonitor::Progress()  Progress = %d  "), aPercentage )); 

    iObserver->NotifyMovieProcessingProgressed(*iMovie, aPercentage);
}

/*
-----------------------------------------------------------------------------

    CStatusMonitor

    Closed()

    The stream has been closed

-----------------------------------------------------------------------------
*/

void CStatusMonitor::Closed()
{
    __ASSERT_DEBUG((iPrepared || iPreparing) && (!iProcessing),
                   User::Panic(_L("CVideoProcessor"), EInvalidStateTransition));

    // Note the state change:    
    iPreparing = EFalse;    

    // Do not report a stream open if one had been done
    iPrepared = EFalse;    
}



/*
-----------------------------------------------------------------------------

    CStatusMonitor

    ProcessingStarted()

    Processing has been started

-----------------------------------------------------------------------------
*/

void CStatusMonitor::ProcessingStarted(TBool aNotifyObserver)
{
    __ASSERT_DEBUG( (!iProcessing) && (!iProcessingStarted) && (iPrepared),
                   User::Panic(_L("CVideoProcessor"), EInvalidStateTransition));

    // Note the state change:    
    iProcessing = ETrue;

    if (aNotifyObserver)
    {
        iProcessingStarted = ETrue;
        
        // Activate the object:
        if ( iStatus == KRequestPending )
        {
            TRequestStatus *status = &iStatus;
            User::RequestComplete(status, KErrNone);
        }
    }   
}



/*
-----------------------------------------------------------------------------

    CStatusMonitor

   ProcessingStopped()

    Processing has been stopped

-----------------------------------------------------------------------------
*/

void CStatusMonitor::ProcessingStopped()
{
    __ASSERT_DEBUG(iProcessing,
                   User::Panic(_L("CVideoProcessor"), EInvalidStateTransition));

    // Note the state change:
    iProcessing = EFalse;
}



/*
-----------------------------------------------------------------------------

    CStatusMonitor

    ClipProcessed()

    The video clip end has been reached

-----------------------------------------------------------------------------
*/

void CStatusMonitor::ClipProcessed()
{
    __ASSERT_DEBUG( (iProcessing),
                   User::Panic(_L("CVideoProcessor"), EInvalidStateTransition));

    // Note the stream end:
    iClipProcessed = ETrue;

    // Activate the object:
    if ( iStatus == KRequestPending )
    {
        TRequestStatus *status = &iStatus;
        User::RequestComplete(status, KErrNone);
    }
}

void CStatusMonitor::ProcessingComplete()
{
    __ASSERT_DEBUG((!iProcessing),
                   User::Panic(_L("CVideoProcessor"), EInvalidStateTransition));

    // Note the stream end:
    iComplete = ETrue;

    // Activate the object:
    if ( iStatus == KRequestPending )
    {
        TRequestStatus *status = &iStatus;
        User::RequestComplete(status, KErrNone);
    }
}

void CStatusMonitor::ProcessingCancelled()
{
    __ASSERT_DEBUG((!iProcessing),
                   User::Panic(_L("CVideoProcessor"), EInvalidStateTransition));
    
    iCancelled = ETrue;

    // Activate the object:
    if ( iStatus == KRequestPending )
    {
        TRequestStatus *status = &iStatus;
        User::RequestComplete(status, KErrNone);
    }
}



/*
-----------------------------------------------------------------------------

    CStatusMonitor

    FatalError()

    A fatal non-recovereable error has occurred

-----------------------------------------------------------------------------
*/

void CStatusMonitor::FatalError(TInt anError)
{
    PRINT((_L("CStatusMonitor::FatalError  Error = %d  "), anError )); 

    // Pass the error to the observer
    iObserver->NotifyMovieProcessingCompleted(*iMovie, anError);

    // The observer returned -- panic the program
    User::Panic(_L("CVideoProcessor"), anError);    
    
}



/*
-----------------------------------------------------------------------------

    CStatusMonitor

    RunL()

    The active object running method, called by the active scheduler when the
    object has been activated.

-----------------------------------------------------------------------------
*/

void CStatusMonitor::RunL()
{
    TInt error;
    
    // Re-activate us:
    if (!IsActive())
    {
        SetActive();
        iStatus = KRequestPending;
    }
    
    // Check if an error occurred:
    if ( iError != KErrNone )
    {
        // Yes, stop processing if we are processing, close stream if it was open:
        if ( iProcessing )
        {
            if ( iProcessor )
            {                
				iProcessor->CancelProcessingL();
            }
            iProcessing = EFalse;
        }
        else
        {
            if ( iPrepared || iPreparing )
            {
                if ( iProcessor )
                {                    
                    iProcessor->CancelProcessingL();                    
                }
                iPreparing = EFalse;
                iPrepared = EFalse;                
            }
        }

        // Report the error to the observer:
        //iObserver->NotifyMovieProcessingCompleted(*iMovie, iError);        
        iOutError = iError;
        iError = KErrNone;

        
    }
    
    else
    {
        // Nope, no errors

        // If processing has been started, report that:
        if ( iProcessingStarted )
        {
            iProcessingStarted = EFalse;
            TRAP(error, iObserver->NotifyMovieProcessingStartedL(*iMovie));
            if ( error != KErrNone )
                FatalError(error);
        }
		else if ( iCancelled )
        {
            // processing has been cancelled
            iCancelled = EFalse;
            iComplete = EFalse;
			iClipProcessed = EFalse;

            if ( iOutError == KErrNone )
                iObserver->NotifyMovieProcessingCompleted(*iMovie, KErrCancel);
            else
                iObserver->NotifyMovieProcessingCompleted(*iMovie, iOutError);

            iOutError = KErrNone;

        }

        else if ( iClipProcessed )
        {
            // a clip has been processed
            iClipProcessed = EFalse;
            iProcessor->FinalizeVideoClip();
        }        
        
        else 
        {
            if ( iComplete ) 
            {
                // If the movie has been completed, report that:            
                iComplete = EFalse;
                iObserver->NotifyMovieProcessingCompleted(*iMovie, KErrNone);
                    
            }
        }
    }
}



/*
-----------------------------------------------------------------------------

    CStatusMonitor

    DoCancel()

    Cancels the internal request

-----------------------------------------------------------------------------
*/

void CStatusMonitor::DoCancel()
{
    // Cancel it:
    TRequestStatus *status = &iStatus;
    User::RequestComplete(status, KErrCancel);
}




//  OTHER EXPORTED FUNCTIONS


//=============================================================================


//  End of File