~ubuntu-branches/ubuntu/oneiric/phonon/oneiric-201108111512

« back to all changes in this revision

Viewing changes to mmf/videoplayer_surface.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Jonathan Riddell
  • Date: 2011-01-24 10:12:11 UTC
  • mfrom: (0.5.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20110124101211-w9rew7q0dmwbwhqx
Tags: 4:4.7.0really4.4.4-0ubuntu1
* New upstream release
* Xine and GStreamer backends now split out source, remove build-deps and
  binary packages from debian/control
* Remove 02_no_rpath.patch, now upstream
* Disable kubuntu04_no_va_mangle.patch, no longer applies
* Remove kubuntu_05_gst_codec_installer_window_id.diff, kubuntu_06_forward_events.diff,
  kubuntu_07_include_fix.diff, gstreamer now separate

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*  This file is part of the KDE project.
2
 
 
3
 
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4
 
 
5
 
This library is free software: you can redistribute it and/or modify
6
 
it under the terms of the GNU Lesser General Public License as published by
7
 
the Free Software Foundation, either version 2.1 or 3 of the License.
8
 
 
9
 
This library is distributed in the hope that it will be useful,
10
 
but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 
GNU Lesser General Public License for more details.
13
 
 
14
 
You should have received a copy of the GNU Lesser General Public License
15
 
along with this library.  If not, see <http://www.gnu.org/licenses/>.
16
 
 
17
 
*/
18
 
 
19
 
#include <videoplayer2.h>
20
 
 
21
 
#include <QtCore/private/qcore_symbian_p.h> // for qt_QRect2TRect
22
 
 
23
 
#include "utils.h"
24
 
#include "videooutput_surface.h"
25
 
#include "videoplayer_surface.h"
26
 
 
27
 
QT_BEGIN_NAMESPACE
28
 
 
29
 
using namespace Phonon;
30
 
using namespace Phonon::MMF;
31
 
 
32
 
// Two-phase constructor idiom is used because construct() calls virtual
33
 
// functions and therefore cannot be called from the AbstractVideoPlayer
34
 
// C++ constructor.
35
 
SurfaceVideoPlayer* SurfaceVideoPlayer::create(MediaObject *parent,
36
 
                                       const AbstractPlayer *player)
37
 
{
38
 
    QScopedPointer<SurfaceVideoPlayer> self(new SurfaceVideoPlayer(parent, player));
39
 
    self->construct();
40
 
    return self.take();
41
 
}
42
 
 
43
 
SurfaceVideoPlayer::SurfaceVideoPlayer(MediaObject *parent, const AbstractPlayer *player)
44
 
    :   AbstractVideoPlayer(parent, player)
45
 
    ,   m_displayWindow(0)
46
 
{
47
 
 
48
 
}
49
 
 
50
 
SurfaceVideoPlayer::~SurfaceVideoPlayer()
51
 
{
52
 
 
53
 
}
54
 
 
55
 
 
56
 
//-----------------------------------------------------------------------------
57
 
// Public functions
58
 
//-----------------------------------------------------------------------------
59
 
 
60
 
void MMF::SurfaceVideoPlayer::videoWindowSizeChanged()
61
 
{
62
 
    if (m_videoOutput)
63
 
        updateScaleFactors(m_videoOutput->videoWindowSize());
64
 
}
65
 
 
66
 
 
67
 
//-----------------------------------------------------------------------------
68
 
// Private functions
69
 
//-----------------------------------------------------------------------------
70
 
 
71
 
void MMF::SurfaceVideoPlayer::createPlayer()
72
 
{
73
 
    const TInt priority = 0;
74
 
    const TMdaPriorityPreference preference = EMdaPriorityPreferenceNone;
75
 
 
76
 
    CVideoPlayerUtility2 *player = 0;
77
 
    QT_TRAP_THROWING(player = CVideoPlayerUtility2::NewL(*this,
78
 
                                         priority, preference));
79
 
    m_player.reset(player);
80
 
}
81
 
 
82
 
void MMF::SurfaceVideoPlayer::initVideoOutput()
83
 
{
84
 
    Q_ASSERT(m_videoOutput);
85
 
 
86
 
    bool connected = connect(
87
 
        m_videoOutput, SIGNAL(videoWindowSizeChanged()),
88
 
        this, SLOT(videoWindowSizeChanged())
89
 
    );
90
 
    Q_ASSERT(connected);
91
 
 
92
 
    // Suppress warnings in release builds
93
 
    Q_UNUSED(connected);
94
 
 
95
 
    AbstractVideoPlayer::initVideoOutput();
96
 
}
97
 
 
98
 
void MMF::SurfaceVideoPlayer::prepareCompleted()
99
 
{
100
 
    videoWindowSizeChanged();
101
 
}
102
 
 
103
 
void MMF::SurfaceVideoPlayer::handleVideoWindowChanged()
104
 
{
105
 
    parametersChanged(WindowHandle);
106
 
}
107
 
 
108
 
void MMF::SurfaceVideoPlayer::handleParametersChanged(VideoParameters parameters)
109
 
{
110
 
    TRACE_CONTEXT(SurfaceVideoPlayer::handleParametersChanged, EVideoApi);
111
 
    TRACE_ENTRY("parameters 0x%x", parameters.operator int());
112
 
 
113
 
    TRect rect;
114
 
    if (m_videoOutput) {
115
 
        m_videoOutput->dump();
116
 
        const QSize size = m_videoOutput->videoWindowSize();
117
 
        rect.SetSize(TSize(size.width(), size.height()));
118
 
    }
119
 
 
120
 
    CVideoPlayerUtility2 *player = static_cast<CVideoPlayerUtility2 *>(m_player.data());
121
 
    if (player) {
122
 
        int err = KErrNone;
123
 
        if (parameters & WindowHandle) {
124
 
            removeDisplayWindow();
125
 
            addDisplayWindow(rect);
126
 
        }
127
 
 
128
 
        if (KErrNone == err) {
129
 
            if (parameters & ScaleFactors) {
130
 
                if (!m_displayWindow)
131
 
                    addDisplayWindow(rect);
132
 
                Q_ASSERT(m_displayWindow);
133
 
                TRAP(err, player->SetVideoExtentL(*m_displayWindow, rect));
134
 
                if (KErrNone == err)
135
 
                    TRAP(err, player->SetWindowClipRectL(*m_displayWindow, rect));
136
 
                if (KErrNone == err)
137
 
                    TRAP(err, player->SetScaleFactorL(*m_displayWindow, m_scaleWidth, m_scaleHeight));
138
 
                if (KErrNone != err)
139
 
                    setError(tr("Video display error"), err);
140
 
            }
141
 
        }
142
 
    }
143
 
 
144
 
    TRACE_EXIT_0();
145
 
}
146
 
 
147
 
void MMF::SurfaceVideoPlayer::addDisplayWindow(const TRect &rect)
148
 
{
149
 
    TRACE_CONTEXT(SurfaceVideoPlayer::addDisplayWindow, EVideoApi);
150
 
    TRACE_ENTRY("rect %d %d - %d %d", rect.iTl.iX, rect.iTl.iY, rect.iBr.iX, rect.iBr.iY);
151
 
 
152
 
    Q_ASSERT(!m_displayWindow);
153
 
    RWindow *window = static_cast<RWindow *>(m_window);
154
 
 
155
 
    TRACE("window 0x%08x", window);
156
 
 
157
 
    if (window) {
158
 
        window->SetBackgroundColor(TRgb(0, 0, 0, 255));
159
 
        CVideoPlayerUtility2 *player = static_cast<CVideoPlayerUtility2 *>(m_player.data());
160
 
        Q_ASSERT(player);
161
 
        TRAPD(err, player->AddDisplayWindowL(m_wsSession, m_screenDevice, *window, rect, rect));
162
 
        if (KErrNone == err)
163
 
            m_displayWindow = window;
164
 
        else
165
 
            setError(tr("Video display error"), err);
166
 
        TRACE("err %d", err);
167
 
    }
168
 
 
169
 
    TRACE_EXIT_0();
170
 
}
171
 
 
172
 
void MMF::SurfaceVideoPlayer::removeDisplayWindow()
173
 
{
174
 
    TRACE_CONTEXT(SurfaceVideoPlayer::removeDisplayWindow, EVideoApi);
175
 
    TRACE("player 0x%08x window 0x%08x", m_player.data(), m_displayWindow);
176
 
 
177
 
    CVideoPlayerUtility2 *player = static_cast<CVideoPlayerUtility2 *>(m_player.data());
178
 
    if (player && m_displayWindow) {
179
 
        player->RemoveDisplayWindow(*m_displayWindow);
180
 
        m_displayWindow = 0;
181
 
    }
182
 
}
183
 
 
184
 
QT_END_NAMESPACE
185