source: trunk/src/3rdparty/phonon/mmf/videoplayer_surface.cpp

Last change on this file was 846, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

File size: 5.5 KB
Line 
1/* This file is part of the KDE project.
2
3Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4
5This library is free software: you can redistribute it and/or modify
6it under the terms of the GNU Lesser General Public License as published by
7the Free Software Foundation, either version 2.1 or 3 of the License.
8
9This library is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU Lesser General Public License for more details.
13
14You should have received a copy of the GNU Lesser General Public License
15along 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
27QT_BEGIN_NAMESPACE
28
29using namespace Phonon;
30using 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.
35SurfaceVideoPlayer* 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
43SurfaceVideoPlayer::SurfaceVideoPlayer(MediaObject *parent, const AbstractPlayer *player)
44 : AbstractVideoPlayer(parent, player)
45 , m_displayWindow(0)
46{
47
48}
49
50SurfaceVideoPlayer::~SurfaceVideoPlayer()
51{
52
53}
54
55
56//-----------------------------------------------------------------------------
57// Public functions
58//-----------------------------------------------------------------------------
59
60void MMF::SurfaceVideoPlayer::videoWindowSizeChanged()
61{
62 if (m_videoOutput)
63 updateScaleFactors(m_videoOutput->videoWindowSize());
64}
65
66
67//-----------------------------------------------------------------------------
68// Private functions
69//-----------------------------------------------------------------------------
70
71void 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
82void 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
98void MMF::SurfaceVideoPlayer::prepareCompleted()
99{
100 videoWindowSizeChanged();
101}
102
103void MMF::SurfaceVideoPlayer::handleVideoWindowChanged()
104{
105 parametersChanged(WindowHandle);
106}
107
108void 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
147void 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
172void 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
184QT_END_NAMESPACE
185
Note: See TracBrowser for help on using the repository browser.