--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vtengines/videoteleng/Src/Media/CVtEngDrawDP.cpp Mon Nov 23 14:47:47 2009 +0200
@@ -0,0 +1,2026 @@
+/*
+* 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: Remote video handler.
+*
+*/
+
+
+// INCLUDE FILES
+
+#include "CVtEngDrawDP.h"
+#include "CVtEngEventManager.h"
+#include "CVtEngSettings.h"
+#include "VtEngUtils.h"
+#include "MVtEngFrameObserver.h"
+#include <videotelephonyvariant.hrh>
+#include <tdisplaysinkparamsdp.h>
+#include <cvtlogger.h>
+#include <posting_surface_factory.h>
+
+#include <cvtimagebitmap.h>
+
+// LOCAL CONSTANTS AND MACROS
+
+// YCbCr conversion constants
+
+// Luma
+static const TUint32 KYLut[ 256 ] =
+ {
+ 0x00000000, 0x00400801, 0x00801002, 0x00C01803,
+ 0x01002004, 0x01402805, 0x01803006, 0x01C03807,
+ 0x02004008, 0x02404809, 0x0280500A, 0x02C0580B,
+ 0x0300600C, 0x0340680D, 0x0380700E, 0x03C0780F,
+ 0x04008010, 0x04408811, 0x04809012, 0x04C09813,
+ 0x0500A014, 0x0540A815, 0x0580B016, 0x05C0B817,
+ 0x0600C018, 0x0640C819, 0x0680D01A, 0x06C0D81B,
+ 0x0700E01C, 0x0740E81D, 0x0780F01E, 0x07C0F81F,
+ 0x08010020, 0x08410821, 0x08811022, 0x08C11823,
+ 0x09012024, 0x09412825, 0x09813026, 0x09C13827,
+ 0x0A014028, 0x0A414829, 0x0A81502A, 0x0AC1582B,
+ 0x0B01602C, 0x0B41682D, 0x0B81702E, 0x0BC1782F,
+ 0x0C018030, 0x0C418831, 0x0C819032, 0x0CC19833,
+ 0x0D01A034, 0x0D41A835, 0x0D81B036, 0x0DC1B837,
+ 0x0E01C038, 0x0E41C839, 0x0E81D03A, 0x0EC1D83B,
+ 0x0F01E03C, 0x0F41E83D, 0x0F81F03E, 0x0FC1F83F,
+ 0x10020040, 0x10420841, 0x10821042, 0x10C21843,
+ 0x11022044, 0x11422845, 0x11823046, 0x11C23847,
+ 0x12024048, 0x12424849, 0x1282504A, 0x12C2584B,
+ 0x1302604C, 0x1342684D, 0x1382704E, 0x13C2784F,
+ 0x14028050, 0x14428851, 0x14829052, 0x14C29853,
+ 0x1502A054, 0x1542A855, 0x1582B056, 0x15C2B857,
+ 0x1602C058, 0x1642C859, 0x1682D05A, 0x16C2D85B,
+ 0x1702E05C, 0x1742E85D, 0x1782F05E, 0x17C2F85F,
+ 0x18030060, 0x18430861, 0x18831062, 0x18C31863,
+ 0x19032064, 0x19432865, 0x19833066, 0x19C33867,
+ 0x1A034068, 0x1A434869, 0x1A83506A, 0x1AC3586B,
+ 0x1B03606C, 0x1B43686D, 0x1B83706E, 0x1BC3786F,
+ 0x1C038070, 0x1C438871, 0x1C839072, 0x1CC39873,
+ 0x1D03A074, 0x1D43A875, 0x1D83B076, 0x1DC3B877,
+ 0x1E03C078, 0x1E43C879, 0x1E83D07A, 0x1EC3D87B,
+ 0x1F03E07C, 0x1F43E87D, 0x1F83F07E, 0x1FC3F87F,
+ 0x20040080, 0x20440881, 0x20841082, 0x20C41883,
+ 0x21042084, 0x21442885, 0x21843086, 0x21C43887,
+ 0x22044088, 0x22444889, 0x2284508A, 0x22C4588B,
+ 0x2304608C, 0x2344688D, 0x2384708E, 0x23C4788F,
+ 0x24048090, 0x24448891, 0x24849092, 0x24C49893,
+ 0x2504A094, 0x2544A895, 0x2584B096, 0x25C4B897,
+ 0x2604C098, 0x2644C899, 0x2684D09A, 0x26C4D89B,
+ 0x2704E09C, 0x2744E89D, 0x2784F09E, 0x27C4F89F,
+ 0x280500A0, 0x284508A1, 0x288510A2, 0x28C518A3,
+ 0x290520A4, 0x294528A5, 0x298530A6, 0x29C538A7,
+ 0x2A0540A8, 0x2A4548A9, 0x2A8550AA, 0x2AC558AB,
+ 0x2B0560AC, 0x2B4568AD, 0x2B8570AE, 0x2BC578AF,
+ 0x2C0580B0, 0x2C4588B1, 0x2C8590B2, 0x2CC598B3,
+ 0x2D05A0B4, 0x2D45A8B5, 0x2D85B0B6, 0x2DC5B8B7,
+ 0x2E05C0B8, 0x2E45C8B9, 0x2E85D0BA, 0x2EC5D8BB,
+ 0x2F05E0BC, 0x2F45E8BD, 0x2F85F0BE, 0x2FC5F8BF,
+ 0x300600C0, 0x304608C1, 0x308610C2, 0x30C618C3,
+ 0x310620C4, 0x314628C5, 0x318630C6, 0x31C638C7,
+ 0x320640C8, 0x324648C9, 0x328650CA, 0x32C658CB,
+ 0x330660CC, 0x334668CD, 0x338670CE, 0x33C678CF,
+ 0x340680D0, 0x344688D1, 0x348690D2, 0x34C698D3,
+ 0x3506A0D4, 0x3546A8D5, 0x3586B0D6, 0x35C6B8D7,
+ 0x3606C0D8, 0x3646C8D9, 0x3686D0DA, 0x36C6D8DB,
+ 0x3706E0DC, 0x3746E8DD, 0x3786F0DE, 0x37C6F8DF,
+ 0x380700E0, 0x384708E1, 0x388710E2, 0x38C718E3,
+ 0x390720E4, 0x394728E5, 0x398730E6, 0x39C738E7,
+ 0x3A0740E8, 0x3A4748E9, 0x3A8750EA, 0x3AC758EB,
+ 0x3B0760EC, 0x3B4768ED, 0x3B8770EE, 0x3BC778EF,
+ 0x3C0780F0, 0x3C4788F1, 0x3C8790F2, 0x3CC798F3,
+ 0x3D07A0F4, 0x3D47A8F5, 0x3D87B0F6, 0x3DC7B8F7,
+ 0x3E07C0F8, 0x3E47C8F9, 0x3E87D0FA, 0x3EC7D8FB,
+ 0x3F07E0FC, 0x3F47E8FD, 0x3F87F0FE, 0x3FC7F8FF
+ };
+
+// Chroma1 (Cb)
+static const TUint32 KCbLut[ 256 ] =
+ {
+ 0x0001531C, 0x00014B1E, 0x00014B20, 0x00014B22,
+ 0x00014324, 0x00014325, 0x00014327, 0x00013B29,
+ 0x00013B2B, 0x00013B2D, 0x0001332E, 0x00013330,
+ 0x00013332, 0x00012B34, 0x00012B35, 0x00012B37,
+ 0x00012339, 0x0001233B, 0x0001233D, 0x00011B3E,
+ 0x00011B40, 0x00011B42, 0x00011344, 0x00011345,
+ 0x00011347, 0x00010B49, 0x00010B4B, 0x00010B4D,
+ 0x0001034E, 0x00010350, 0x00010352, 0x0000FB54,
+ 0x0000FB55, 0x0000FB57, 0x0000F359, 0x0000F35B,
+ 0x0000F35D, 0x0000EB5E, 0x0000EB60, 0x0000EB62,
+ 0x0000E364, 0x0000E366, 0x0000E367, 0x0000DB69,
+ 0x0000DB6B, 0x0000DB6D, 0x0000D36E, 0x0000D370,
+ 0x0000D372, 0x0000CB74, 0x0000CB76, 0x0000CB77,
+ 0x0000C379, 0x0000C37B, 0x0000C37D, 0x0000BB7E,
+ 0x0000BB80, 0x0000BB82, 0x0000B384, 0x0000B386,
+ 0x0000B387, 0x0000AB89, 0x0000AB8B, 0x0000AB8D,
+ 0x0000AB8E, 0x0000A390, 0x0000A392, 0x0000A394,
+ 0x00009B96, 0x00009B97, 0x00009B99, 0x0000939B,
+ 0x0000939D, 0x0000939F, 0x00008BA0, 0x00008BA2,
+ 0x00008BA4, 0x000083A6, 0x000083A7, 0x000083A9,
+ 0x00007BAB, 0x00007BAD, 0x00007BAF, 0x000073B0,
+ 0x000073B2, 0x000073B4, 0x00006BB6, 0x00006BB7,
+ 0x00006BB9, 0x000063BB, 0x000063BD, 0x000063BF,
+ 0x00005BC0, 0x00005BC2, 0x00005BC4, 0x000053C6,
+ 0x000053C7, 0x000053C9, 0x00004BCB, 0x00004BCD,
+ 0x00004BCF, 0x000043D0, 0x000043D2, 0x000043D4,
+ 0x00003BD6, 0x00003BD8, 0x00003BD9, 0x000033DB,
+ 0x000033DD, 0x000033DF, 0x00002BE0, 0x00002BE2,
+ 0x00002BE4, 0x000023E6, 0x000023E8, 0x000023E9,
+ 0x00001BEB, 0x00001BED, 0x00001BEF, 0x000013F0,
+ 0x000013F2, 0x000013F4, 0x00000BF6, 0x00000BF8,
+ 0x00000BF9, 0x000003FB, 0x000003FD, 0x000003FF,
+ 0x00000000, 0x00000001, 0x00000003, 0x00000005,
+ 0x001FF807, 0x001FF808, 0x001FF80A, 0x001FF00C,
+ 0x001FF00E, 0x001FF010, 0x001FE811, 0x001FE813,
+ 0x001FE815, 0x001FE017, 0x001FE018, 0x001FE01A,
+ 0x001FD81C, 0x001FD81E, 0x001FD820, 0x001FD021,
+ 0x001FD023, 0x001FD025, 0x001FC827, 0x001FC828,
+ 0x001FC82A, 0x001FC02C, 0x001FC02E, 0x001FC030,
+ 0x001FB831, 0x001FB833, 0x001FB835, 0x001FB037,
+ 0x001FB039, 0x001FB03A, 0x001FA83C, 0x001FA83E,
+ 0x001FA840, 0x001FA041, 0x001FA043, 0x001FA045,
+ 0x001F9847, 0x001F9849, 0x001F984A, 0x001F904C,
+ 0x001F904E, 0x001F9050, 0x001F8851, 0x001F8853,
+ 0x001F8855, 0x001F8057, 0x001F8059, 0x001F805A,
+ 0x001F785C, 0x001F785E, 0x001F7860, 0x001F7061,
+ 0x001F7063, 0x001F7065, 0x001F6867, 0x001F6869,
+ 0x001F686A, 0x001F606C, 0x001F606E, 0x001F6070,
+ 0x001F5872, 0x001F5873, 0x001F5875, 0x001F5877,
+ 0x001F5079, 0x001F507A, 0x001F507C, 0x001F487E,
+ 0x001F4880, 0x001F4882, 0x001F4083, 0x001F4085,
+ 0x001F4087, 0x001F3889, 0x001F388A, 0x001F388C,
+ 0x001F308E, 0x001F3090, 0x001F3092, 0x001F2893,
+ 0x001F2895, 0x001F2897, 0x001F2099, 0x001F209A,
+ 0x001F209C, 0x001F189E, 0x001F18A0, 0x001F18A2,
+ 0x001F10A3, 0x001F10A5, 0x001F10A7, 0x001F08A9,
+ 0x001F08AB, 0x001F08AC, 0x001F00AE, 0x001F00B0,
+ 0x001F00B2, 0x001EF8B3, 0x001EF8B5, 0x001EF8B7,
+ 0x001EF0B9, 0x001EF0BB, 0x001EF0BC, 0x001EE8BE,
+ 0x001EE8C0, 0x001EE8C2, 0x001EE0C3, 0x001EE0C5,
+ 0x001EE0C7, 0x001ED8C9, 0x001ED8CB, 0x001ED8CC,
+ 0x001ED0CE, 0x001ED0D0, 0x001ED0D2, 0x001EC8D3,
+ 0x001EC8D5, 0x001EC8D7, 0x001EC0D9, 0x001EC0DB,
+ 0x001EC0DC, 0x001EB8DE, 0x001EB8E0, 0x001EB8E2
+ };
+
+// Chroma1 (Cr)
+static const TUint32 KCrLut[ 256 ] =
+ {
+ 0xD302D000, 0xD382C800, 0xD3C2C000, 0xD442B800,
+ 0xD482B800, 0xD502B000, 0xD542A800, 0xD582A800,
+ 0xD602A000, 0xD6429800, 0xD6C29000, 0xD7029000,
+ 0xD7428800, 0xD7C28000, 0xD8028000, 0xD8827800,
+ 0xD8C27000, 0xD9027000, 0xD9826800, 0xD9C26000,
+ 0xDA425800, 0xDA825800, 0xDAC25000, 0xDB424800,
+ 0xDB824800, 0xDC024000, 0xDC423800, 0xDC823800,
+ 0xDD023000, 0xDD422800, 0xDDC22000, 0xDE022000,
+ 0xDE421800, 0xDEC21000, 0xDF021000, 0xDF820800,
+ 0xDFC20000, 0xE041F800, 0xE081F800, 0xE0C1F000,
+ 0xE141E800, 0xE181E800, 0xE201E000, 0xE241D800,
+ 0xE281D800, 0xE301D000, 0xE341C800, 0xE3C1C000,
+ 0xE401C000, 0xE441B800, 0xE4C1B000, 0xE501B000,
+ 0xE581A800, 0xE5C1A000, 0xE601A000, 0xE6819800,
+ 0xE6C19000, 0xE7418800, 0xE7818800, 0xE7C18000,
+ 0xE8417800, 0xE8817800, 0xE9017000, 0xE9416800,
+ 0xE9816800, 0xEA016000, 0xEA415800, 0xEAC15000,
+ 0xEB015000, 0xEB814800, 0xEBC14000, 0xEC014000,
+ 0xEC813800, 0xECC13000, 0xED412800, 0xED812800,
+ 0xEDC12000, 0xEE411800, 0xEE811800, 0xEF011000,
+ 0xEF410800, 0xEF810800, 0xF0010000, 0xF040F800,
+ 0xF0C0F000, 0xF100F000, 0xF140E800, 0xF1C0E000,
+ 0xF200E000, 0xF280D800, 0xF2C0D000, 0xF300D000,
+ 0xF380C800, 0xF3C0C000, 0xF440B800, 0xF480B800,
+ 0xF4C0B000, 0xF540A800, 0xF580A800, 0xF600A000,
+ 0xF6409800, 0xF6C09000, 0xF7009000, 0xF7408800,
+ 0xF7C08000, 0xF8008000, 0xF8807800, 0xF8C07000,
+ 0xF9007000, 0xF9806800, 0xF9C06000, 0xFA405800,
+ 0xFA805800, 0xFAC05000, 0xFB404800, 0xFB804800,
+ 0xFC004000, 0xFC403800, 0xFC803800, 0xFD003000,
+ 0xFD402800, 0xFDC02000, 0xFE002000, 0xFE401800,
+ 0xFEC01000, 0xFF001000, 0xFF800800, 0xFFC00000,
+ 0x00000000, 0x00400000, 0x009FF800, 0x011FF000,
+ 0x015FF000, 0x01DFE800, 0x021FE000, 0x025FE000,
+ 0x02DFD800, 0x031FD000, 0x039FC800, 0x03DFC800,
+ 0x041FC000, 0x049FB800, 0x04DFB800, 0x055FB000,
+ 0x059FA800, 0x05DFA800, 0x065FA000, 0x069F9800,
+ 0x071F9000, 0x075F9000, 0x079F8800, 0x081F8000,
+ 0x085F8000, 0x08DF7800, 0x091F7000, 0x095F7000,
+ 0x09DF6800, 0x0A1F6000, 0x0A9F5800, 0x0ADF5800,
+ 0x0B5F5000, 0x0B9F4800, 0x0BDF4800, 0x0C5F4000,
+ 0x0C9F3800, 0x0D1F3000, 0x0D5F3000, 0x0D9F2800,
+ 0x0E1F2000, 0x0E5F2000, 0x0EDF1800, 0x0F1F1000,
+ 0x0F5F1000, 0x0FDF0800, 0x101F0000, 0x109EF800,
+ 0x10DEF800, 0x111EF000, 0x119EE800, 0x11DEE800,
+ 0x125EE000, 0x129ED800, 0x12DED800, 0x135ED000,
+ 0x139EC800, 0x141EC000, 0x145EC000, 0x149EB800,
+ 0x151EB000, 0x155EB000, 0x15DEA800, 0x161EA000,
+ 0x169E9800, 0x16DE9800, 0x171E9000, 0x179E8800,
+ 0x17DE8800, 0x185E8000, 0x189E7800, 0x18DE7800,
+ 0x195E7000, 0x199E6800, 0x1A1E6000, 0x1A5E6000,
+ 0x1A9E5800, 0x1B1E5000, 0x1B5E5000, 0x1BDE4800,
+ 0x1C1E4000, 0x1C5E4000, 0x1CDE3800, 0x1D1E3000,
+ 0x1D9E2800, 0x1DDE2800, 0x1E1E2000, 0x1E9E1800,
+ 0x1EDE1800, 0x1F5E1000, 0x1F9E0800, 0x1FDE0800,
+ 0x205E0000, 0x209DF800, 0x211DF000, 0x215DF000,
+ 0x21DDE800, 0x221DE000, 0x225DE000, 0x22DDD800,
+ 0x231DD000, 0x239DC800, 0x23DDC800, 0x241DC000,
+ 0x249DB800, 0x24DDB800, 0x255DB000, 0x259DA800,
+ 0x25DDA800, 0x265DA000, 0x269D9800, 0x271D9000,
+ 0x275D9000, 0x279D8800, 0x281D8000, 0x285D8000,
+ 0x28DD7800, 0x291D7000, 0x295D7000, 0x29DD6800,
+ 0x2A1D6000, 0x2A9D5800, 0x2ADD5800, 0x2B1D5000,
+ 0x2B9D4800, 0x2BDD4800, 0x2C5D4000, 0x2C9D3800
+ };
+
+
+// Posting surface factory DLL's name
+_LIT( KDPAPIDLLName, "PostingSurfaceFactory.dll" );
+
+// Reversed enumeration for the bitmaps.
+static const MDisplaySink::TBitmapNo KVtEngBitmapNoReversed[] =
+ {
+ MDisplaySink::ESecondBitmap,
+ MDisplaySink::EFirstBitmap
+ };
+
+// Default posting format (if this or KDefaultPostingFormat420 is not
+// supported, BaseConstructL() will leave with KErrNotSupported)
+const CPostingSurface::TPostingFormat KDefaultPostingFormat422 =
+ CPostingSurface::EYuv422LeBt601Range0;
+
+// Default posting format (if this or KDefaultPostingFormat422 is not
+// supported, BaseConstructL() will leave with KErrNotSupported)
+const CPostingSurface::TPostingFormat KDefaultPostingFormat420 =
+ CPostingSurface::EYuv420PlanarBt601Range0;
+
+// Default posting buffering flags.
+const TUint KDefaultPostingBufferingFlags =
+ // Double buffering
+ CPostingSurface::EDoubleBuffering |
+ // Progressive frames (no interlacing)
+ CPostingSurface::EProgressiveFrames |
+ // Do not allow frameskip
+ CPostingSurface::EDisAllowFrameSkip |
+ // Use internal buffers (allocated by DP)
+ CPostingSurface::EInternalBuffers;
+
+// Default pixel aspect ratio num. Aspect ratio = Num/Denom.
+const TUint16 KDefaultPixelAspectRatioNum = 1;
+
+// Default pixel aspect ratio denom. Aspect ratio = Num/Denom.
+const TUint16 KDefaultPixelAspectRatioDenom = 1;
+
+// LOCAL METHODS
+
+// -----------------------------------------------------------------------------
+// DoConvertYuv420toXRGB0888
+// -----------------------------------------------------------------------------
+//
+inline void DoConvertYuv420toXRGB0888(
+ TInt aWidth, // width in pixels
+ const TUint8*& aSourceDataPtrY1, // pointer to Y data row 1
+ const TUint8*& aSourceDataPtrY2, // pointer to Y data row 2
+ const TUint8*& aSourceDataPtrU, // pointer to U data row
+ const TUint8*& aSourceDataPtrV, // pointer to V data row
+ TUint8* aDestDataPtr1, // pointer to destination row 1
+ TUint8* aDestDataPtr2 // pointer to destination row 2
+ )
+ {
+ TUint32* destDataPtr1 = reinterpret_cast< TUint32* >( aDestDataPtr1 );
+ TUint32* destDataPtr2 = reinterpret_cast< TUint32* >( aDestDataPtr2 );
+ // width assumed to be even
+ TInt pixelsLeft = aWidth / 2;
+
+ TUint32 r, g, b;
+ TUint32 LutY0, LutY1, LutC;
+ TUint32 pixel;
+ TUint32 OverflowMask = 0xC0180300U;
+
+ // One scanline at the time
+ while ( pixelsLeft-- )
+ {
+
+ // row 1, 2 pixels
+
+ LutY0 = KYLut[*aSourceDataPtrY1++];
+ LutY1 = KYLut[*aSourceDataPtrY1++];
+ LutC = KCbLut[*aSourceDataPtrU++];
+ LutC += KCrLut[*aSourceDataPtrV++];
+
+ pixel = LutY0 + LutC;
+
+ if (pixel & OverflowMask)
+ {
+ if (pixel & 0xC0000000U)
+ {
+ if (pixel & 0x80000000U)
+ {
+ pixel &= ~0x3FC00000U;
+ }
+ else
+ {
+ pixel |= 0x3FC00000U;
+ }
+ }
+ if (pixel & 0x00180000U)
+ {
+ if (pixel & 0x00100000U)
+ {
+ pixel &= ~0x0007F800U;
+ }
+ else
+ {
+ pixel |= 0x0007F800U;
+ }
+ }
+ if (pixel & 0x00000300U)
+ {
+ if (pixel & 0x00000200U)
+ {
+ pixel &= ~0x000000FFU;
+ }
+ else
+ {
+ pixel |= 0x000000FFU;
+ }
+ }
+ }
+
+ r = (pixel >> 6) & 0xFF0000;
+ g = (pixel >> 3) & 0x00FF00;
+ b = pixel & 0x0000FF;
+
+ *destDataPtr1++ = 0xFF000000 | r | g | b;
+
+ pixel = LutY1 + LutC;
+
+ if (pixel & OverflowMask)
+ {
+ if (pixel & 0xC0000000U)
+ {
+ if (pixel & 0x80000000U)
+ {
+ pixel &= ~0x3FC00000U;
+ }
+ else
+ {
+ pixel |= 0x3FC00000U;
+ }
+ }
+ if (pixel & 0x00180000U)
+ {
+ if (pixel & 0x00100000U)
+ {
+ pixel &= ~0x0007F800U;
+ }
+ else
+ {
+ pixel |= 0x0007F800U;
+ }
+ }
+ if (pixel & 0x00000300U)
+ {
+ if (pixel & 0x00000200U)
+ {
+ pixel &= ~0x000000FFU;
+ }
+ else
+ {
+ pixel |= 0x000000FFU;
+ }
+ }
+ }
+
+ r = (pixel >> 6) & 0xFF0000;
+ g = (pixel >> 3) & 0x00FF00;
+ b = pixel & 0x0000FF;
+
+ *destDataPtr1++ = 0xFF000000 | r | g | b;
+
+ // row, 2 pixels
+
+ LutY0 = KYLut[*aSourceDataPtrY2++];
+ LutY1 = KYLut[*aSourceDataPtrY2++];
+
+ pixel = LutY0 + LutC;
+
+ if (pixel & OverflowMask)
+ {
+ if (pixel & 0xC0000000U)
+ {
+ if (pixel & 0x80000000U)
+ {
+ pixel &= ~0x3FC00000U;
+ }
+ else
+ {
+ pixel |= 0x3FC00000U;
+ }
+ }
+ if (pixel & 0x00180000U)
+ {
+ if (pixel & 0x00100000U)
+ {
+ pixel &= ~0x0007F800U;
+ }
+ else
+ {
+ pixel |= 0x0007F800U;
+ }
+ }
+ if (pixel & 0x00000300U)
+ {
+ if (pixel & 0x00000200U)
+ {
+ pixel &= ~0x000000FFU;
+ }
+ else
+ {
+ pixel |= 0x000000FFU;
+ }
+ }
+ }
+
+ r = (pixel >> 6) & 0xFF0000;
+ g = (pixel >> 3) & 0x00FF00;
+ b = pixel & 0x0000FF;
+
+ *destDataPtr2++ = 0xFF000000 | r | g | b;
+
+ pixel = LutY1 + LutC;
+
+ if (pixel & OverflowMask)
+ {
+ if (pixel & 0xC0000000U)
+ {
+ if (pixel & 0x80000000U)
+ {
+ pixel &= ~0x3FC00000U;
+ }
+ else
+ {
+ pixel |= 0x3FC00000U;
+ }
+ }
+ if (pixel & 0x00180000U)
+ {
+ if (pixel & 0x00100000U)
+ {
+ pixel &= ~0x0007F800U;
+ }
+ else
+ {
+ pixel |= 0x0007F800U;
+ }
+ }
+ if (pixel & 0x00000300U)
+ {
+ if (pixel & 0x00000200U)
+ {
+ pixel &= ~0x000000FFU;
+ }
+ else
+ {
+ pixel |= 0x000000FFU;
+ }
+ }
+ }
+
+ r = (pixel >> 6) & 0xFF0000;
+ g = (pixel >> 3) & 0x00FF00;
+ b = pixel & 0x0000FF;
+
+ *destDataPtr2++ = 0xFF000000 | r | g | b;
+
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// DoConvertYuv422toXRGB0888
+// -----------------------------------------------------------------------------
+//
+inline void DoConvertYuv422toXRGB0888(
+ TInt aWidth, // width in pixels
+ const TUint8*& aSourceDataPtr, // pointer to source row
+ TUint8* aDestDataPtr // pointer to destination row
+ )
+ {
+ TUint32* destDataPtr = reinterpret_cast< TUint32* >( aDestDataPtr );
+ // width assumed to be even
+ TInt pixelsLeft = aWidth / 2;
+
+ TUint32 r, g, b;
+ TUint32 LutY0, LutY1, LutC;
+ TUint32 pixel;
+ TUint32 OverflowMask = 0xC0180300U;
+
+ // One scanline at the time
+ while ( pixelsLeft-- )
+ {
+
+ LutC = KCbLut[*aSourceDataPtr++];
+ LutY0 = KYLut[*aSourceDataPtr++];
+ LutC += KCrLut[*aSourceDataPtr++];
+ LutY1 = KYLut[*aSourceDataPtr++];
+
+ pixel = LutY0 + LutC;
+
+ if (pixel & OverflowMask)
+ {
+ if (pixel & 0xC0000000U)
+ {
+ if (pixel & 0x80000000U)
+ {
+ pixel &= ~0x3FC00000U;
+ }
+ else
+ {
+ pixel |= 0x3FC00000U;
+ }
+ }
+ if (pixel & 0x00180000U)
+ {
+ if (pixel & 0x00100000U)
+ {
+ pixel &= ~0x0007F800U;
+ }
+ else
+ {
+ pixel |= 0x0007F800U;
+ }
+ }
+ if (pixel & 0x00000300U)
+ {
+ if (pixel & 0x00000200U)
+ {
+ pixel &= ~0x000000FFU;
+ }
+ else
+ {
+ pixel |= 0x000000FFU;
+ }
+ }
+ }
+
+ r = (pixel >> 6) & 0xFF0000;
+ g = (pixel >> 3) & 0x00FF00;
+ b = pixel & 0x0000FF;
+
+ *destDataPtr++ = 0xFF000000 | r | g | b;
+
+ pixel = LutY1 + LutC;
+
+ if (pixel & OverflowMask)
+ {
+ if (pixel & 0xC0000000U)
+ {
+ if (pixel & 0x80000000U)
+ {
+ pixel &= ~0x3FC00000U;
+ }
+ else
+ {
+ pixel |= 0x3FC00000U;
+ }
+ }
+ if (pixel & 0x00180000U)
+ {
+ if (pixel & 0x00100000U)
+ {
+ pixel &= ~0x0007F800U;
+ }
+ else
+ {
+ pixel |= 0x0007F800U;
+ }
+ }
+ if (pixel & 0x00000300U)
+ {
+ if (pixel & 0x00000200U)
+ {
+ pixel &= ~0x000000FFU;
+ }
+ else
+ {
+ pixel |= 0x000000FFU;
+ }
+ }
+ }
+
+ r = (pixel >> 6) & 0xFF0000;
+ g = (pixel >> 3) & 0x00FF00;
+ b = pixel & 0x0000FF;
+
+ *destDataPtr++ = 0xFF000000 | r | g | b;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::NewL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+CVtEngDrawDP* CVtEngDrawDP::NewL(
+ MDisplaySinkObserver* aObserver )
+ {
+ __VTPRINTENTER( "RVD(DP).NewL" )
+ CVtEngDrawDP* self = new ( ELeave ) CVtEngDrawDP( aObserver );
+ CleanupStack::PushL( self );
+ self->ConstructL( );
+ CleanupStack::Pop();
+ __VTPRINTEXIT( "RVD(DP).NewL" )
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::~CVtEngDrawDP
+// Destructor. Cannot leave.
+// -----------------------------------------------------------------------------
+//
+CVtEngDrawDP::~CVtEngDrawDP()
+ {
+ __VTPRINTENTER( "RVD(DP).~" )
+ Cancel();
+ delete iFrameBuffer;
+ delete iBufferWaiter;
+ delete iPostingSurface;
+ __VTPRINT( DEBUG_MEDIA , "RVD(DP).~ RRegion::Close()" )
+ iClipRegion.Close();
+ CloseDPLibrary();
+
+ delete iTarget;
+ delete iSource;
+ delete iImageScaler;
+ __VTPRINTEXIT( "RVD(DP).~" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::CVtEngDraw
+// C++ constructor. Cannot leave.
+// -----------------------------------------------------------------------------
+//
+CVtEngDrawDP::CVtEngDrawDP( MDisplaySinkObserver* aObserver ) :
+ CVtEngDraw( aObserver ), iClipRegion( 1 ),
+ iPostingFormat( KDefaultPostingFormat422 )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::BaseConstructL
+// Base construction.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::BaseConstructL()
+ {
+ __VTPRINTENTER( "RVD(DP).BaseConstructL" )
+ if ( IsFlag( EFlagUIForeground ) )
+ {
+ DoBaseConstructL();
+ }
+ else
+ {
+ SetFlag( EBaseConstructCalled );
+ }
+ __VTPRINTEXIT( "RVD(DP).BaseConstructL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::CreateSinkL
+// Instantiates display sink.
+// -----------------------------------------------------------------------------
+//
+MDisplaySink* CVtEngDrawDP::CreateSinkL()
+ {
+ __VTPRINTENTER( "RVD(DP).CreateSinkL" )
+ TDisplaySinkParamsDP params;
+ GetSinkParams( params );
+ MDisplaySink* sink = ::CreateSinkL( params, KNullDesC8 );
+ if ( IsFlag( EBaseConstructCalled ) )
+ {
+ sink->Pause();
+ SetFlag( ESinkParamUpdateRequired | ESinkResumeRequired );
+ }
+ __VTPRINTEXIT( "RVD(DP).CreateSinkL" )
+ return sink;
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngRemoteVideo::CVtEngDraw::BaseRefreshL
+// Draw a frame.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::BaseRefreshL()
+ {
+ __VTPRINTENTER( "RVD(DP).BaseRefreshL" )
+ __VTPRINTEXIT( "RVD(DP).BaseRefreshL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::BaseRefreshBitmapsL
+// Refreshes bitmaps sizes and display mode if needed.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::BaseRefreshBitmapsL()
+ {
+ __VTPRINTENTER( "RVD(DP).BaseRefreshBitmapsL" )
+ BaseConstructL();
+ InitializePostingSurfaceL();
+ // set the params for DS
+ UpdateSinkParamsL();
+ ClearFlag( EFirstFrameReceived );
+ __VTPRINTEXIT( "RVD(DP).BaseRefreshBitmapsL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::BaseDoCancel
+// DoCancel for derived class.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::BaseDoCancel()
+ {
+ __VTPRINTENTER( "RVD(DP).BaseDoCancel" )
+ __VTPRINTEXIT( "RVD(DP).BaseDoCancel" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::BaseVerifyConfigL
+// Checks current configuration against DP implementation.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::BaseVerifyConfigL()
+ {
+ __VTPRINTENTER( "RVD(DP).BaseVerifyConfigL" )
+ // Check support for requested size
+ if ( !SupportsSize( iSourceSize ) )
+ {
+ __VTPRINT( DEBUG_MEDIA ,
+ "RVD(DP).BaseVerifyConfigL Size NOT supported" )
+ User::Leave( KErrNotSupported );
+ }
+ RecalculateClipRegionL();
+ __VTPRINTEXIT( "RVD(DP).BaseVerifyConfigL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::BaseRestartL
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::BaseRestartL()
+ {
+ __VTPRINTENTER( "RVD(DP).BaseRestartL" )
+ if ( IsFlag( EFlagUIForeground ) )
+ {
+ RecalculateClipRegionL();
+ iBufferWaiter->FetchBuffer();
+ }
+ __VTPRINTEXIT( "RVD(DP).BaseRestartL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::BaseAbortNow
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::BaseAbortNow()
+ {
+ __VTPRINTENTER( "RVD(DP).BaseAbortNow" )
+ UpdateVtFrame();
+ __VTPRINTEXIT( "RVD(DP).BaseAbortNow" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::StartDrawL
+// Starts the drawing.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::BaseStartDrawL()
+ {
+ __VTPRINTENTER( "RVD(DP).BaseStartDrawL" )
+ if ( IsFlag( EBaseConstructCalled ) )
+ {
+ SetFlag( EBaseBaseStartDrawCalled );
+ }
+ else
+ {
+ DoBaseStartDrawL();
+ }
+ __VTPRINTEXIT( "RVD(DP).BaseStartDrawL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::BaseStopDraw
+// Stop the drawing.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::BaseStopDraw()
+ {
+ // Cancel the timer in any case.
+ __VTPRINTENTER( "RVD(DP).BaseStopDraw" )
+ ClearFlag( EBaseBaseStartDrawCalled );
+ iWatcher->Cancel();
+ if ( iDSA )
+ {
+ ClearFlag( ERemoteVideoDrawing | EStarted );
+ iDSA->Cancel();
+ }
+ iBufferWaiter->Cancel();
+ Cancel();
+ __VTPRINTEXIT( "RVD(DP).BaseStopDraw" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::BaseSetConfigL
+// Sets new configuration.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::BaseSetConfigL( const TVtEngRenderConfig& aConfig )
+ {
+ __VTPRINTENTER( "RVD(DP).BaseSetConfigL" )
+ Mem::FillZ( &iConfig, sizeof( TVtEngRenderConfigDP ) );
+ iConfig = aConfig;
+ if ( IsFlag( EBaseConstructCalled ) )
+ {
+ SetFlag( EBaseSetConfigCalled );
+ }
+ else
+ {
+ ConfigUpdatedL();
+ }
+ __VTPRINTEXIT( "RVD(DP).BaseSetConfigL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::BaseSetUIForegroundL
+// Sets UI foreground status.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::BaseSetUIForegroundL( TBool aForeground )
+ {
+ __VTPRINTENTER( "RVD(DP).BaseSetUIForegroundL" )
+ if( aForeground )
+ {
+ TBool wasSentToBackground( IsFlag( ESentToBackground ) );
+ SetFlag( EFlagUIForeground );
+ ClearFlag( ESentToBackground );
+ if( IsFlag( EDelayedCallsMask ) )
+ {
+ HandleDelayedCallsL();
+ }
+ if ( wasSentToBackground )
+ {
+ BaseRefreshBitmapsL();
+ Restart( RDirectScreenAccess::ETerminateCancel );
+ BaseStartDrawL();
+ }
+ }
+ else
+ {
+ if ( !IsFlag( EBaseConstructCalled ) )
+ {
+ BaseStopDraw();
+ delete iPostingSurface;
+ iPostingSurface = 0;
+ for ( TInt i = MDisplaySink::EFirstBitmap;
+ i < MDisplaySink::EFirstBitmap + KVtEngMaxBuffers; i++ )
+ {
+ iBuffers[ i ].UnSet();
+ }
+ SetFlag( ESentToBackground );
+ }
+ ClearFlag( EFlagUIForeground );
+ }
+ __VTPRINTEXIT( "RVD(DP).BaseSetUIForegroundL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::BaseRequestLastFrame
+// Request update last remote video frame through MVtEngFrameObserver::vtSetFrame
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::BaseRequestLastFrame()
+ {
+ __VTPRINTENTER( "RVD(DP).BaseRequestLastFrame" )
+ UpdateVtFrame();
+ __VTPRINTEXIT( "RVD(DP).BaseRequestLastFrame" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::BaseVideoFrameSizeChangedL
+// Called when incoming frame buffer size changes.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::BaseVideoFrameSizeChangedL( const TSize& aTo )
+ {
+ __VTPRINTENTER( "RVD(DP).BaseVideoFrameSizeChangedL" )
+ CreateFrameBufferL( aTo );
+ __VTPRINTEXIT( "RVD(DP).BaseVideoFrameSizeChangedL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::Config
+// Returns current configuration.
+// -----------------------------------------------------------------------------
+//
+TVtEngRenderConfig& CVtEngDrawDP::Config()
+ {
+ return iConfig;
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::RunL
+// CActive heir execution method.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::RunL()
+ {
+ __VTPRINTENTER( "RVD(DP).RunL" )
+
+ TInt bitmapNo( iStatus.Int() );
+
+ if ( bitmapNo < KErrNone )
+ {
+ __VTPRINT( DEBUG_MEDIA, "RVD(DP).RunL notify rvd problem" )
+ CVtEngEventManager::NotifyEvent( KVtEngRemoteRenderingProblem );
+ return;
+ }
+
+ TVtEngBuffer& buffer = iBuffers[ bitmapNo ];
+
+ if ( !iDSUpdated )
+ {
+ __VTPRINT( DEBUG_MEDIA, "RVD(DP).RunL !Updated" )
+ __VTPRINTEXIT( "RVD(DP).RunL" )
+ return;
+ }
+ else if ( !IsFlag( EFlagUIForeground ) )
+ {
+ __VTPRINT( DEBUG_MEDIA, "RVD(DP).RunL !Flag( EFlagUIForeground )" )
+ __VTPRINTEXIT( "RVD(DP).RunL" )
+ if ( iPostingSurface )
+ {
+ iPostingSurface->PostBuffer( buffer.Buffer() );
+ buffer.UnSet();
+ iBufferWaiter->FetchBuffer();
+ }
+ return;
+ }
+ else if ( buffer.Buffer() == NULL )
+ {
+ __VTPRINT( DEBUG_MEDIA, "RVD(DP).RunL signalled with NULL buffer" )
+ TInt result( iBufferWaiter->FetchBuffer() );
+ __VTPRINT2( DEBUG_MEDIA,
+ "RVD(DP).RunL FetchBuffer %d", result )
+ User::LeaveIfError( result );
+ __VTPRINTEXIT( "RVD(DP).RunL" )
+ return;
+ }
+
+ // Image received, reset counter.
+ iCheckpoint = KVtEngWatcherThreshold;
+
+ StoreFrameBuffer( buffer.Buffer() );
+ __VTPRINT2( DEBUG_MEDIA, "RVD(DP).RunL flags=%d", iFlags )
+ TBool firstFrame( !IsFlag ( EFirstFrameReceived ) );
+ SetFlag( EFirstFrameReceived );
+ // Remote video is about to start?
+ if ( !IsFlag( EStarted ) && IsFlag( EReadyInternal ) )
+ {
+ if ( !iDSA->IsActive() )
+ {
+ iDSA->StartL();
+ }
+ SetFlag( EStarted );
+ if ( !iConfig.iClipRect.IsEmpty() )
+ {
+ SetFlag( EReadyForeground );
+ iDSA->Gc()->SetClippingRect( iConfig.iClipRect );
+ RecalculateClipRegionL();
+ }
+ __VTPRINT( DEBUG_MEDIA, "RVD(DP).RunL notify rvd start" )
+ //CVtEngEventManager::NotifyEvent( KVtEngRemoteVideoStarted );
+ }
+ if ( firstFrame )
+ {
+ CVtEngEventManager::NotifyEvent( KVtEngRemoteVideoStarted );
+ }
+ TRAPD( setClipRegResult, SetClipRegionL() );
+ if ( setClipRegResult )
+ {
+ __VTPRINT2( DEBUG_MEDIA, "RVD(DP).RunL SetClipRegionL failed %d",
+ setClipRegResult );
+ }
+ __VTPRINT3( DEBUG_MEDIA, "RVD(DP).RunL received buffer %d $%x",
+ bitmapNo,
+ reinterpret_cast< TUint >( buffer.Buffer() ) )
+ TInt result
+ ( iPostingSurface->PostBuffer( buffer.Buffer() ) );
+ __VTPRINT2( DEBUG_MEDIA, "RVD(DP).RunL PostBuffer %d", result )
+ buffer.UnSet();
+ if ( iBuffers[ KVtEngBitmapNoReversed[ bitmapNo ] ].IsSet() )
+ {
+ __VTPRINT2( DEBUG_MEDIA, "RVD(DP).RunL reactivating for buffer %d",
+ KVtEngBitmapNoReversed[ bitmapNo ] )
+ Activate();
+ DisplaySink().NextFrame();
+ }
+
+ if ( result == KErrNotReady )
+ {
+ BaseRefreshBitmapsL();
+ result = KErrNone;
+ }
+
+ User::LeaveIfError( result );
+ result = iBufferWaiter->FetchBuffer();
+ __VTPRINT2( DEBUG_MEDIA,
+ "RVD(DP).RunL FetchBuffer %d", result )
+ User::LeaveIfError( result );
+
+ __VTPRINTEXIT( "RVD(DP).RunL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::BufferReady
+// BufferReady
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::BufferReady( CPostingSurface::TPostingBuff* aBuffer )
+ {
+ __VTPRINTENTER( "RVD(DP).BufferReady" )
+ SetAvailableToSink( aBuffer );
+ __VTPRINTEXIT( "RVD(DP).BufferReady" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::FetchError
+// Buffer fetching error
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::FetchError( TInt )
+ {
+ __VTPRINTENTER( "RVD(DP).FetchError" )
+ CVtEngEventManager::NotifyEvent( KVtEngRemoteRenderingProblem );
+ __VTPRINTEXIT( "RVD(DP).FetchError" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::HandleDelayedCallsL
+//
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::HandleDelayedCallsL()
+ {
+ __VTPRINTENTER( "RVD(DP).HandleDelayedCallsL" )
+ if ( IsFlag( EBaseConstructCalled ) )
+ {
+ DoBaseConstructL();
+ }
+ if ( IsFlag( EBaseSetConfigCalled ) )
+ {
+ ConfigUpdatedL();
+ ClearFlag( EBaseSetConfigCalled );
+ }
+ if ( IsFlag( EInitializePostingSurfaceCalled ) )
+ {
+ DoInitializePostingSurfaceL();
+ }
+ if ( IsFlag( ESinkParamUpdateRequired ) )
+ {
+ DoUpdateSinkParamsL();
+ }
+ if ( IsFlag( EBaseBaseStartDrawCalled ) )
+ {
+ DoBaseStartDrawL();
+ }
+ __VTPRINTEXIT( "RVD(DP).HandleDelayedCallsL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::DoBaseConstructL
+// Base construction implementation
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::DoBaseConstructL()
+ {
+ __VTPRINTENTER( "RVD(DP).DoBaseConstructL" )
+
+ if ( !iImageScaler )
+ {
+ iImageScaler =
+ CVtImageScaler::NewL( *this, CVtImageScaler::EBilinear );
+ }
+ delete iBufferWaiter;
+ iBufferWaiter = NULL;
+ delete iPostingSurface;
+ iPostingSurface = NULL;
+
+ // Load DP API library
+ LoadDPLibraryL();
+
+ // Create posting surface instance
+ iPostingSurface = CreatePostingSurfaceL();
+
+ CPostingSurface::TPostingFormat previousPostingFormat( iPostingFormat );
+
+ // Check support for format
+ if ( !SupportsFormat( KDefaultPostingFormat420 ) )
+ {
+ if ( !SupportsFormat( KDefaultPostingFormat422 ) )
+ {
+ __VTPRINT( DEBUG_MEDIA ,
+ "RVD(DP).BaseConstructL Format NOT supported" )
+ User::Leave( KErrNotSupported );
+ }
+ else
+ {
+ __VTPRINT( DEBUG_MEDIA , "RVD(DP).BaseConstructL using 422" )
+ iPostingFormat = KDefaultPostingFormat422;
+ }
+ }
+ else
+ {
+ __VTPRINT( DEBUG_MEDIA , "RVD(DP).BaseConstructL using 420" )
+ iPostingFormat = KDefaultPostingFormat420;
+ }
+ iPostingSurface->GetCapabilities( iPostingCaps );
+ iBufferWaiter =
+ new ( ELeave ) CVtEngBufferWaiter( *iPostingSurface, *this );
+ for ( TInt i = MDisplaySink::EFirstBitmap;
+ i < MDisplaySink::EFirstBitmap + KVtEngMaxBuffers; i++ )
+ {
+ iBuffers[ i ].UnSet();
+ }
+
+ // If posting for is different from previous, then free frame buffer
+ if ( ( previousPostingFormat != iPostingFormat ) || !iFrameBuffer )
+ {
+ CreateFrameBufferL( iSourceSize );
+ }
+ ClearFlag( EBaseConstructCalled );
+ __VTPRINTEXIT( "RVD(DP).DoBaseConstructL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::UpdateSinkParamsL
+// Updates sink params
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::UpdateSinkParamsL()
+ {
+ __VTPRINTENTER( "RVD(DP).UpdateSinkParamsL" )
+ if ( IsFlag( EBaseConstructCalled ) )
+ {
+ SetFlag( ESinkParamUpdateRequired );
+ }
+ else
+ {
+ DoUpdateSinkParamsL();
+ }
+ __VTPRINTEXIT( "RVD(DP).UpdateSinkParamsL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::DoBaseStartDrawL
+//
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::DoBaseStartDrawL()
+ {
+ __VTPRINTENTER( "RVD(DP).DoBaseStartDrawL" )
+ UpdateVtFrame();
+ if ( iDSA )
+ {
+ SetFlag( EReadyInternal );
+ if ( !iWatcher->IsActive() )
+ {
+ iWatcher->Start( KVtEngWatcherTimeout, KVtEngWatcherTimeout,
+ iCallback );
+ }
+ User::LeaveIfError( iBufferWaiter->FetchBuffer() );
+ SetFlag( ERemoteVideoDrawing );
+ }
+ else
+ {
+ User::Leave( KErrNotReady );
+ }
+ ClearFlag( EBaseBaseStartDrawCalled );
+ __VTPRINTEXIT( "RVD(DP).DoBaseStartDrawL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::DoInitializePostingSurfaceL
+// Initializes posting surface.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::DoInitializePostingSurfaceL()
+ {
+ __VTPRINTENTER( "RVD(DP).DoInitializePostingSurfaceL" )
+ CPostingSurface::TPostingSourceParams postingSourceParams;
+ GetPostingSourceParams( postingSourceParams );
+ CPostingSurface::TPostingParams postingParams;
+ GetPostingParams( postingParams );
+ // Create and start DSA for getting access to DP
+ CreateAndStartDSAL();
+
+ /*S60 Display Posting API has a limitation that only one surface instance can be
+ created at a time. Unfortunately there's no way to check when posting is really
+ free. PostingSurface initialization maybe returns KErrInUse.
+ Please refer to TSW error EAKC-7R3TME.
+ The transition effect between landscape and portrait uses ATID to achieve smooth
+ transition. ATID and PostingSurface share the same buffers and cannot be used
+ simultaneously. PostingSurface initialization maybe returns KErrNotReady.
+ Please refer to TSW error EWXO-7P4DV3.
+ So it probably requires some kind of timer based retry to bypass these cases.*/
+ TInt err;
+ while (1)
+ {
+ __VTPRINT( DEBUG_MEDIA, "RVD(DP).DoInitializePostingSurfaceL Initialize PostingSurface" );
+ TRAP( err, iPostingSurface->InitializeL(postingSourceParams, postingParams) );
+ if ( err == KErrNone)
+ {
+ break;
+ }
+ else
+ {
+ //time interval for each PostingSurface initialization is 0.2 second.
+ __VTPRINT2( DEBUG_MEDIA, "RVD(DP).DoInitializePostingSurfaceL InitPS error = %d", err )
+ User::After(200000);
+ }
+ }
+
+ delete iTarget; iTarget = NULL;
+ iTarget = CVtImageBitmap::NewL(
+ postingParams.iDisplayedRect.Size(), EColor16MU );
+ if ( iSource )
+ {
+ if ( IsFlag( EFrameBufferFilled ) &&
+ !IsFlag( EFrameBufferNeedsConvertAndScale ) )
+ {
+ iImageScaler->ScaleNowL( *iSource, *iTarget );
+ Config().iObserver->vtSetFrame(
+ MVtEngFrameObserver::ERemoteVideoFrame,
+ &iTarget->Bitmap() );
+ }
+ else
+ {
+ Config().iObserver->vtSetFrame(
+ MVtEngFrameObserver::ERemoteVideoFrame, NULL );
+ }
+ }
+ else
+ {
+ //delete iSource; iSource = NULL;
+ iSource = CVtImageBitmap::NewL( iSourceSize, EColor16MU );
+ Config().iObserver->vtSetFrame( MVtEngFrameObserver::ERemoteVideoFrame,
+ NULL );
+ }
+ RecalculateClipRegionL();
+ ClearFlag( EInitializePostingSurfaceCalled );
+ __VTPRINTEXIT( "RVD(DP).DoInitializePostingSurfaceL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::DoUpdateSinkParamsL
+// Updates sink params
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::DoUpdateSinkParamsL()
+ {
+ __VTPRINTENTER( "RVD(DP).DoUpdateSinkParamsL" )
+ TDisplaySinkParamsDP params;
+ GetSinkParams( params );
+ DisplaySink().UpdateSinkParamsL( params, iDSUpdated );
+ ClearFlag( ESinkParamUpdateRequired );
+ if ( IsFlag( ESinkResumeRequired ) )
+ {
+ DisplaySink().Resume();
+ ClearFlag( ESinkResumeRequired );
+ }
+ __VTPRINTEXIT( "RVD(DP).DoUpdateSinkParamsL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::IsAlphaTrashed
+// Checks if the alpha has been trashed on screen buffer.
+// -----------------------------------------------------------------------------
+//
+TBool CVtEngDrawDP::IsAlphaTrashed() const
+ {
+ __VTPRINTENTER( "RVD(DP).IsAlphaTrashed" )
+ TBool isTrashed( EFalse );
+ const CFbsScreenDevice& sdev( *iDSA->ScreenDevice() );
+ if ( sdev.DisplayMode() == EColor16MA )
+ {
+ TRgb color;
+ TPoint point( iClipRegion.BoundingRect().Center() );
+ sdev.GetPixel( color, point );
+ isTrashed = ( color.Alpha() != 0 );
+ }
+ __VTPRINTEXITR( "RVD(DP).IsAlphaTrashed %d", isTrashed )
+ return isTrashed;
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::SetClipRegionL
+// Sets clipping region for DP.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::SetClipRegionL()
+ {
+ __VTPRINTENTER( "RVD(DP).SetClipRegionL" )
+ if ( iClipRegionUpdated || IsAlphaTrashed() )
+ {
+ iClipRegionUpdated = EFalse;
+ CFbsBitGc* gc = iDSA->Gc();
+ gc->SetClippingRegion( iDSA->DrawingRegion() );
+ gc->SetDrawMode( CGraphicsContext::EDrawModeAND );
+ gc->SetBrushColor( TRgb( 255, 255, 255, 0 ) );
+ gc->Clear();
+ iDSA->ScreenDevice()->Update();
+ User::LeaveIfError(
+ iPostingSurface->SetClipRegion( iClipRegion ) );
+ }
+ __VTPRINTEXIT( "RVD(DP).SetClipRegionL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::InitializePostingSurfaceL
+// Initializes posting surface.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::InitializePostingSurfaceL()
+ {
+ __VTPRINTENTER( "RVD(DP).InitializePostingSurfaceL" )
+ if ( IsFlag( EBaseConstructCalled ) )
+ {
+ SetFlag( EInitializePostingSurfaceCalled );
+ }
+ else
+ {
+ DoInitializePostingSurfaceL();
+ }
+ __VTPRINTEXIT( "RVD(DP).InitializePostingSurfaceL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::GetPostingSourceParams
+// Fills posting source params structure.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::GetPostingSourceParams(
+ CPostingSurface::TPostingSourceParams& aParams ) const
+ {
+ __VTPRINTENTER( "RVD(DP).GetPostingSourceParams" )
+ Mem::FillZ( &aParams, sizeof( CPostingSurface::TPostingSourceParams ) );
+ aParams.iPostingBuffering = KDefaultPostingBufferingFlags;
+ aParams.iBufferType = CPostingSurface::EStandardBuffer;
+ aParams.iPostingUsage = CPostingSurface::EVideoCapture;
+ aParams.iSourceImageSize = iSourceSize;
+ aParams.iPostingFormat = iPostingFormat;
+ aParams.iPixelAspectRatioNum = KDefaultPixelAspectRatioNum;
+ aParams.iPixelAspectRatioDenom = KDefaultPixelAspectRatioDenom;
+ aParams.iContentCopyRestricted = EFalse;
+ __VTPRINTEXIT( "RVD(DP).GetPostingSourceParams" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::GetPostingParams
+// Fills posting params structure.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::GetPostingParams(
+ CPostingSurface::TPostingParams& aParams ) const
+ {
+ __VTPRINTENTER( "RVD(DP).GetPostingParams" )
+ Mem::FillZ( &aParams, sizeof( CPostingSurface::TPostingParams ) );
+
+ aParams.iDisplayedRect = iConfig.iClipRect;
+
+ __VTPRINT3( DEBUG_MEDIA, "RVD(DP).GetPostingParams DRect.iTl (%d, %d)",
+ aParams.iDisplayedRect.iTl.iX, aParams.iDisplayedRect.iTl.iY );
+ __VTPRINT3( DEBUG_MEDIA, "RVD(DP).GetPostingParams DRect.iBr (%d, %d)",
+ aParams.iDisplayedRect.iBr.iX, aParams.iDisplayedRect.iBr.iY );
+
+ TRect& dispRect( aParams.iDisplayedRect );
+ dispRect.Move( iConfig.iOffset );
+ FixRectForDP( dispRect );
+ __VTPRINT3( DEBUG_MEDIA, "RVD(DP).GetPostingParams OffsDRect.iTl (%d, %d)",
+ dispRect.iTl.iX, dispRect.iTl.iY );
+ __VTPRINT3( DEBUG_MEDIA, "RVD(DP).GetPostingParams OffsDRect.iBr (%d, %d)",
+ dispRect.iBr.iX, dispRect.iBr.iY );
+
+ aParams.iScaleToRect = TRect( aParams.iDisplayedRect.Size() );
+
+ aParams.iInputCrop = iSourceSize;
+
+ __VTPRINT3( DEBUG_MEDIA, "RVD(DP).GetPostingParams InputCrop.iTl (%d, %d)",
+ aParams.iInputCrop.iTl.iX, aParams.iInputCrop.iTl.iY );
+ __VTPRINT3( DEBUG_MEDIA, "RVD(DP).GetPostingParams InputCrop.iBr (%d, %d)",
+ aParams.iInputCrop.iBr.iX, aParams.iInputCrop.iBr.iY );
+
+ aParams.iBackGround = iConfig.iBackGround;
+ __VTPRINTEXIT( "RVD(DP).GetPostingParams" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::SupportsFormat
+//
+// -----------------------------------------------------------------------------
+//
+TBool CVtEngDrawDP::SupportsFormat(
+ const CPostingSurface::TPostingFormat& aFormat ) const
+ {
+ return iPostingSurface->FormatSupported( aFormat );
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::SupportsSize
+//
+// -----------------------------------------------------------------------------
+//
+TBool CVtEngDrawDP::SupportsSize( const TSize& aSize ) const
+ {
+ return ( iPostingCaps.iMaxPixelSize.iWidth >= aSize.iWidth ) &&
+ ( iPostingCaps.iMaxPixelSize.iHeight >= aSize.iHeight );
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::SupportsRotation
+//
+// -----------------------------------------------------------------------------
+//
+TBool CVtEngDrawDP::SupportsRotation(
+ CPostingSurface::TRotationType aRotation ) const
+ {
+ return ( ( aRotation & iPostingCaps.iSupportedRotations ) == aRotation );
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::SupportsMirroring
+//
+// -----------------------------------------------------------------------------
+//
+TBool CVtEngDrawDP::SupportsMirroring() const
+ {
+ return iPostingCaps.iSupportsMirroring;
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::SupportsScaling
+//
+// -----------------------------------------------------------------------------
+//
+TBool CVtEngDrawDP::SupportsScaling() const
+ {
+ return iPostingCaps.iSupportsScaling;
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::SupportsBrightness
+//
+// -----------------------------------------------------------------------------
+//
+TBool CVtEngDrawDP::SupportsBrightness() const
+ {
+ return iPostingCaps.iSupportsBrightnessControl;
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::SupportsContrast
+//
+// -----------------------------------------------------------------------------
+//
+TBool CVtEngDrawDP::SupportsContrast() const
+ {
+ return iPostingCaps.iSupportsContrastControl;
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::GetFrameBufferSize
+// Returns size of frame buffer in bytes for given pixel size and current
+// posting format.
+// -----------------------------------------------------------------------------
+//
+TInt CVtEngDrawDP::GetFrameBufferSize( const TSize& aSize ) const
+ {
+ TInt size( -1 );
+ __VTPRINTENTER( "RVD(DP).GetFrameBufferSize" )
+ switch( iPostingFormat )
+ {
+ case KDefaultPostingFormat420:
+ size = ( aSize.iWidth * aSize.iHeight * 3 ) >> 1;
+ break;
+
+ case KDefaultPostingFormat422:
+ size = ( aSize.iWidth * aSize.iHeight ) * 2;
+ break;
+
+ default:
+ break;
+ }
+ __VTPRINTEXITR( "RVD(DP).GetFrameBufferSize %d", size )
+ return size;
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::RecalculateClipRegionL
+// Updates clipregion.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::RecalculateClipRegionL()
+ {
+ __VTPRINTENTER( "RVD(DP).RecalculateClipRegionL" )
+ // Clip region needs to be updated
+ iClipRegionUpdated = ETrue;
+ iClipRegion.Clear();
+ TRect clippingRect( iConfig.iClipRect );
+ clippingRect.Move( iConfig.iOffset );
+ FixRectForDP( clippingRect );
+ iClipRegion.AddRect( clippingRect );
+ if ( iClipRegion.CheckError() )
+ {
+ __VTPRINT( DEBUG_MEDIA ,
+ "RVD(DP).RecalculateClipRegionL failed to add cliprect" )
+ User::Leave( KErrNoMemory );
+ }
+
+ if ( IsFlag( EStarted ) && iDSA && iDSA->DrawingRegion() )
+ {
+ iClipRegion.Intersect( *iDSA->DrawingRegion() );
+ if ( iClipRegion.CheckError() )
+ {
+ __VTPRINT( DEBUG_MEDIA ,
+ "RVD(DP).RecalculateClipRegionL failed to intersect" )
+ User::Leave( KErrNoMemory );
+ }
+
+#ifdef VTDEBUG
+
+ TRect bRect( iClipRegion.BoundingRect() );
+ __VTPRINT3( DEBUG_MEDIA, "RVD(DP).RecalculateClipRegionL BRect.iTl (%d, %d)",
+ bRect.iTl.iX, bRect.iTl.iY );
+ __VTPRINT3( DEBUG_MEDIA, "RVD(DP).RecalculateClipRegionL BRect.iBr (%d, %d)",
+ bRect.iBr.iX, bRect.iBr.iY );
+#endif // VTDEBUG
+ }
+ __VTPRINTEXIT( "RVD(DP).RecalculateClipRegionL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::FixRectForDP
+// Fixes rect for DP (i.e. width is made even and starting X coordinate is made
+// even as well)
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::FixRectForDP( TRect& aRect ) const
+ {
+ __VTPRINTENTER( "RVD(DP).FixRectForDP" )
+ if ( aRect.iTl.iX & 1 )
+ {
+ aRect.Move( 1, 0 );
+ aRect.SetWidth( Max( 0, aRect.Width() - 1 ) );
+ }
+ if ( aRect.Width() & 1 )
+ {
+ aRect.SetWidth( aRect.Width() - 1 );
+ }
+ __VTPRINTEXIT( "RVD(DP).FixRectForDP" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::RecalculateClipRegionL
+// Fills sink params.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::GetSinkParams( TDisplaySinkParamsDP& aSinkParams )
+ {
+ __VTPRINTENTER( "RVD(DP).GetSinkParams" )
+ Mem::FillZ( &aSinkParams, sizeof( TDisplaySinkParamsDP ) );
+ aSinkParams.iThreadId = RThread().Id();
+ aSinkParams.iRequestStatusPtr = &iStatus;
+ aSinkParams.iObserver = iObserver;
+ aSinkParams.iPostingBuffer1 = &iBuffers[ 0 ].Buffer();
+ aSinkParams.iPostingBuffer2 = &iBuffers[ 1 ].Buffer();
+ aSinkParams.iFrameSize = iSourceSize;
+ aSinkParams.iPostingFormat = iPostingFormat;
+ aSinkParams.iFlags = TDisplaySinkParams::EDisplaySinkDP;
+ __VTPRINTEXITR( "RVD(DP).GetSinkParams flags=%d",
+ (TInt) aSinkParams.iFlags )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::DisplaySink
+// Returns reference to sink.
+// -----------------------------------------------------------------------------
+//
+MDisplaySink& CVtEngDrawDP::DisplaySink()
+ {
+ return *iDisplaySink;
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::StoreFrameBuffer
+// Stores given frame buffer.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::StoreFrameBuffer(
+ CPostingSurface::TPostingBuff* aPostingBuffer )
+ {
+ __VTPRINTENTER( "RVD(DP).StoreFrameBuffer" )
+ if ( iPostingFormat == KDefaultPostingFormat422 )
+ {
+ const TInt height( iSourceSize.iHeight );
+ const TInt srcStride( aPostingBuffer->GetStride() );
+ const TInt dstStride( iSourceSize.iWidth * 2 );
+ TUint8* dst =
+ const_cast< TUint8* >( iFrameBuffer->Des().Ptr() );
+ const TUint8* src =
+ reinterpret_cast< const TUint8* >( aPostingBuffer->GetBuffer() );
+ for ( TInt y = height - 1; y >= 0; y-- )
+ {
+ dst = Mem::Copy( dst, src, dstStride );
+ src += srcStride;
+ }
+ }
+ else
+ {
+ TInt frameBufferSizeInBytes( GetFrameBufferSize( iSourceSize ) );
+ TPtrC8 postingBufferDesC(
+ reinterpret_cast< const TUint8* >( aPostingBuffer->GetBuffer() ),
+ frameBufferSizeInBytes );
+ *iFrameBuffer = postingBufferDesC;
+ }
+ SetFlag( EFrameBufferFilled | EFrameBufferNeedsConvertAndScale );
+ __VTPRINTEXIT( "RVD(DP).StoreFrameBuffer" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::CreateFrameBufferL
+// Creates frame buffer.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::CreateFrameBufferL( const TSize& aSize )
+ {
+ __VTPRINTENTER( "RVD(DP).CreateFrameBufferL" )
+ delete iFrameBuffer; iFrameBuffer = NULL;
+ iFrameBuffer = HBufC8::NewL( GetFrameBufferSize( aSize ) );
+ ClearFlag( EFrameBufferFilled | EFrameBufferNeedsConvertAndScale );
+ __VTPRINTEXIT( "RVD(DP).CreateFrameBufferL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::SetAvailableToSink
+// Sets posting buffer available to sink.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::SetAvailableToSink( CPostingSurface::TPostingBuff* aBuffer )
+ {
+ __VTPRINTENTER( "RVD(DP).SetAvailableToSink" )
+ for ( TInt i = MDisplaySink::EFirstBitmap;
+ i < MDisplaySink::EFirstBitmap + KVtEngMaxBuffers; i++ )
+ {
+ if ( !iBuffers[ i ].IsSet() )
+ {
+ __VTPRINT3( DEBUG_MEDIA,
+ "RVD(DP).SetAvailableToSink buffer %d: $%x",
+ i, reinterpret_cast< TUint >( aBuffer->GetBuffer() ) );
+ iBuffers[ i ].Set( aBuffer );
+ Activate();
+ DisplaySink().SetBitmapAvailable(
+ static_cast< MDisplaySink::TBitmapNo >( i ) );
+ break;
+ }
+ }
+ __VTPRINTEXIT( "RVD(DP).SetAvailableToSink" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::SetAvailableToSink
+// Sets posting buffer available to sink.
+// -----------------------------------------------------------------------------
+//
+CPostingSurface* CVtEngDrawDP::CreatePostingSurfaceL()
+ {
+ __VTPRINTENTER( "RVD(DP).CreatePostingSurfaceL" )
+ CPostingSurface* postingSurface = NULL;
+ CPostingSurfaceFactory* ( *createFactoryL )() =
+ reinterpret_cast< CPostingSurfaceFactory*(*)() >( iDPLib->Lookup( 1 ) );
+ if ( createFactoryL )
+ {
+ CPostingSurfaceFactory* factory = createFactoryL();
+ CleanupStack::PushL( factory );
+ postingSurface = factory->NewPostingSurfaceL( EMainDisplay );
+ CleanupStack::PopAndDestroy(); // factory
+ }
+ __VTPRINTEXIT( "RVD(DP).CreatePostingSurfaceL" )
+ return postingSurface;
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::CloseDPLibrary
+// Close the DP API library and free the allocated instance.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::CloseDPLibrary()
+ {
+ if ( iDPLib )
+ {
+ iDPLib->Close();
+ delete iDPLib;
+ iDPLib = NULL;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::LoadDPLibraryL
+// Loads DP API library.
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::LoadDPLibraryL()
+ {
+ CloseDPLibrary();
+ iDPLib = new ( ELeave ) RLibrary();
+ TInt error( iDPLib->Load( KDPAPIDLLName() ) );
+ if ( error )
+ {
+ delete iDPLib;
+ iDPLib = NULL;
+ User::Leave( error );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::Convert420ToVtImg
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::Convert420ToVtImg( HBufC8* aSource,
+ CVtImageBitmap& aTarget )
+ {
+ __VTPRINTENTER( "RVD(DP).Convert420ToVtImg" )
+
+ CFbsBitmap& bitmap( aTarget.Bitmap() );
+ TSize size( bitmap.SizeInPixels() );
+ TInt height( size.iHeight );
+ TInt width( size.iWidth );
+ TInt bytes( bitmap.ScanLineLength( width, bitmap.DisplayMode() ) );
+
+ const TUint8* y1ptr = aSource->Ptr();
+ const TUint8* y2ptr = y1ptr + width;
+ const TUint8* uptr = y1ptr + ( width * height );
+ const TUint8* vptr = uptr + ( width * height ) / 4;
+
+ bitmap.LockHeap();
+
+ TUint8* d1ptr = reinterpret_cast< TUint8* >( bitmap.DataAddress() );
+ TUint8* d2ptr = d1ptr + bytes;
+
+ height /= 2; // divide by 2 because we process to rows at time
+ bytes *= 2; // multiply by 2 so we don't need to do it in loop
+
+ while ( height-- )
+ {
+ DoConvertYuv420toXRGB0888( width, y1ptr, y2ptr, uptr, vptr, d1ptr,
+ d2ptr );
+ y1ptr = y2ptr;
+ y2ptr += width;
+ d1ptr += bytes;
+ d2ptr += bytes;
+ }
+
+ bitmap.UnlockHeap();
+
+ __VTPRINTEXIT( "RVD(DP).Convert420ToVtImg" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::Convert422ToVtImg
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::Convert422ToVtImg( HBufC8* aSource, CVtImageBitmap& aTarget )
+ {
+ __VTPRINTENTER( "RVD(DP).Convert422ToVtImg" )
+ CFbsBitmap& bitmap( aTarget.Bitmap() );
+ TSize size( bitmap.SizeInPixels() );
+ TInt height( size.iHeight );
+ TInt width( size.iWidth );
+ TInt bytes( bitmap.ScanLineLength( width, bitmap.DisplayMode() ) );
+
+ const TUint8* sptr = aSource->Ptr();
+
+ bitmap.LockHeap();
+
+ TUint8* dptr = reinterpret_cast< TUint8* >( bitmap.DataAddress() );
+ while ( height-- )
+ {
+ DoConvertYuv422toXRGB0888( width, sptr, dptr );
+ dptr += bytes;
+ }
+
+ bitmap.UnlockHeap();
+
+ __VTPRINTEXIT( "RVD(DP).Convert422ToVtImg" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::UpdateVtFrame
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::UpdateVtFrame()
+ {
+ __VTPRINTENTER( "RVD(DP).UpdateVtFrame" )
+ if ( IsFlag( EFrameBufferFilled ) )
+ {
+ CFbsBitmap* bitmap = NULL;
+ if ( IsFlag( EFrameBufferNeedsConvertAndScale ) )
+ {
+ if ( iPostingFormat == KDefaultPostingFormat422 )
+ {
+ Convert422ToVtImg( iFrameBuffer, *iSource );
+ }
+ else
+ {
+ Convert420ToVtImg( iFrameBuffer, *iSource );
+ }
+ TRAPD( error, iImageScaler->ScaleNowL( *iSource, *iTarget ) );
+ if ( !error )
+ {
+ bitmap = &iTarget->Bitmap();
+ }
+ ClearFlag( EFrameBufferNeedsConvertAndScale );
+ }
+ else
+ {
+ bitmap = &iTarget->Bitmap();
+ }
+ Config().iObserver->vtSetFrame( MVtEngFrameObserver::ERemoteVideoFrame,
+ bitmap );
+ }
+ __VTPRINTEXIT( "RVD(DP).UpdateVtFrame" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::ScalingFinished
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::ScalingFinished( TInt )
+ {
+ }
+
+// Implementation for CVtEngDrawDP::TVtEngBuffer
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::TVtEngBuffer::TVtEngBuffer
+//
+// -----------------------------------------------------------------------------
+//
+CVtEngDrawDP::TVtEngBuffer::TVtEngBuffer()
+ : iBuffer( 0 )
+ {
+ __VTPRINTENTER( "RVD(DP).Buffer.Ctor" )
+ __VTPRINTEXIT( "RVD(DP).Buffer.Ctor" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::TVtEngBuffer::Set
+//
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::TVtEngBuffer::Set( CPostingSurface::TPostingBuff* aBuffer )
+ {
+ __VTPRINTENTER( "RVD(DP).Buffer.Set" )
+ __VTPRINT2( DEBUG_MEDIA, "RVD(DP).Buffer.Set $%x",
+ reinterpret_cast< TUint >( aBuffer->GetBuffer() ) )
+ iBuffer = aBuffer;
+ __VTPRINTEXIT( "RVD(DP).Buffer.Set" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::TVtEngBuffer::UnSet
+//
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::TVtEngBuffer::UnSet()
+ {
+ __VTPRINTENTER( "RVD(DP).Buffer.UnSet" )
+ iBuffer = 0;
+ __VTPRINTEXIT( "RVD(DP).Buffer.UnSet" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::TVtEngBuffer::IsSet
+//
+// -----------------------------------------------------------------------------
+//
+TBool CVtEngDrawDP::TVtEngBuffer::IsSet() const
+ {
+ return ( iBuffer != 0 );
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::TVtEngBuffer::Buffer
+//
+// -----------------------------------------------------------------------------
+//
+CPostingSurface::TPostingBuff*& CVtEngDrawDP::TVtEngBuffer::Buffer()
+ {
+ return iBuffer;
+ }
+
+// Implementation for CVtEngDrawDP::CVtEngBufferWaiter
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::CVtEngBufferWaiter::CVtEngBufferWaiter
+// -----------------------------------------------------------------------------
+//
+CVtEngDrawDP::CVtEngBufferWaiter::CVtEngBufferWaiter
+ ( CPostingSurface& aPostingSurface, MVtEngBufferWaiterObserver& aObserver )
+ : CActive( CActive::EPriorityStandard ),
+ iPostingSurface( &aPostingSurface ), iObserver( &aObserver )
+ {
+ __VTPRINTENTER( "RVD(DP).BufferWaiter.Ctor" )
+ CActiveScheduler::Add( this );
+ __VTPRINTEXIT( "RVD(DP).BufferWaiter.Ctor" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::CVtEngBufferWaiter::~CVtEngBufferWaiter
+// -----------------------------------------------------------------------------
+//
+CVtEngDrawDP::CVtEngBufferWaiter::~CVtEngBufferWaiter()
+ {
+ __VTPRINTENTER( "RVD(DP).BufferWaiter.~" )
+ Cancel();
+ __VTPRINTEXIT( "RVD(DP).BufferWaiter.~" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::CVtEngBufferWaiter::Activate
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::CVtEngBufferWaiter::Activate()
+ {
+ __VTPRINTENTER( "RVD(DP).BufferWaiter.Activate" )
+ iStatus = KRequestPending;
+ SetActive();
+ __VTPRINTEXIT( "RVD(DP).BufferWaiter.Activate" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::CVtEngBufferWaiter::FetchBuffer
+// -----------------------------------------------------------------------------
+//
+TInt CVtEngDrawDP::CVtEngBufferWaiter::FetchBuffer()
+ {
+ __VTPRINTENTER( "RVD(DP).BufferWaiter.FetchBuffer" )
+ // do nothing if we're already active
+ if ( IsActive() )
+ {
+ __VTPRINTEXIT( "RVD(DP).BufferWaiter.FetchBuffer" )
+ return KErrNone;
+ }
+ // else start fetching
+ Activate();
+ __VTPRINTEXIT( "RVD(DP).BufferWaiter.FetchBuffer" )
+ return iPostingSurface->WaitForNextBuffer( iStatus );
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::CVtEngBufferWaiter::RunL
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::CVtEngBufferWaiter::RunL()
+ {
+ __VTPRINTENTER( "RVD(DP).BufferWaiter.RunL" )
+ __VTPRINT2( DEBUG_MEDIA, "RVD(DP).BufferWaiter.RunL %d", iStatus.Int() );
+ TInt result( iStatus.Int() );
+ if ( result == KErrNone )
+ {
+ iObserver->BufferReady( iPostingSurface->NextBuffer() );
+ }
+ else
+ {
+ iObserver->FetchError( result );
+ }
+ __VTPRINTEXIT( "RVD(DP).BufferWaiter.RunL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngDrawDP::CVtEngBufferWaiter::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CVtEngDrawDP::CVtEngBufferWaiter::DoCancel()
+ {
+ __VTPRINTENTER( "RVD(DP).BufferWaiter.DoCancel" )
+ iPostingSurface->CancelBuffer();
+ __VTPRINTEXIT( "RVD(DP).BufferWaiter.DoCancel" )
+ }
+
+// End of File