vtprotocolplugins/DisplaySink/src/CDisplaySinkDP.cpp
changeset 0 ed9695c8bcbe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vtprotocolplugins/DisplaySink/src/CDisplaySinkDP.cpp	Mon Nov 23 14:47:47 2009 +0200
@@ -0,0 +1,309 @@
+/*
+* 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