/* This file is part of the KDE project.
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
This library is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 2.1 or 3 of the License.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this library. If not, see .
*/
#include
#include // for qt_QRect2TRect
#include "utils.h"
#include "videooutput_surface.h"
#include "videoplayer_surface.h"
QT_BEGIN_NAMESPACE
using namespace Phonon;
using namespace Phonon::MMF;
// Two-phase constructor idiom is used because construct() calls virtual
// functions and therefore cannot be called from the AbstractVideoPlayer
// C++ constructor.
SurfaceVideoPlayer* SurfaceVideoPlayer::create(MediaObject *parent,
const AbstractPlayer *player)
{
QScopedPointer self(new SurfaceVideoPlayer(parent, player));
self->construct();
return self.take();
}
SurfaceVideoPlayer::SurfaceVideoPlayer(MediaObject *parent, const AbstractPlayer *player)
: AbstractVideoPlayer(parent, player)
, m_displayWindow(0)
{
}
SurfaceVideoPlayer::~SurfaceVideoPlayer()
{
}
//-----------------------------------------------------------------------------
// Public functions
//-----------------------------------------------------------------------------
void MMF::SurfaceVideoPlayer::videoWindowSizeChanged()
{
if (m_videoOutput)
updateScaleFactors(m_videoOutput->videoWindowSize());
}
//-----------------------------------------------------------------------------
// Private functions
//-----------------------------------------------------------------------------
void MMF::SurfaceVideoPlayer::createPlayer()
{
const TInt priority = 0;
const TMdaPriorityPreference preference = EMdaPriorityPreferenceNone;
CVideoPlayerUtility2 *player = 0;
QT_TRAP_THROWING(player = CVideoPlayerUtility2::NewL(*this,
priority, preference));
m_player.reset(player);
}
void MMF::SurfaceVideoPlayer::initVideoOutput()
{
Q_ASSERT(m_videoOutput);
bool connected = connect(
m_videoOutput, SIGNAL(videoWindowSizeChanged()),
this, SLOT(videoWindowSizeChanged())
);
Q_ASSERT(connected);
// Suppress warnings in release builds
Q_UNUSED(connected);
AbstractVideoPlayer::initVideoOutput();
}
void MMF::SurfaceVideoPlayer::prepareCompleted()
{
videoWindowSizeChanged();
}
void MMF::SurfaceVideoPlayer::handleVideoWindowChanged()
{
parametersChanged(WindowHandle);
}
void MMF::SurfaceVideoPlayer::handleParametersChanged(VideoParameters parameters)
{
TRACE_CONTEXT(SurfaceVideoPlayer::handleParametersChanged, EVideoApi);
TRACE_ENTRY("parameters 0x%x", parameters.operator int());
TRect rect;
if (m_videoOutput) {
m_videoOutput->dump();
const QSize size = m_videoOutput->videoWindowSize();
rect.SetSize(TSize(size.width(), size.height()));
}
CVideoPlayerUtility2 *player = static_cast(m_player.data());
if (player) {
int err = KErrNone;
if (parameters & WindowHandle) {
removeDisplayWindow();
addDisplayWindow(rect);
}
if (KErrNone == err) {
if (parameters & ScaleFactors) {
if (!m_displayWindow)
addDisplayWindow(rect);
Q_ASSERT(m_displayWindow);
TRAP(err, player->SetVideoExtentL(*m_displayWindow, rect));
if (KErrNone == err)
TRAP(err, player->SetWindowClipRectL(*m_displayWindow, rect));
if (KErrNone == err)
TRAP(err, player->SetScaleFactorL(*m_displayWindow, m_scaleWidth, m_scaleHeight));
if (KErrNone != err)
setError(tr("Video display error"), err);
}
}
}
TRACE_EXIT_0();
}
void MMF::SurfaceVideoPlayer::addDisplayWindow(const TRect &rect)
{
TRACE_CONTEXT(SurfaceVideoPlayer::addDisplayWindow, EVideoApi);
TRACE_ENTRY("rect %d %d - %d %d", rect.iTl.iX, rect.iTl.iY, rect.iBr.iX, rect.iBr.iY);
Q_ASSERT(!m_displayWindow);
RWindow *window = static_cast(m_window);
TRACE("window 0x%08x", window);
if (window) {
window->SetBackgroundColor(TRgb(0, 0, 0, 255));
CVideoPlayerUtility2 *player = static_cast(m_player.data());
Q_ASSERT(player);
TRAPD(err, player->AddDisplayWindowL(m_wsSession, m_screenDevice, *window, rect, rect));
if (KErrNone == err)
m_displayWindow = window;
else
setError(tr("Video display error"), err);
TRACE("err %d", err);
}
TRACE_EXIT_0();
}
void MMF::SurfaceVideoPlayer::removeDisplayWindow()
{
TRACE_CONTEXT(SurfaceVideoPlayer::removeDisplayWindow, EVideoApi);
TRACE("player 0x%08x window 0x%08x", m_player.data(), m_displayWindow);
CVideoPlayerUtility2 *player = static_cast(m_player.data());
if (player && m_displayWindow) {
player->RemoveDisplayWindow(*m_displayWindow);
m_displayWindow = 0;
}
}
QT_END_NAMESPACE