videocollection/tsrc/simplevideoplayback/src/svpbnativewindow.cpp
author hgs
Fri, 06 Aug 2010 09:43:48 +0300
changeset 50 21fe8338c6bf
permissions -rw-r--r--
201031
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description: CCoeControl to provide RWindow for videoplayback.
hgs
parents:
diff changeset
    15
*              QGraphicsView derived class can not be used for this purpose,
hgs
parents:
diff changeset
    16
*              because the Qt OpenVG context may interfere with the one being
hgs
parents:
diff changeset
    17
*              used by the renderer.
hgs
parents:
diff changeset
    18
*
hgs
parents:
diff changeset
    19
*/
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
#include <QGraphicsWidget>
hgs
parents:
diff changeset
    22
#include <graphics/surfaceconfiguration.h>
hgs
parents:
diff changeset
    23
#include <mediaclientvideodisplay.h>
hgs
parents:
diff changeset
    24
#include "svpbnativewindow.h"
hgs
parents:
diff changeset
    25
#include "trace.h"
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
CSvpbNativeWindow* CSvpbNativeWindow::NewL(const TRect& displayRect)
hgs
parents:
diff changeset
    28
{
hgs
parents:
diff changeset
    29
    FUNC_LOG;
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
    CSvpbNativeWindow* self = new (ELeave) CSvpbNativeWindow;
hgs
parents:
diff changeset
    32
    CleanupStack::PushL(self);
hgs
parents:
diff changeset
    33
    self->ConstructL(displayRect);
hgs
parents:
diff changeset
    34
    CleanupStack::Pop();
hgs
parents:
diff changeset
    35
    return self;
hgs
parents:
diff changeset
    36
}
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
CSvpbNativeWindow::~CSvpbNativeWindow()
hgs
parents:
diff changeset
    39
{
hgs
parents:
diff changeset
    40
    FUNC_LOG;
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
    detachSurface();
hgs
parents:
diff changeset
    43
    CloseWindow();
hgs
parents:
diff changeset
    44
}
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
int CSvpbNativeWindow::attachSurface(
hgs
parents:
diff changeset
    47
        const TSurfaceId &surfaceId,
hgs
parents:
diff changeset
    48
        const TRect &cropRect,
hgs
parents:
diff changeset
    49
        const TVideoAspectRatio &aspectRatio)
hgs
parents:
diff changeset
    50
{
hgs
parents:
diff changeset
    51
    FUNC_LOG;
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
    INFO("Surface id:" << surfaceId.iInternal[0]
hgs
parents:
diff changeset
    54
        << surfaceId.iInternal[1]
hgs
parents:
diff changeset
    55
        << surfaceId.iInternal[2]
hgs
parents:
diff changeset
    56
        << surfaceId.iInternal[3]);
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
    if (mSurfaceId.IsNull()) {
hgs
parents:
diff changeset
    59
        mSurfaceId = surfaceId;
hgs
parents:
diff changeset
    60
        return setupSurface(cropRect, aspectRatio);
hgs
parents:
diff changeset
    61
    }
hgs
parents:
diff changeset
    62
    else if (mSurfaceId == surfaceId) {
hgs
parents:
diff changeset
    63
        detachSurface();
hgs
parents:
diff changeset
    64
        return setupSurface(cropRect, aspectRatio);
hgs
parents:
diff changeset
    65
    }
hgs
parents:
diff changeset
    66
    else {
hgs
parents:
diff changeset
    67
        detachSurface();
hgs
parents:
diff changeset
    68
    }
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
    return 0;
hgs
parents:
diff changeset
    71
}
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
void CSvpbNativeWindow::detachSurface()
hgs
parents:
diff changeset
    74
{
hgs
parents:
diff changeset
    75
    FUNC_LOG;
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
    if (mDisplay) {
hgs
parents:
diff changeset
    78
        mDisplay->RemoveSurface();
hgs
parents:
diff changeset
    79
        mDisplay->RemoveDisplayWindow( *(DrawableWindow()));
hgs
parents:
diff changeset
    80
        delete mDisplay;
hgs
parents:
diff changeset
    81
        mDisplay = 0;
hgs
parents:
diff changeset
    82
    }
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
    mSurfaceId = TSurfaceId::CreateNullId();
hgs
parents:
diff changeset
    85
}
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
CSvpbNativeWindow::CSvpbNativeWindow() :
hgs
parents:
diff changeset
    88
    mSurfaceId(TSurfaceId::CreateNullId()),
hgs
parents:
diff changeset
    89
    mDisplay(0)
hgs
parents:
diff changeset
    90
{
hgs
parents:
diff changeset
    91
    FUNC_LOG;
hgs
parents:
diff changeset
    92
}
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
void CSvpbNativeWindow::ConstructL(const TRect& displayRect)
hgs
parents:
diff changeset
    95
{
hgs
parents:
diff changeset
    96
    FUNC_LOG;
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
    CreateWindowL();
hgs
parents:
diff changeset
    99
    SetRect(displayRect);
hgs
parents:
diff changeset
   100
    DrawableWindow()->SetOrdinalPosition(-1); // Send to background
hgs
parents:
diff changeset
   101
    ActivateL();
hgs
parents:
diff changeset
   102
}
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
int CSvpbNativeWindow::setupSurface(
hgs
parents:
diff changeset
   105
    const TRect &cropRect, const TVideoAspectRatio &aspectRatio)
hgs
parents:
diff changeset
   106
{
hgs
parents:
diff changeset
   107
    FUNC_LOG;
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
    TInt displayId = CCoeEnv::Static()->ScreenDevice()->GetScreenNumber();
hgs
parents:
diff changeset
   110
    INFO("Display id:" << displayId);
hgs
parents:
diff changeset
   111
    QT_TRAP_THROWING(mDisplay = CMediaClientVideoDisplay::NewL(displayId));
hgs
parents:
diff changeset
   112
hgs
parents:
diff changeset
   113
    RWindowBase *videoWindow = DrawableWindow();
hgs
parents:
diff changeset
   114
    TRect displayRect = Rect();
hgs
parents:
diff changeset
   115
    TRAPD(err, mDisplay->AddDisplayWindowL(videoWindow,
hgs
parents:
diff changeset
   116
        displayRect, // Window clipping rectangle, relative to the window
hgs
parents:
diff changeset
   117
        cropRect,    // The dimensions of the crop region, relative to the video image
hgs
parents:
diff changeset
   118
        displayRect, // Video extent on the screen
hgs
parents:
diff changeset
   119
        100.0f,
hgs
parents:
diff changeset
   120
        100.0f,
hgs
parents:
diff changeset
   121
        displayRect.Width() < displayRect.Height() ? EVideoRotationClockwise90 : EVideoRotationNone,
hgs
parents:
diff changeset
   122
        EAutoScaleStretch,
hgs
parents:
diff changeset
   123
        EHorizontalAlignCenter,
hgs
parents:
diff changeset
   124
        EVerticalAlignCenter,
hgs
parents:
diff changeset
   125
        (RWindow*)videoWindow));
hgs
parents:
diff changeset
   126
    HANDLE_ERROR_NEG(err);
hgs
parents:
diff changeset
   127
hgs
parents:
diff changeset
   128
    if (err == 0) {
hgs
parents:
diff changeset
   129
        QT_TRAP_THROWING(mDisplay->SurfaceCreated(mSurfaceId, cropRect, aspectRatio, cropRect));
hgs
parents:
diff changeset
   130
    }
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
    return err;
hgs
parents:
diff changeset
   133
}