/*
* Copyright (c) 2006 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:    
*
*/



        
// INCLUDE FILES
#include <e32def.h>
#include <CCMRMediaRecorder.h>

#include "mccvideosourcewrapper.h"
#include "mccvideosourcesinklogs.h"

#define VIDEO_SOURCE_ASSERT_READINESS \
__ASSERT_ALWAYS( iMediaRecorder && !iFatalErrorOccured, User::Leave( KErrNotReady ) );

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::NewL
// -----------------------------------------------------------------------------
//
CMccVideoSourceWrapper* CMccVideoSourceWrapper::NewL(
    MCMRMediaSink& aObserver, 
    MCMRMediaRecorderObserver& aObserver2 )
    {
    CMccVideoSourceWrapper* self = new ( ELeave ) CMccVideoSourceWrapper(
        aObserver, aObserver2 );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
    }

// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::ConstructL
// -----------------------------------------------------------------------------
//
void CMccVideoSourceWrapper::ConstructL()
    {
    }
    
// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::CMccVideoSourceWrapper
// -----------------------------------------------------------------------------
//
CMccVideoSourceWrapper::CMccVideoSourceWrapper(
    MCMRMediaSink& aObserver, 
    MCMRMediaRecorderObserver& aObserver2 )
    : iObserver( aObserver ), iObserver2( aObserver2 )
    {
    }
        
// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::~CMccVideoSourceWrapper 
// -----------------------------------------------------------------------------
//
CMccVideoSourceWrapper::~CMccVideoSourceWrapper()
    {
    if ( iMediaRecorder && 
         !iFatalErrorOccured &&
         iMediaRecorder->State() == CCMRMediaRecorder::EStateRecording )
        {
        TRAP_IGNORE( StopL() )
        }
	delete iMediaRecorder;
    }

// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::OpenL
// -----------------------------------------------------------------------------
//
void CMccVideoSourceWrapper::OpenL(
    MDataSource* aAudioSource, 
    TInt aCameraHandle,
    const TDesC8& aVideoMimeType,
    TFourCC aAudioType,
    TUid aEncoderUid )
	{
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::OpenL" )	
    
    __ASSERT_ALWAYS( !iMediaRecorder, User::Leave( KErrAlreadyExists ) );
    iMediaRecorder = CCMRMediaRecorder::NewL();	
    
    iFatalErrorOccured = EFalse;

	iMediaRecorder->OpenL( this, aAudioSource, this, aCameraHandle, 
		aVideoMimeType, aAudioType ) ;
	iMediaRecorder->SetAudioEnabledL( EFalse );
	
	if ( iMediaRecorder->State() == CCMRMediaRecorder::EStateOpen )
		{
		if ( aEncoderUid != KNullUid )
		    {
    		__V_SOURCESINK_CONTROLL_INT1( "SetPreferredVideoEncoderL, uid:", 
    		                              aEncoderUid.iUid )
            iMediaRecorder->SetPreferredVideoEncoderL( aEncoderUid );
            __V_SOURCESINK_CONTROLL( "SetPreferredVideoEncapsulationL" )
            iMediaRecorder->SetPreferredVideoEncapsulationL( EDuElementaryStream );
		    }
        
        __V_SOURCESINK_CONTROLL( "SetVideoCodingOptionsL" )        
		//set mediarecorder to insert GOB:s
		TCCMRVideoCodingOptions CodingOptions; 
	    CodingOptions.iSyncIntervalInPicture = 1;  
		CodingOptions.iMinRandomAccessPeriodInSeconds = KIPULRandomAccessPeriod;
		iMediaRecorder->SetVideoCodingOptionsL( CodingOptions );
		
		__V_SOURCESINK_CONTROLL( "PrepareL" )   
		iMediaRecorder->PrepareL();		
    	__V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper, \
preparing recorder success" )
		}
	else
		{
    	__V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper, \
opening recorder success, waiting" )
		}	
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::OpenL, exit" )		
	}

// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::PlayL()
// -----------------------------------------------------------------------------
//
void CMccVideoSourceWrapper::PlayL()
    {
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::SourcePlayL" )
    
    VIDEO_SOURCE_ASSERT_READINESS
	iMediaRecorder->RecordL();
	
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::SourcePlayL, exit" )
    }

// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::ResumeL()
// -----------------------------------------------------------------------------
//
void CMccVideoSourceWrapper::ResumeL()
    {
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::ResumeL" )
    
    VIDEO_SOURCE_ASSERT_READINESS
	iMediaRecorder->ResumeL();
	
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::ResumeL, exit" )
    }
    
// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::PauseL()
// -----------------------------------------------------------------------------
//
void CMccVideoSourceWrapper::PauseL()
    {
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::SourcePauseL")
    
    VIDEO_SOURCE_ASSERT_READINESS
	iMediaRecorder->PauseL();
	
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::SourcePauseL, exit")
	}

// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::StopL()
// -----------------------------------------------------------------------------
//
void CMccVideoSourceWrapper::StopL()
    {
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::SourceStopL" )
    
    if ( iMediaRecorder && !iFatalErrorOccured )
        {
	    iMediaRecorder->StopL();
        }
	
	// Delete the recorder in order to free camera resources
	delete iMediaRecorder;
	iMediaRecorder = 0;
	
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::SourceStopL, exit" )
    }

// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::GetVideoBitrate()
// -----------------------------------------------------------------------------
//
TUint CMccVideoSourceWrapper::GetVideoBitrateL()
    {
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::SetVideoBitrateL" )
    
    VIDEO_SOURCE_ASSERT_READINESS
	return iMediaRecorder->VideoBitRateL();
    }

// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::SetVideoBitrateL()
// -----------------------------------------------------------------------------
//
void CMccVideoSourceWrapper::SetVideoBitrateL( TUint aVideoBitRate )
    {
    __V_SOURCESINK_CONTROLL_INT1( "CMccVideoSourceWrapper::SetVideoBitrateL", aVideoBitRate )
    
    VIDEO_SOURCE_ASSERT_READINESS
	iMediaRecorder->SetVideoBitRateL( aVideoBitRate );
	
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::SetVideoBitrateL, exit" )
    }

// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::SetVideoFrameRateL()
// -----------------------------------------------------------------------------
//
void CMccVideoSourceWrapper::SetVideoFrameRateL( TReal32 aFramesPerSecond )
    {
    __V_SOURCESINK_CONTROLL_REAL( "CMccVideoSourceWrapper::SetVideoFrameRateL", 
                                  aFramesPerSecond )
    
    VIDEO_SOURCE_ASSERT_READINESS
	
	if ( aFramesPerSecond > 0 )
	    {
	    iMediaRecorder->SetVideoFrameRateL( aFramesPerSecond );
	    }
	
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::SetVideoFrameRateL, exit" )
    }

// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::SetVideoRateControlOptionsL()
// -----------------------------------------------------------------------------
//
void CMccVideoSourceWrapper::SetVideoRateControlOptionsL( const TRateControlOptions& aOptions )
    {
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::SetVideoRateControlOptionsL")
    
    VIDEO_SOURCE_ASSERT_READINESS
	iMediaRecorder->SetVideoRateControlOptionsL( aOptions );
	
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::SetVideoRateControlOptionsL, exit" )
    }

// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::GetVideoRateControlOptionsL()
// -----------------------------------------------------------------------------
//
void CMccVideoSourceWrapper::GetVideoRateControlOptionsL( TRateControlOptions& aOptions )
    {
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::GetVideoRateControlOptionsL")
    
    VIDEO_SOURCE_ASSERT_READINESS
	iMediaRecorder->GetVideoRateControlOptionsL( aOptions );
	
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::GetVideoRateControlOptionsL, exit" )
    }
    
// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::SetVideoBitrateL()
// -----------------------------------------------------------------------------
//
CCMRMediaRecorder::TRecorderState CMccVideoSourceWrapper::State()
    {
    if ( iMediaRecorder && !iFatalErrorOccured )
        {        
        return iMediaRecorder->State();
        }
    else
        {
        return CCMRMediaRecorder::EStateNone;
        }
    }

// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::WriteBufferL()
// -----------------------------------------------------------------------------
//
void CMccVideoSourceWrapper::WriteBufferL( CCMRMediaBuffer* aBuffer )
	{
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::WriteBufferL" )
    iObserver.WriteBufferL( aBuffer );
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::WriteBufferL, exit" )
	}
	
// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::SetVideoFrameSize()
// -----------------------------------------------------------------------------
//
TInt CMccVideoSourceWrapper::SetVideoFrameSize( TSize aSize )
	{
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::SetVideoFrameSize" )
    return iObserver.SetVideoFrameSize( aSize );
	}

// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::SetAverageVideoBitRate()
// -----------------------------------------------------------------------------
//
TInt CMccVideoSourceWrapper::SetAverageVideoBitRate( TInt aBitRate )
	{
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::SetAverageVideoBitRate" )				
    return iObserver.SetAverageVideoBitRate( aBitRate );
	}

// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::SetMaxVideoBitRate()
// -----------------------------------------------------------------------------
//
TInt CMccVideoSourceWrapper::SetMaxVideoBitRate( TInt aBitRate )
	{
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::SetMaxVideoBitRate" )				
    return iObserver.SetMaxVideoBitRate( aBitRate );
	}

// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::SetAverageAudioBitRate()
// -----------------------------------------------------------------------------
//
TInt CMccVideoSourceWrapper::SetAverageAudioBitRate( TInt aBitRate )
	{
    __V_SOURCESINK_CONTROLL( "CMccVideoSourceWrapper::SetAverageAudioBitRate" )
    return iObserver.SetAverageAudioBitRate( aBitRate );
	}
		
// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::MmroPrepareComplete()
// -----------------------------------------------------------------------------
//
void CMccVideoSourceWrapper::MmroPrepareComplete( TInt aError )    
	{
    __V_SOURCESINK_CONTROLL_INT1( "CMccVideoSourceWrapper::MmroPrepareComplete=",
                                  aError )
    iObserver2.MmroPrepareComplete( aError );

	}

// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::MmroStateChange()
// -----------------------------------------------------------------------------
//
void CMccVideoSourceWrapper::MmroStateChange( TInt aState, TInt aError )
	{
    __V_SOURCESINK_CONTROLL_INT2( "CMccVideoSourceWrapper::MmroStateChange, \
aState=", aState, "aError=", aError )

    if ( iMediaRecorder )
        {
        __V_SOURCESINK_CONTROLL_INT1( "CMccVideoSourceWrapper, media recorder state:",
                                      iMediaRecorder->State() ) 
        }
        
    iObserver2.MmroStateChange( aState, aError );
	}

// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::MmroTemporaryError()
// -----------------------------------------------------------------------------
//
void CMccVideoSourceWrapper::MmroTemporaryError( TInt aError )    
	{
    __V_SOURCESINK_CONTROLL_INT1( "CMccVideoSourceWrapper::MmroTemporaryError=", 
                                  aError )
    iObserver2.MmroTemporaryError( aError );
	}

// -----------------------------------------------------------------------------
// CMccVideoSourceWrapper::MmroFatalError()
// -----------------------------------------------------------------------------
//
void CMccVideoSourceWrapper::MmroFatalError( TInt aError )
	{	
    __V_SOURCESINK_CONTROLL_INT1( "CMccVideoSourceWrapper::MmroFatalError=", aError )

    // Remember fatal error
    iFatalErrorOccured = ETrue;

    iObserver2.MmroFatalError( aError );
	}



