videocollection/tsrc/simplevideoplayback/src/svpbnativewindow.cpp
changeset 52 e3cecb93e76a
--- /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 <QGraphicsWidget>
+#include <graphics/surfaceconfiguration.h>
+#include <mediaclientvideodisplay.h>
+#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;
+}