vtprotocolplugins/DisplaySink/src/CDisplaySinkNGA.cpp
changeset 0 ed9695c8bcbe
--- /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