--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vtprotocolplugins/DisplaySink/src/CDisplaySinkNGA.cpp Mon Nov 23 14:47:47 2009 +0200
@@ -0,0 +1,818 @@
+/*
+* Copyright (c) 2004-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: Class for CDisplaySinkNGA.
+*
+*/
+
+// INCLUDE FILES
+
+#include "CDisplaySinkNGA.h"
+
+// MACROS
+
+#ifdef _DEBUG
+ #include <e32debug.h>
+ #define PRINT RDebug::Print
+ #define _IFDBG(a) a
+#else
+ #define PRINT
+ #define _IFDBG(a)
+#endif
+
+ static const TUint8 NGA_COFF_TBL_64K[ 220 ]=
+ {
+ 0xe9,0x66,0x01,0x00, // KRedCrFactor
+ 0x1a,0x58,0x00,0x00, // KGreenCbFactor
+ 0xd2,0xb6,0x00,0x00, // KGreenCrFactor
+ 0xa2,0xc5,0x01,0x00, // KBlueCbFactor
+
+ 0x00,0x00,0x00,0x00, // 5-bit
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x01,0x02,0x03,
+ 0x04,0x05,0x06,0x07,
+ 0x08,0x09,0x0a,0x0b,
+ 0x0c,0x0d,0x0e,0x0f,
+ 0x10,0x11,0x12,0x13,
+ 0x14,0x15,0x16,0x17,
+ 0x18,0x19,0x1a,0x1b,
+ 0x1c,0x1d,0x1e,0x1f,
+ 0x1f,0x1f,0x1f,0x1f,
+ 0x1f,0x1f,0x1f,0x1f,
+ 0x1f,0x1f,0x1f,0x1f,
+ 0x1f,0x1f,0x1f,0x1f,
+ 0x1f,0x1f,0x1f,0x1f,
+
+ 0x00,0x00,0x00,0x00, // 6-bit
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x01,0x02,0x03,
+ 0x04,0x05,0x06,0x07,
+ 0x08,0x09,0x0a,0x0b,
+ 0x0c,0x0d,0x0e,0x0f,
+ 0x10,0x11,0x12,0x13,
+ 0x14,0x15,0x16,0x17,
+ 0x18,0x19,0x1a,0x1b,
+ 0x1c,0x1d,0x1e,0x1f,
+ 0x20,0x21,0x22,0x23,
+ 0x24,0x25,0x26,0x27,
+ 0x28,0x29,0x2a,0x2b,
+ 0x2c,0x2d,0x2e,0x2f,
+ 0x30,0x31,0x32,0x33,
+ 0x34,0x35,0x36,0x37,
+ 0x38,0x39,0x3a,0x3b,
+ 0x3c,0x3d,0x3e,0x3f,
+ 0x3f,0x3f,0x3f,0x3f,
+ 0x3f,0x3f,0x3f,0x3f,
+ 0x3f,0x3f,0x3f,0x3f,
+ 0x3f,0x3f,0x3f,0x3f,
+ 0x3f,0x3f,0x3f,0x3f,
+ 0x3f,0x3f,0x3f,0x3f,
+ 0x3f,0x3f,0x3f,0x3f,
+ 0x3f,0x3f,0x3f,0x3f,
+ 0x3f,0x3f,0x3f,0x3f,
+ 0x3f,0x3f,0x3f,0x3f,
+ 0x3f,0x3f,0x3f,0x3f
+ };
+
+
+ const TUint8 NGA_COFF_TBL_16M[ 528 ] =
+ {
+ 0xe9,0x66,0x01,0x00, // KRedCrFactor
+ 0x1a,0x58,0x00,0x00, // KGreenCbFactor
+ 0xd2,0xb6,0x00,0x00, // KGreenCrFactor
+ 0xa2,0xc5,0x01,0x00, // KBlueCbFactor
+
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,
+
+ 0x00,0x01,0x02,0x03, // 8-bit
+ 0x04,0x05,0x06,0x07,
+ 0x08,0x09,0x0a,0x0b,
+ 0x0c,0x0d,0x0e,0x0f,
+
+ 0x10,0x11,0x12,0x13,
+ 0x14,0x15,0x16,0x17,
+ 0x18,0x19,0x1a,0x1b,
+ 0x1c,0x1d,0x1e,0x1f,
+
+ 0x20,0x21,0x22,0x23,
+ 0x24,0x25,0x26,0x27,
+ 0x28,0x29,0x2a,0x2b,
+ 0x2c,0x2d,0x2e,0x2f,
+
+ 0x30,0x31,0x32,0x33,
+ 0x34,0x35,0x36,0x37,
+ 0x38,0x39,0x3a,0x3b,
+ 0x3c,0x3d,0x3e,0x3f,
+
+ 0x40,0x41,0x42,0x43,
+ 0x44,0x45,0x46,0x47,
+ 0x48,0x49,0x4a,0x4b,
+ 0x4c,0x4d,0x4e,0x4f,
+
+ 0x50,0x51,0x52,0x53,
+ 0x54,0x55,0x56,0x57,
+ 0x58,0x59,0x5a,0x5b,
+ 0x5c,0x5d,0x5e,0x5f,
+
+ 0x60,0x61,0x62,0x63,
+ 0x64,0x65,0x66,0x67,
+ 0x68,0x69,0x6a,0x6b,
+ 0x6c,0x6d,0x6e,0x6f,
+
+ 0x70,0x71,0x72,0x73,
+ 0x74,0x75,0x76,0x77,
+ 0x78,0x79,0x7a,0x7b,
+ 0x7c,0x7d,0x7e,0x7f,
+
+ 0x80,0x81,0x82,0x83,
+ 0x84,0x85,0x86,0x87,
+ 0x88,0x89,0x8a,0x8b,
+ 0x8c,0x8d,0x8e,0x8f,
+
+ 0x90,0x91,0x92,0x93,
+ 0x94,0x95,0x96,0x97,
+ 0x98,0x99,0x9a,0x9b,
+ 0x9c,0x9d,0x9e,0x9f,
+
+ 0xa0,0xa1,0xa2,0xa3,
+ 0xa4,0xa5,0xa6,0xa7,
+ 0xa8,0xa9,0xaa,0xab,
+ 0xac,0xad,0xae,0xaf,
+
+ 0xb0,0xb1,0xb2,0xb3,
+ 0xb4,0xb5,0xb6,0xb7,
+ 0xb8,0xb9,0xba,0xbb,
+ 0xbc,0xbd,0xbe,0xbf,
+
+ 0xc0,0xc1,0xc2,0xc3,
+ 0xc4,0xc5,0xc6,0xc7,
+ 0xc8,0xc9,0xca,0xcb,
+ 0xcc,0xcd,0xce,0xcf,
+
+ 0xd0,0xd1,0xd2,0xd3,
+ 0xd4,0xd5,0xd6,0xd7,
+ 0xd8,0xd9,0xda,0xdb,
+ 0xdc,0xdd,0xde,0xdf,
+
+ 0xe0,0xe1,0xe2,0xe3,
+ 0xe4,0xe5,0xe6,0xe7,
+ 0xe8,0xe9,0xea,0xeb,
+ 0xec,0xed,0xee,0xef,
+
+ 0xf0,0xf1,0xf2,0xf3,
+ 0xf4,0xf5,0xf6,0xf7,
+ 0xf8,0xf9,0xfa,0xfb,
+ 0xfc,0xfd,0xfe,0xff,
+
+ 0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,
+
+ 0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,
+
+ 0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,
+
+ 0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,
+
+ 0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,
+
+ 0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,
+
+ 0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff
+ };
+
+
+ void ConvertFrom420PlanarToRGB_565(
+ const TDesC8& aSource,
+ const TSize& aSize,
+ TDes8& aTarget,
+ TInt aStride )
+ {
+ TInt height( aSize.iHeight >> 1 );
+ TInt width( aSize.iWidth );
+
+ TInt ySize = aSize.iWidth * aSize.iHeight;
+ TInt ySizeDiv4 = ( ySize >> 2 );
+
+ const TUint32* y1 = reinterpret_cast< const TUint32* >( aSource.Mid( 0, ySize ).Ptr() );
+ const TUint32* u = reinterpret_cast< const TUint32* >( aSource.Mid( ySize, ySizeDiv4 ).Ptr() );
+ const TUint32* v = reinterpret_cast< const TUint32* >( aSource.Mid( ySize + ySizeDiv4, ySizeDiv4 ).Ptr() );
+
+ TUint32 uintsPerDestRow = aStride >> 2;
+
+ const TUint32* TargetPtr = reinterpret_cast< const TUint32* >( aTarget.Ptr() );
+
+ TUint32* d1 = const_cast< TUint32* >( TargetPtr );
+
+ TUint32 ywidth = width >> 2;
+
+ width >>= 3;
+
+ TInt32 cb;
+ TInt32 cr;
+ TInt32 greenCbCr;
+ TInt32 yy;
+ TInt32 red;
+ TInt32 green;
+ TInt32 blue;
+ TUint32 r1;
+ const TUint8* clip = NGA_COFF_TBL_64K + 40;
+
+ for( TInt y = 0; y < height; y++ )
+ {
+ for( TInt x = 0; x < width; x++ )
+ {
+ TUint32 u1 = *u++;
+ TUint32 v1 = *v++;
+
+ for( TInt c2 = 0; c2 < 2; c2++ )
+ {
+ TUint32 yy2 = y1[ ywidth ];
+ TUint32 yy1 = *y1++;
+
+ for( TInt c = 0; c < 2; c++ )
+ {
+ cb = TInt32( u1 & 0xff ) - 128;
+ u1 >>= 8;
+ cr = TInt32( v1 & 0xff ) - 128;
+ v1 >>= 8;
+
+ greenCbCr =
+ (
+ cr * *reinterpret_cast< const TInt32* >( clip - 32 ) +
+ cb * *reinterpret_cast< const TInt32* >( clip - 36 )
+ ) >> 16;
+ cr =
+ (
+ cr * *reinterpret_cast< const TInt32* >( clip - 40 )
+ ) >> 16;
+ cb =
+ (
+ cb * *reinterpret_cast< const TInt32* >( clip - 28 )
+ ) >> 16;
+
+ // lower left
+ yy = ( yy2 & 0xff );
+ yy2 >>= 8;
+
+ red = yy + cr;
+ green = yy - greenCbCr;
+ blue = yy + cb;
+
+ red = clip[ red >> 4 ];
+ green = clip[ green >> 4 ];
+ blue = clip[ blue >> 4 ];
+
+ // RGB_444
+ r1 = green | ( red << 4 );
+ r1 = blue | ( r1 << 4 );
+
+ // lower right
+ yy = ( yy2 & 0xff );
+ yy2 >>= 8;
+
+ red = yy + cr;
+ green = yy - greenCbCr;
+ blue = yy + cb;
+
+ red = clip[ red >> 4 ];
+ green = clip[ green >> 4 ];
+ blue = clip[ blue >> 4 ];
+
+ // RGB_444
+ r1 |= ( ( green | ( red << 4 ) ) << 4 | blue ) << 16;
+
+ d1[ uintsPerDestRow ] = r1;
+
+ // upper left
+ yy = ( yy1 & 0xff );
+ yy1 >>= 8;
+
+ red = yy + cr;
+ green = yy - greenCbCr;
+ blue = yy + cb;
+
+ red = clip[ red >> 4 ];
+ green = clip[ green >> 4 ];
+ blue = clip[ blue >> 4 ];
+
+ // RGB_444
+ r1 = green | ( red << 4 );
+ r1 = blue | ( r1 << 4 );
+
+ // upper right
+ yy = ( yy1 & 0xff );
+ yy1 >>= 8;
+
+ red = yy + cr;
+ green = yy - greenCbCr;
+ blue = yy + cb;
+
+ red = clip[ red >> 4 ];
+ green = clip[ green >> 4 ];
+ blue = clip[ blue >> 4 ];
+
+ // RGB_444
+ r1 |= ( ( green | ( red << 4 ) ) << 4 | blue ) << 16;
+
+ *d1++ = r1;
+ }
+ }
+ }
+
+ y1 += ( width << 1 );
+ d1 += uintsPerDestRow;
+ }
+ }
+
+
+ void ConvertFrom420PlanarToXRGB_8888(
+ const TDesC8& aSource,
+ const TSize& aSize,
+ TDes8& aTarget,
+ TInt aStride )
+ {
+
+ TInt height( aSize.iHeight >> 1 );
+ TInt width( aSize.iWidth );
+
+ TInt ySize = aSize.iWidth * aSize.iHeight;
+ TInt ySizeDiv4 = ( ySize >> 2 );
+
+ const TUint32* y1 = reinterpret_cast< const TUint32* >( aSource.Mid( 0, ySize ).Ptr() );
+ const TUint32* u = reinterpret_cast< const TUint32* >( aSource.Mid( ySize, ySizeDiv4 ).Ptr() );
+ const TUint32* v = reinterpret_cast< const TUint32* >( aSource.Mid( ySize + ySizeDiv4, ySizeDiv4 ).Ptr() );
+
+ TUint32 uintsPerDestRow = aStride >> 2;
+
+ const TUint32* TargetPtr = reinterpret_cast< const TUint32* >( aTarget.Ptr() );
+
+ TUint32* d1 = const_cast< TUint32* >( TargetPtr );
+
+
+ TUint32 ywidth = width >> 2;
+
+ width >>= 3;
+
+ TInt32 cb;
+ TInt32 cr;
+ TInt32 greenCbCr;
+ TInt32 yy;
+ TUint32 p;
+ const TUint8* clip = NGA_COFF_TBL_16M + 144;
+
+ for( TInt y = 0; y < height; y++ )
+ {
+ for( TInt x = 0; x < width; x++ )
+ {
+ TUint32 u1 = *u++;
+ TUint32 v1 = *v++;
+
+ for( TInt c2 = 0; c2 < 2; c2++ )
+ {
+ TUint32 yy2 = y1[ ywidth ];
+ TUint32 yy1 = *y1++;
+
+ for( TInt c = 0; c < 2; c++ )
+ {
+ cb = TInt32( u1 & 0xff ) - 128;
+ u1 >>= 8;
+ cr = TInt32( v1 & 0xff ) - 128;
+ v1 >>= 8;
+
+ greenCbCr =
+ (
+ cr * *reinterpret_cast< const TInt32* >( clip - 136 ) +
+ cb * *reinterpret_cast< const TInt32* >( clip - 140 )
+ ) >> 16;
+ cr =
+ (
+ cr * *reinterpret_cast< const TInt32* >( clip - 144 )
+ ) >> 16;
+ cb =
+ (
+ cb * *reinterpret_cast< const TInt32* >( clip - 132 )
+ ) >> 16;
+
+ // lower left
+ yy = ( yy2 & 0xff );
+ yy2 >>= 8;
+
+ // 0xffBBGG
+ p = 0xff0000 |
+ ( clip[ yy + cr ] << 8 ) | clip[ yy - greenCbCr ];
+ // 0xffBBGGRR
+ d1[ uintsPerDestRow ] = clip[ yy + cb ] | ( p << 8 );
+
+ // lower right
+ yy = ( yy2 & 0xff );
+ yy2 >>= 8;
+
+ // 0xffBBGG
+ p = 0xff0000 |
+ ( clip[ yy + cr ] << 8 ) | clip[ yy - greenCbCr ];
+ // 0xffBBGGRR
+ d1[ uintsPerDestRow + 1 ] = clip[ yy + cb ] | ( p << 8 );
+
+ // upper left
+ yy = ( yy1 & 0xff );
+ yy1 >>= 8;
+
+ // 0xffBBGG
+ p = 0xff0000 |
+ ( clip[ yy + cr ] << 8 ) | clip[ yy - greenCbCr ];
+ // 0xffBBGGRR
+ *d1++ = clip[ yy + cb ] | ( p << 8 );
+
+ // upper right
+ yy = ( yy1 & 0xff );
+ yy1 >>= 8;
+
+ // 0xffBBGG
+ p = 0xff0000 |
+ ( clip[ yy + cr ] << 8 ) | clip[ yy - greenCbCr ];
+ // 0xffBBGGRR
+ *d1++ = clip[ yy + cb ] | ( p << 8 );
+ }
+ }
+ }
+
+ y1 += ( width << 1 );
+ d1 += uintsPerDestRow;
+ }
+
+ }
+
+
+// -----------------------------------------------------------------------------
+// CDisplaySinkNGA::NewL
+// -----------------------------------------------------------------------------
+//
+CDisplaySinkNGA* CDisplaySinkNGA::NewL( TDisplaySinkParams& aParams,
+ const TDesC8& aInitData )
+ {
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::NewL()<"), RThread().Id().operator TUint()));
+ CDisplaySinkNGA* self = new ( ELeave ) CDisplaySinkNGA();
+ CleanupStack::PushL( self );
+ self->ConstructL( aParams, aInitData );
+ CleanupStack::Pop(); // self
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::NewL()>"), RThread().Id().operator TUint()));
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CDisplaySinkNGA::CDisplaySinkNGA
+// -----------------------------------------------------------------------------
+//
+CDisplaySinkNGA::CDisplaySinkNGA()
+ {
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::Ctor<"), RThread().Id().operator TUint()));
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::Ctor>"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CDisplaySinkNGA::~CDisplaySinkNGA
+// -----------------------------------------------------------------------------
+//
+CDisplaySinkNGA::~CDisplaySinkNGA()
+ {
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::~<"), RThread().Id().operator TUint()));
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::~>"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CDisplaySinkNGA::BaseConstructL
+// -----------------------------------------------------------------------------
+//
+void CDisplaySinkNGA::BaseConstructL( TDisplaySinkParams& aParams,
+ const TDesC8& )
+ {
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseConstructL()<"), RThread().Id().operator TUint()));
+ iNewParams = static_cast< const TDisplaySinkParamsNGA& >( aParams );
+ if ( !iNewParams.iSurfaceBuffer1 || !iNewParams.iSurfaceBuffer2 )
+ {
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseConstructL() surface buffer is NULL!")));
+ User::Leave( KErrArgument );
+ }
+ iBitmapTable[EFirstBitmap].iBuffer = iNewParams.iSurfaceBuffer1;
+ iBitmapTable[ESecondBitmap].iBuffer = iNewParams.iSurfaceBuffer2;
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseConstructL()>"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CDisplaySinkNGA::BaseConvert
+// -----------------------------------------------------------------------------
+//
+TBool CDisplaySinkNGA::BaseConvert( const TVtMMFDataBuffer& aBuffer )
+ {
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseConvert()<"), RThread().Id().operator TUint()));
+
+ TBool consumed( ETrue );
+ TBitmapNo bitmapNo( iBitmapTable[ EFirstBitmap ].iIsFree ? EFirstBitmap : ESecondBitmap );
+ if ( iBitmapTable[ bitmapNo ].iIsFree &&
+ !iReleased &&
+ ( *iRequestStatusPtr == KRequestPending ) )
+ {
+#if 1
+ TInt bufferLength(
+ //iNewParams.iFrameSize.iHeight * ( iNewParams.iFrameSize.iWidth * 2 ) );
+ iNewParams.iFrameSize.iHeight * ( iNewParams.iFrameSize.iWidth * 3/2 ) );
+#else
+ TInt bufferLength(
+ iNewParams.iFrameSize.iHeight * ( iNewParams.iFrameSize.iWidth * 4 ) );
+#endif
+
+ TPtr8 ptrBuffer(
+ *iBitmapTable[ bitmapNo ].iBuffer,
+ bufferLength,
+ bufferLength
+ );
+
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseConvert(): buffer %d: $%x %d bytes"), RThread().Id().operator TUint(), bitmapNo, *iBitmapTable[ bitmapNo ].iBuffer, bufferLength));
+
+ // Determine wether to convert or copy (420 will be just copied)
+ //if ( iNewParams.iSurfaceFormat == EUidPixelFormatRGB_565 )
+ if ( iNewParams.iSurfaceFormat == EUidPixelFormatXRGB_8888 )
+ {
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseConvert(): converting to RGB565"), RThread().Id().operator TUint()));
+
+ /*
+ ConvertFrom420PlanarToRGB_565(
+ aBuffer.Data(),
+ aBuffer.GetFrameSize(),
+ ptrBuffer,
+ iNewParams.iFrameSize.iWidth * 2 );
+ */
+
+ ConvertFrom420PlanarToXRGB_8888(
+ aBuffer.Data(),
+ aBuffer.GetFrameSize(),
+ ptrBuffer,
+ iNewParams.iFrameSize.iWidth * 4 );
+
+ }
+ else
+ {
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::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]: CDisplaySinkNGA::BaseConvert(): could not find free buffer"), RThread().Id().operator TUint()));
+ }
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseConvert()>"), RThread().Id().operator TUint()));
+ return consumed;
+
+ }
+
+// -----------------------------------------------------------------------------
+// CDisplaySinkNGA::BaseSinkThreadLogonL
+// -----------------------------------------------------------------------------
+//
+void CDisplaySinkNGA::BaseSinkThreadLogonL()
+ {
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseSinkThreadLogonL()<"), RThread().Id().operator TUint()));
+ UpdateExpectedFrameSizeL();
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseSinkThreadLogonL()>"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CDisplaySinkNGA::BaseSinkThreadLogoff
+// -----------------------------------------------------------------------------
+//
+void CDisplaySinkNGA::BaseSinkThreadLogoff()
+ {
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseSinkThreadLogoff()<"), RThread().Id().operator TUint()));
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseSinkThreadLogoff()>"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CDisplaySinkNGA::BaseUpdateSinkParamsL
+// -----------------------------------------------------------------------------
+//
+void CDisplaySinkNGA::BaseUpdateSinkParamsL( const TDisplaySinkParams& aParams )
+ {
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseUpdateSinkParamsL()<"), RThread().Id().operator TUint()));
+ iNewParams = static_cast< const TDisplaySinkParamsNGA& >( aParams );
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseUpdateSinkParamsL()>"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CDisplaySinkNGA::BaseDoUpdateParamsL
+// -----------------------------------------------------------------------------
+//
+void CDisplaySinkNGA::BaseDoUpdateParamsL()
+ {
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseDoUpdateParamsL()<"), RThread().Id().operator TUint()));
+ iBitmapTable[ EFirstBitmap ].iBuffer = iNewParams.iSurfaceBuffer1;
+ iBitmapTable[ ESecondBitmap ].iBuffer = iNewParams.iSurfaceBuffer2;
+ UpdateExpectedFrameSizeL();
+ if( iNewParams.iFrameRateLimit != iFrameRateInterval )
+ {
+ SetFrameRateLimit( iNewParams.iFrameRateLimit );
+ ResetFrameRateLimitter();
+ }
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseDoUpdateParamsL()>"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CDisplaySinkNGA::BaseSetVideoFrameSizeL
+// -----------------------------------------------------------------------------
+//
+void CDisplaySinkNGA::BaseSetVideoFrameSizeL( const TSize& )
+ {
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseSetVideoFrameSizeL()<"), RThread().Id().operator TUint()));
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseSetVideoFrameSizeL()>"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CDisplaySinkNGA::BaseSizesMatch
+// -----------------------------------------------------------------------------
+//
+TBool CDisplaySinkNGA::BaseSizesMatch( const TSize& aSize)
+ {
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseSizesMatch()<"), RThread().Id().operator TUint()));
+ TBool sizesMatch( iExpectedFrameSize == aSize );
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseSizesMatch()>"), RThread().Id().operator TUint()));
+ return sizesMatch;
+ }
+
+// -----------------------------------------------------------------------------
+// CDisplaySinkNGA::BitmapEntry
+// -----------------------------------------------------------------------------
+//
+CDisplaySink::TBitmapEntry& CDisplaySinkNGA::BitmapEntry( TInt aIndex )
+ {
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BitmapEntry(%d)<"), RThread().Id().operator TUint(), aIndex));
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BitmapEntry()>"), RThread().Id().operator TUint()));
+ return iBitmapTable[ aIndex ];
+ }
+
+// -----------------------------------------------------------------------------
+// CDisplaySinkNGA::BaseEmptyBufferL
+// -----------------------------------------------------------------------------
+//
+void CDisplaySinkNGA::BaseEmptyBufferL( TVtMMFDataBuffer& aVTMMFBuffer )
+ {
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::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]: CDisplaySinkNGA::BaseEmptyBufferL()>"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CDisplaySinkNGA::BaseSetBitmapAvailable( TBitmapNo aBitmapNo )
+// -----------------------------------------------------------------------------
+//
+void CDisplaySinkNGA::BaseSetBitmapAvailable( TBitmapNo )
+ {
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseSetBitmapAvailable()<"), RThread().Id().operator TUint()));
+ if ( iVideoFrameQueue->IsStored() )
+ {
+ if ( IsOkToSendFrame() )
+ {
+ BaseConvert( iVideoFrameQueue->Buffer() );
+ }
+ iVideoFrameQueue->Release();
+ }
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseSetBitmapAvailable()>"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CDisplaySinkNGA::BaseVideoFrameSizeChangedL( const TSize& )
+// -----------------------------------------------------------------------------
+//
+void CDisplaySinkNGA::BaseVideoFrameSizeChangedL( const TSize& )
+ {
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseVideoFrameSizeChangedL()<"), RThread().Id().operator TUint()));
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::BaseVideoFrameSizeChangedL()>"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CDisplaySinkNGA::NextFrame
+// -----------------------------------------------------------------------------
+//
+void CDisplaySinkNGA::NextFrame()
+ {
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::NextFrame()<"), RThread().Id().operator TUint()));
+ iBitmapCS.Wait();
+ if ( iVideoFrameQueue->IsStored() )
+ {
+ if ( IsOkToSendFrame() )
+ {
+ BaseConvert( iVideoFrameQueue->Buffer() );
+ }
+ iVideoFrameQueue->Release();
+ }
+ iBitmapCS.Signal();
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::NextFrame()>"), RThread().Id().operator TUint()));
+ }
+
+// -----------------------------------------------------------------------------
+// CDisplaySinkDP::UpdateExpectedFrameSizeL()
+// -----------------------------------------------------------------------------
+//
+void CDisplaySinkNGA::UpdateExpectedFrameSizeL()
+ {
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::UpdateExpectedFrameSizeL()<"), RThread().Id().operator TUint()));
+ iExpectedFrameSize = iNewParams.iFrameSize;
+ _IFDBG(PRINT(_L("VideoSource[%d]: CDisplaySinkNGA::UpdateExpectedFrameSizeL()>"), RThread().Id().operator TUint()));
+ }
+
+// End of File