diff -r 45e72b57a2fd -r e3cecb93e76a videocollection/tsrc/simplevideoplayback/src/svpbnativewindow.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videocollection/tsrc/simplevideoplayback/src/svpbnativewindow.cpp Wed Aug 18 09:50:14 2010 +0300 @@ -0,0 +1,133 @@ +/* +* Copyright (c) 2010 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: CCoeControl to provide RWindow for videoplayback. +* QGraphicsView derived class can not be used for this purpose, +* because the Qt OpenVG context may interfere with the one being +* used by the renderer. +* +*/ + +#include +#include +#include +#include "svpbnativewindow.h" +#include "trace.h" + +CSvpbNativeWindow* CSvpbNativeWindow::NewL(const TRect& displayRect) +{ + FUNC_LOG; + + CSvpbNativeWindow* self = new (ELeave) CSvpbNativeWindow; + CleanupStack::PushL(self); + self->ConstructL(displayRect); + CleanupStack::Pop(); + return self; +} + +CSvpbNativeWindow::~CSvpbNativeWindow() +{ + FUNC_LOG; + + detachSurface(); + CloseWindow(); +} + +int CSvpbNativeWindow::attachSurface( + const TSurfaceId &surfaceId, + const TRect &cropRect, + const TVideoAspectRatio &aspectRatio) +{ + FUNC_LOG; + + INFO("Surface id:" << surfaceId.iInternal[0] + << surfaceId.iInternal[1] + << surfaceId.iInternal[2] + << surfaceId.iInternal[3]); + + if (mSurfaceId.IsNull()) { + mSurfaceId = surfaceId; + return setupSurface(cropRect, aspectRatio); + } + else if (mSurfaceId == surfaceId) { + detachSurface(); + return setupSurface(cropRect, aspectRatio); + } + else { + detachSurface(); + } + + return 0; +} + +void CSvpbNativeWindow::detachSurface() +{ + FUNC_LOG; + + if (mDisplay) { + mDisplay->RemoveSurface(); + mDisplay->RemoveDisplayWindow( *(DrawableWindow())); + delete mDisplay; + mDisplay = 0; + } + + mSurfaceId = TSurfaceId::CreateNullId(); +} + +CSvpbNativeWindow::CSvpbNativeWindow() : + mSurfaceId(TSurfaceId::CreateNullId()), + mDisplay(0) +{ + FUNC_LOG; +} + +void CSvpbNativeWindow::ConstructL(const TRect& displayRect) +{ + FUNC_LOG; + + CreateWindowL(); + SetRect(displayRect); + DrawableWindow()->SetOrdinalPosition(-1); // Send to background + ActivateL(); +} + +int CSvpbNativeWindow::setupSurface( + const TRect &cropRect, const TVideoAspectRatio &aspectRatio) +{ + FUNC_LOG; + + TInt displayId = CCoeEnv::Static()->ScreenDevice()->GetScreenNumber(); + INFO("Display id:" << displayId); + QT_TRAP_THROWING(mDisplay = CMediaClientVideoDisplay::NewL(displayId)); + + RWindowBase *videoWindow = DrawableWindow(); + TRect displayRect = Rect(); + TRAPD(err, mDisplay->AddDisplayWindowL(videoWindow, + displayRect, // Window clipping rectangle, relative to the window + cropRect, // The dimensions of the crop region, relative to the video image + displayRect, // Video extent on the screen + 100.0f, + 100.0f, + displayRect.Width() < displayRect.Height() ? EVideoRotationClockwise90 : EVideoRotationNone, + EAutoScaleStretch, + EHorizontalAlignCenter, + EVerticalAlignCenter, + (RWindow*)videoWindow)); + HANDLE_ERROR_NEG(err); + + if (err == 0) { + QT_TRAP_THROWING(mDisplay->SurfaceCreated(mSurfaceId, cropRect, aspectRatio, cropRect)); + } + + return err; +}