/* 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 |