vtprotocolplugins/DisplaySink/src/CDisplaySinkNGA.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-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