blob: 0e5f7695f5ebb3435c71ddf00c5a96cf192b0573 [file] [log] [blame]
/* 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 <http://www.gnu.org/licenses/>.
*/
#include "videorenderer_default.h"
#ifndef QT_NO_PHONON_VIDEO
#include <QtGui/QWidget>
#include <QtGui/QPainter>
#include <uuids.h>
QT_BEGIN_NAMESPACE
namespace Phonon
{
namespace DS9
{
VideoRendererDefault::~VideoRendererDefault()
{
}
bool VideoRendererDefault::isNative() const
{
return true;
}
VideoRendererDefault::VideoRendererDefault(QWidget *target) : m_target(target)
{
m_target->setAttribute(Qt::WA_PaintOnScreen, true);
m_filter = Filter(CLSID_VideoRenderer, IID_IBaseFilter);
}
QSize VideoRendererDefault::videoSize() const
{
LONG w = 0,
h = 0;
ComPointer<IBasicVideo> basic(m_filter, IID_IBasicVideo);
if (basic) {
basic->GetVideoSize( &w, &h);
}
return QSize(w, h);
}
void VideoRendererDefault::repaintCurrentFrame(QWidget * /*target*/, const QRect & /*rect*/)
{
//nothing to do here: the renderer paints everything
}
void VideoRendererDefault::notifyResize(const QSize &size, Phonon::VideoWidget::AspectRatio aspectRatio,
Phonon::VideoWidget::ScaleMode scaleMode)
{
if (!isActive()) {
ComPointer<IBasicVideo> basic(m_filter, IID_IBasicVideo);
if (basic) {
basic->SetDestinationPosition(0, 0, 0, 0);
}
return;
}
ComPointer<IVideoWindow> video(m_filter, IID_IVideoWindow);
OAHWND owner;
HRESULT hr = video->get_Owner(&owner);
if (FAILED(hr)) {
return;
}
const OAHWND newOwner = reinterpret_cast<OAHWND>(m_target->winId());
if (owner != newOwner) {
video->put_Owner(newOwner);
video->put_MessageDrain(newOwner);
video->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
}
//make sure the widget takes the whole size of the parent
video->SetWindowPosition(0, 0, size.width(), size.height());
const QSize vsize = videoSize();
internalNotifyResize(size, vsize, aspectRatio, scaleMode);
ComPointer<IBasicVideo> basic(m_filter, IID_IBasicVideo);
if (basic) {
basic->SetDestinationPosition(m_dstX, m_dstY, m_dstWidth, m_dstHeight);
}
}
void VideoRendererDefault::applyMixerSettings(qreal /*brightness*/, qreal /*contrast*/, qreal /*m_hue*/, qreal /*saturation*/)
{
//this can't be supported for the default renderer
}
QImage VideoRendererDefault::snapshot() const
{
ComPointer<IBasicVideo> basic(m_filter, IID_IBasicVideo);
if (basic) {
LONG bufferSize = 0;
//1st we get the buffer size
basic->GetCurrentImage(&bufferSize, 0);
QByteArray buffer;
buffer.resize(bufferSize);
HRESULT hr = basic->GetCurrentImage(&bufferSize, reinterpret_cast<long*>(buffer.data()));
if (SUCCEEDED(hr)) {
const BITMAPINFOHEADER *bmi = reinterpret_cast<const BITMAPINFOHEADER*>(buffer.constData());
const int w = qAbs(bmi->biWidth),
h = qAbs(bmi->biHeight);
// Create image and copy data into image.
QImage ret(w, h, QImage::Format_RGB32);
if (!ret.isNull()) {
const char *data = buffer.constData() + bmi->biSize;
const int bytes_per_line = w * sizeof(QRgb);
for (int y = h - 1; y >= 0; --y) {
qMemCopy(ret.scanLine(y), //destination
data, //source
bytes_per_line);
data += bytes_per_line;
}
}
return ret;
}
}
return QImage();
}
}
}
QT_END_NAMESPACE
#endif //QT_NO_PHONON_VIDEO