vtprotocolplugins/DisplaySink/src/CDisplaySinkDP.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 23 Nov 2009 14:47:47 +0200
changeset 0 ed9695c8bcbe
permissions -rw-r--r--
Revision: 200948

/*
* Copyright (c) 2004 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:  Display Sink subsystem for Display Posting.
*
*/


// INCLUDE FILES

#include "CDisplaySinkDP.h"
#include "vtyuvconverter.h"

// MACROS

#ifdef _DEBUG
    #include <e32debug.h>
    #define PRINT RDebug::Print
    #define _IFDBG(a) a
#else
    #define PRINT
    #define _IFDBG(a)
#endif

// -----------------------------------------------------------------------------
// CDisplaySinkDP::NewL
// -----------------------------------------------------------------------------
//
CDisplaySinkDP* CDisplaySinkDP::NewL( TDisplaySinkParams& aParams,
        const TDesC8& aInitData )
    {
	_IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::NewL()<"), RThread().Id().operator TUint()));
    CDisplaySinkDP* self = new ( ELeave ) CDisplaySinkDP();
    CleanupStack::PushL( self );
    self->ConstructL( aParams, aInitData );
    CleanupStack::Pop(); // self
	_IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::NewL()>"), RThread().Id().operator TUint()));
    return self;
    }

// -----------------------------------------------------------------------------
// CDisplaySinkDP::CDisplaySinkDP
// -----------------------------------------------------------------------------
//
CDisplaySinkDP::CDisplaySinkDP()
    {
	_IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::Ctor<"), RThread().Id().operator TUint()));
	_IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::Ctor>"), RThread().Id().operator TUint()));
    }

// -----------------------------------------------------------------------------
// CDisplaySinkDP::~CDisplaySinkDP
// -----------------------------------------------------------------------------
//
CDisplaySinkDP::~CDisplaySinkDP()
    {
	_IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::~<"), RThread().Id().operator TUint()));
	_IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::~>"), RThread().Id().operator TUint()));
    }

// -----------------------------------------------------------------------------
// CDisplaySinkDP::BaseConstructL
// -----------------------------------------------------------------------------
//
void CDisplaySinkDP::BaseConstructL( TDisplaySinkParams& aParams,
    const TDesC8& )
    {
	_IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseConstructL()<"), RThread().Id().operator TUint()));
    iNewParams = static_cast< const TDisplaySinkParamsDP& >( aParams );
	if ( !iNewParams.iPostingBuffer1 || !iNewParams.iPostingBuffer2 )
	    {
        _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseConstructL() posting buffer is NULL!")));
	    User::Leave( KErrArgument );
	    }
    iBitmapTable[EFirstBitmap].iBuffer = iNewParams.iPostingBuffer1;
	iBitmapTable[ESecondBitmap].iBuffer = iNewParams.iPostingBuffer2;
    _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseConstructL()>"), RThread().Id().operator TUint()));
    }

// -----------------------------------------------------------------------------
// CDisplaySinkDP::BaseConvert
// -----------------------------------------------------------------------------
//
TBool CDisplaySinkDP::BaseConvert( const TVtMMFDataBuffer& aBuffer )
    {
    _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseConvert()<"), RThread().Id().operator TUint()));

    TBool consumed( ETrue );
    TBitmapNo bitmapNo( iBitmapTable[ EFirstBitmap ].iIsFree ? EFirstBitmap : ESecondBitmap );
    if ( iBitmapTable[ bitmapNo ].iIsFree &&
         !iReleased &&
         ( *iRequestStatusPtr == KRequestPending ) )
		{
        CPostingSurface::TPostingBuff* postingBuffer =
            *iBitmapTable[ bitmapNo ].iBuffer;

        TInt bufferLength(
            postingBuffer->GetSize().iHeight * postingBuffer->GetStride() );

        TPtr8 ptrBuffer(
            static_cast< TUint8* >( postingBuffer->GetBuffer() ),
            bufferLength,
            bufferLength
            );

        _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseConvert(): buffer %d: $%x %d bytes"), RThread().Id().operator TUint(), bitmapNo, postingBuffer->GetBuffer(), bufferLength));

        // Determine wether to convert or copy (420 will be just copied)
        if ( iNewParams.iPostingFormat ==
             CPostingSurface::EYuv422LeBt601Range0 )
            {
            _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseConvert(): converting to 422"), RThread().Id().operator TUint()));
            VtYuvConverter::ConvertFrom420PlanarTo422Interleaved(
                aBuffer.Data(),
                aBuffer.GetFrameSize(),
                ptrBuffer,
                postingBuffer->GetStride() );
            }
        else
            {
            _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseConvert(): copying as 420"), RThread().Id().operator TUint()));
            ptrBuffer = aBuffer.Data();
            }

		iBitmapTable[ bitmapNo ].iIsFree = EFalse;
		TRequestStatus* statusP = iRequestStatusPtr;
		iThread.RequestComplete( statusP, bitmapNo );
		}
    else
        {
        consumed = EFalse;
    	_IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseConvert(): could not find free buffer"), RThread().Id().operator TUint()));
        }
    _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseConvert()>"), RThread().Id().operator TUint()));
    return consumed;
    }

// -----------------------------------------------------------------------------
// CDisplaySinkDP::BaseSinkThreadLogonL
// -----------------------------------------------------------------------------
//
void CDisplaySinkDP::BaseSinkThreadLogonL()
    {
    _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseSinkThreadLogonL()<"), RThread().Id().operator TUint()));
    UpdateExpectedFrameSizeL();
    _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseSinkThreadLogonL()>"), RThread().Id().operator TUint()));
    }

// -----------------------------------------------------------------------------
// CDisplaySinkDP::BaseSinkThreadLogoff
// -----------------------------------------------------------------------------
//
void CDisplaySinkDP::BaseSinkThreadLogoff()
    {
    _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseSinkThreadLogoff()<"), RThread().Id().operator TUint()));
    _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseSinkThreadLogoff()>"), RThread().Id().operator TUint()));
    }

// -----------------------------------------------------------------------------
// CDisplaySinkDP::BaseUpdateSinkParamsL
// -----------------------------------------------------------------------------
//
void CDisplaySinkDP::BaseUpdateSinkParamsL( const TDisplaySinkParams& aParams )
    {
    _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseUpdateSinkParamsL()<"), RThread().Id().operator TUint()));
    iNewParams = static_cast< const TDisplaySinkParamsDP& >( aParams );
    _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseUpdateSinkParamsL()>"), RThread().Id().operator TUint()));
    }

// -----------------------------------------------------------------------------
// CDisplaySinkDP::BaseDoUpdateParamsL
// -----------------------------------------------------------------------------
//
void CDisplaySinkDP::BaseDoUpdateParamsL()
    {
    _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseDoUpdateParamsL()<"), RThread().Id().operator TUint()));
    iBitmapTable[ EFirstBitmap ].iBuffer = iNewParams.iPostingBuffer1;
    iBitmapTable[ ESecondBitmap ].iBuffer = iNewParams.iPostingBuffer2;
    UpdateExpectedFrameSizeL();
    if( iNewParams.iFrameRateLimit != iFrameRateInterval )
        {
        SetFrameRateLimit( iNewParams.iFrameRateLimit );
        ResetFrameRateLimitter();
        }
    _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseDoUpdateParamsL()>"), RThread().Id().operator TUint()));
    }

// -----------------------------------------------------------------------------
// CDisplaySinkDP::BaseSetVideoFrameSizeL
// -----------------------------------------------------------------------------
//
void CDisplaySinkDP::BaseSetVideoFrameSizeL( const TSize& )
    {
    _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseSetVideoFrameSizeL()<"), RThread().Id().operator TUint()));
    _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseSetVideoFrameSizeL()>"), RThread().Id().operator TUint()));
    }

// -----------------------------------------------------------------------------
// CDisplaySinkDP::BaseSizesMatch
// -----------------------------------------------------------------------------
//
TBool CDisplaySinkDP::BaseSizesMatch( const TSize& aSize )
    {
    _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseSizesMatch()<"), RThread().Id().operator TUint()));
    TBool sizesMatch( iExpectedFrameSize == aSize );
    _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseSizesMatch() %d>"), RThread().Id().operator TUint(), sizesMatch));
    return sizesMatch;
    }

// -----------------------------------------------------------------------------
// CDisplaySinkDP::BitmapEntry
// -----------------------------------------------------------------------------
//
CDisplaySink::TBitmapEntry& CDisplaySinkDP::BitmapEntry( TInt aIndex )
    {
    _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BitmapEntry(%d)<"), RThread().Id().operator TUint(), aIndex));
    _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BitmapEntry()>"), RThread().Id().operator TUint()));
    return iBitmapTable[ aIndex ];
    }

// -----------------------------------------------------------------------------
// CDisplaySinkDP::BaseEmptyBufferL
// -----------------------------------------------------------------------------
//
void CDisplaySinkDP::BaseEmptyBufferL( TVtMMFDataBuffer& aVTMMFBuffer )
    {
    _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseEmptyBufferL()<"), RThread().Id().operator TUint()));
    if ( BaseConvert( aVTMMFBuffer ) )
        {
        CleanupStack::PopAndDestroy(); // iBitmapCS.Signal();
        iSupplier->BufferEmptiedL( iBuffer );
        }
    else
        {
        if ( iVideoFrameQueue->IsStored() || !IsOkToSendFrame() )
            {
            CleanupStack::PopAndDestroy(); // iBitmapCS.Signal();
            iSupplier->BufferEmptiedL( iBuffer );
            }
        else
            {
            iVideoFrameQueue->Store( *iSupplier, static_cast<CMMFDataBuffer*>(aVTMMFBuffer.GetMMFBuffer()), aVTMMFBuffer.GetFrameSize(), aVTMMFBuffer.Data() );
            CleanupStack::PopAndDestroy(); // iBitmapCS.Signal();
            }
        }
    _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseEmptyBufferL()>"), RThread().Id().operator TUint()));
    }

// -----------------------------------------------------------------------------
// CDisplaySinkDP::BaseSetBitmapAvailable( TBitmapNo aBitmapNo )
// -----------------------------------------------------------------------------
//
void CDisplaySinkDP::BaseSetBitmapAvailable( TBitmapNo )
	{
	_IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseSetBitmapAvailable()<"), RThread().Id().operator TUint()));
	NextFrame();
	_IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseSetBitmapAvailable()>"), RThread().Id().operator TUint()));
	}

// -----------------------------------------------------------------------------
// CDisplaySinkDP::BaseVideoFrameSizeChangedL( const TSize& )
// -----------------------------------------------------------------------------
//
void CDisplaySinkDP::BaseVideoFrameSizeChangedL( const TSize& )
	{
	_IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseVideoFrameSizeChangedL()<"), RThread().Id().operator TUint()));
	_IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::BaseVideoFrameSizeChangedL()>"), RThread().Id().operator TUint()));
	}

// -----------------------------------------------------------------------------
// CDisplaySinkDP::NextFrame
// -----------------------------------------------------------------------------
//
void CDisplaySinkDP::NextFrame()
    {
	_IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::NextFrame()<"), RThread().Id().operator TUint()));
    if ( iVideoFrameQueue->IsStored() )
        {
        if ( IsOkToSendFrame() )
        	{
        	BaseConvert( iVideoFrameQueue->Buffer() );
        	}
        iVideoFrameQueue->Release();
        }
	_IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::NextFrame()>"), RThread().Id().operator TUint()));
    }

// -----------------------------------------------------------------------------
// CDisplaySinkDP::UpdateExpectedFrameSizeL()
// -----------------------------------------------------------------------------
//
void CDisplaySinkDP::UpdateExpectedFrameSizeL()
    {
	_IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::UpdateExpectedFrameSizeL()<"), RThread().Id().operator TUint()));
    iExpectedFrameSize = iNewParams.iFrameSize;
    _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkDP::UpdateExpectedFrameSizeL()>"), RThread().Id().operator TUint()));
    }

// End of File