src/3rdparty/phonon/ds9/videorenderer_default.cpp
changeset 30 5dc02b23752f
equal deleted inserted replaced
29:b72c6db6890b 30:5dc02b23752f
       
     1 /*  This file is part of the KDE project.
       
     2 
       
     3 Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 
       
     5 This library is free software: you can redistribute it and/or modify
       
     6 it under the terms of the GNU Lesser General Public License as published by
       
     7 the Free Software Foundation, either version 2.1 or 3 of the License.
       
     8 
       
     9 This library is distributed in the hope that it will be useful,
       
    10 but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
       
    12 GNU Lesser General Public License for more details.
       
    13 
       
    14 You should have received a copy of the GNU Lesser General Public License
       
    15 along with this library.  If not, see <http://www.gnu.org/licenses/>.
       
    16 */
       
    17 
       
    18 
       
    19 #include "videorenderer_default.h"
       
    20 
       
    21 #ifndef QT_NO_PHONON_VIDEO
       
    22 
       
    23 #include <QtGui/QWidget>
       
    24 #include <QtGui/QPainter>
       
    25 
       
    26 #include <uuids.h>
       
    27 
       
    28 QT_BEGIN_NAMESPACE
       
    29 
       
    30 
       
    31 namespace Phonon
       
    32 {
       
    33     namespace DS9
       
    34     {
       
    35         VideoRendererDefault::~VideoRendererDefault()
       
    36         {
       
    37         }
       
    38 
       
    39         bool VideoRendererDefault::isNative() const
       
    40         {
       
    41             return true;
       
    42         }
       
    43 
       
    44 
       
    45         VideoRendererDefault::VideoRendererDefault(QWidget *target) : m_target(target)
       
    46         {
       
    47             m_target->setAttribute(Qt::WA_PaintOnScreen, true);
       
    48             m_filter = Filter(CLSID_VideoRenderer, IID_IBaseFilter);
       
    49         }
       
    50 
       
    51         QSize VideoRendererDefault::videoSize() const
       
    52         {
       
    53             LONG w = 0,
       
    54                 h = 0;
       
    55             ComPointer<IBasicVideo> basic(m_filter, IID_IBasicVideo);
       
    56             if (basic) {
       
    57                 basic->GetVideoSize( &w, &h);
       
    58             }
       
    59             return QSize(w, h);
       
    60         }
       
    61 
       
    62         void VideoRendererDefault::repaintCurrentFrame(QWidget * /*target*/, const QRect & /*rect*/)
       
    63         {
       
    64             //nothing to do here: the renderer paints everything
       
    65         }
       
    66 
       
    67         void VideoRendererDefault::notifyResize(const QSize &size, Phonon::VideoWidget::AspectRatio aspectRatio,
       
    68             Phonon::VideoWidget::ScaleMode scaleMode)
       
    69         {
       
    70             if (!isActive()) {
       
    71                 ComPointer<IBasicVideo> basic(m_filter, IID_IBasicVideo);
       
    72                 if (basic) {
       
    73                     basic->SetDestinationPosition(0, 0, 0, 0);
       
    74                 }
       
    75                 return;
       
    76             }
       
    77 
       
    78             ComPointer<IVideoWindow> video(m_filter, IID_IVideoWindow);
       
    79 
       
    80             OAHWND owner;
       
    81             HRESULT hr = video->get_Owner(&owner);
       
    82             if (FAILED(hr)) {
       
    83                 return;
       
    84             }
       
    85 
       
    86             const OAHWND newOwner = reinterpret_cast<OAHWND>(m_target->winId());
       
    87             if (owner != newOwner) {
       
    88                 video->put_Owner(newOwner);
       
    89                 video->put_MessageDrain(newOwner);
       
    90                 video->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
       
    91             }
       
    92 
       
    93             //make sure the widget takes the whole size of the parent
       
    94             video->SetWindowPosition(0, 0, size.width(), size.height());
       
    95 
       
    96             const QSize vsize = videoSize();
       
    97             internalNotifyResize(size, vsize, aspectRatio, scaleMode);
       
    98 
       
    99             ComPointer<IBasicVideo> basic(m_filter, IID_IBasicVideo);
       
   100             if (basic) {
       
   101                 basic->SetDestinationPosition(m_dstX, m_dstY, m_dstWidth, m_dstHeight);
       
   102             }
       
   103         }
       
   104 
       
   105         void VideoRendererDefault::applyMixerSettings(qreal /*brightness*/, qreal /*contrast*/, qreal /*m_hue*/, qreal /*saturation*/)
       
   106         {
       
   107             //this can't be supported for the default renderer
       
   108         }
       
   109 
       
   110         QImage VideoRendererDefault::snapshot() const
       
   111         {
       
   112             ComPointer<IBasicVideo> basic(m_filter, IID_IBasicVideo);
       
   113             if (basic) {
       
   114                 LONG bufferSize = 0;
       
   115                 //1st we get the buffer size
       
   116                 basic->GetCurrentImage(&bufferSize, 0);
       
   117 
       
   118                 QByteArray buffer;
       
   119                 buffer.resize(bufferSize);
       
   120                 HRESULT hr = basic->GetCurrentImage(&bufferSize, reinterpret_cast<long*>(buffer.data()));
       
   121 
       
   122                 if (SUCCEEDED(hr)) {
       
   123 
       
   124                     const BITMAPINFOHEADER  *bmi = reinterpret_cast<const BITMAPINFOHEADER*>(buffer.constData());
       
   125 
       
   126                     const int w = qAbs(bmi->biWidth),
       
   127                         h = qAbs(bmi->biHeight);
       
   128 
       
   129                     // Create image and copy data into image.
       
   130                     QImage ret(w, h, QImage::Format_RGB32);
       
   131 
       
   132                     if (!ret.isNull()) {
       
   133                         const char *data = buffer.constData() + bmi->biSize;
       
   134                         const int bytes_per_line = w * sizeof(QRgb);
       
   135                         for (int y = h - 1; y >= 0; --y) {
       
   136                             qMemCopy(ret.scanLine(y), //destination
       
   137                                 data,     //source
       
   138                                 bytes_per_line);
       
   139                             data += bytes_per_line;
       
   140                         }
       
   141                     }
       
   142                     return ret;
       
   143                 }
       
   144             }
       
   145             return QImage();
       
   146         }
       
   147 
       
   148     }
       
   149 }
       
   150 
       
   151 QT_END_NAMESPACE
       
   152 
       
   153 #endif //QT_NO_PHONON_VIDEO