/* 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 "videorenderer_default.h" #ifndef QT_NO_PHONON_VIDEO #include #include #include 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 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 basic(m_filter, IID_IBasicVideo); if (basic) { basic->SetDestinationPosition(0, 0, 0, 0); } return; } ComPointer video(m_filter, IID_IVideoWindow); OAHWND owner; HRESULT hr = video->get_Owner(&owner); if (FAILED(hr)) { return; } const OAHWND newOwner = reinterpret_cast(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 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 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(buffer.data())); if (SUCCEEDED(hr)) { const BITMAPINFOHEADER *bmi = reinterpret_cast(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