qtmobility/src/multimedia/qgraphicsvideoitem_maemo5.cpp
changeset 14 6fbed849b4f4
parent 11 06b8e2af4411
equal deleted inserted replaced
11:06b8e2af4411 14:6fbed849b4f4
    48 #include <QtGui/qscrollbar.h>
    48 #include <QtGui/qscrollbar.h>
    49 #include <QtGui/qx11info_x11.h>
    49 #include <QtGui/qx11info_x11.h>
    50 
    50 
    51 #include "qgraphicsvideoitem.h"
    51 #include "qgraphicsvideoitem.h"
    52 
    52 
    53 #include "qmediaobject.h"
    53 #include <qmediaobject.h>
    54 #include "qmediaservice.h"
    54 #include <qmediaservice.h>
    55 #include "qpaintervideosurface_p.h"
    55 #include <qpaintervideosurface_p.h>
    56 #include "qvideooutputcontrol.h"
    56 #include <qvideorenderercontrol.h>
    57 #include "qvideorenderercontrol.h"
    57 
    58 
    58 #include <qvideosurfaceformat.h>
    59 #include <QtMultimedia/qvideosurfaceformat.h>
       
    60 
    59 
    61 #include "qxvideosurface_maemo5_p.h"
    60 #include "qxvideosurface_maemo5_p.h"
    62 
    61 
    63 
    62 
    64 QT_BEGIN_NAMESPACE
    63 QT_BEGIN_NAMESPACE
   227     QGraphicsVideoItemPrivate()
   226     QGraphicsVideoItemPrivate()
   228         : q_ptr(0)
   227         : q_ptr(0)
   229         , surface(0)
   228         , surface(0)
   230         , mediaObject(0)
   229         , mediaObject(0)
   231         , service(0)
   230         , service(0)
   232         , outputControl(0)
       
   233         , rendererControl(0)
   231         , rendererControl(0)
   234         , savedViewportUpdateMode(QGraphicsView::FullViewportUpdate)
   232         , savedViewportUpdateMode(QGraphicsView::FullViewportUpdate)
   235         , aspectRatioMode(Qt::KeepAspectRatio)
   233         , aspectRatioMode(Qt::KeepAspectRatio)
   236         , rect(0.0, 0.0, 320, 240)
   234         , rect(0.0, 0.0, 320, 240)
   237         , softwareRenderingEnabled(false)
   235         , softwareRenderingEnabled(false)
   241     QGraphicsVideoItem *q_ptr;
   239     QGraphicsVideoItem *q_ptr;
   242 
   240 
   243     QXVideoSurface *surface;
   241     QXVideoSurface *surface;
   244     QMediaObject *mediaObject;
   242     QMediaObject *mediaObject;
   245     QMediaService *service;
   243     QMediaService *service;
   246     QVideoOutputControl *outputControl;
       
   247     QVideoRendererControl *rendererControl;
   244     QVideoRendererControl *rendererControl;
   248     QPointer<QGraphicsView> currentView;
   245     QPointer<QGraphicsView> currentView;
   249     QGraphicsView::ViewportUpdateMode savedViewportUpdateMode;
   246     QGraphicsView::ViewportUpdateMode savedViewportUpdateMode;
   250 
   247 
   251     Qt::AspectRatioMode aspectRatioMode;
   248     Qt::AspectRatioMode aspectRatioMode;
   270     void _q_mediaObjectDestroyed();
   267     void _q_mediaObjectDestroyed();
   271 };
   268 };
   272 
   269 
   273 void QGraphicsVideoItemPrivate::clearService()
   270 void QGraphicsVideoItemPrivate::clearService()
   274 {
   271 {
   275     if (outputControl) {
       
   276         outputControl->setOutput(QVideoOutputControl::NoOutput);
       
   277         outputControl = 0;
       
   278     }
       
   279     if (rendererControl) {
   272     if (rendererControl) {
   280         surface->stop();
   273         surface->stop();
   281         rendererControl->setSurface(0);
   274         rendererControl->setSurface(0);
       
   275         service->releaseControl(rendererControl);
   282         rendererControl = 0;
   276         rendererControl = 0;
   283     }
   277     }
       
   278 
   284     if (service) {
   279     if (service) {
   285         QObject::disconnect(service, SIGNAL(destroyed()), q_ptr, SLOT(_q_serviceDestroyed()));
   280         QObject::disconnect(service, SIGNAL(destroyed()), q_ptr, SLOT(_q_serviceDestroyed()));
   286         service = 0;
   281         service = 0;
   287     }
   282     }
   288 }
   283 }
   386 }
   381 }
   387 
   382 
   388 void QGraphicsVideoItemPrivate::_q_serviceDestroyed()
   383 void QGraphicsVideoItemPrivate::_q_serviceDestroyed()
   389 {
   384 {
   390     rendererControl = 0;
   385     rendererControl = 0;
   391     outputControl = 0;
       
   392     service = 0;
   386     service = 0;
   393 
   387 
   394     surface->stop();
   388     surface->stop();
   395 }
   389 }
   396 
   390 
   419     connect(d_ptr->surface, SIGNAL(activeChanged(bool)), this, SLOT(_q_present()));
   413     connect(d_ptr->surface, SIGNAL(activeChanged(bool)), this, SLOT(_q_present()));
   420 }
   414 }
   421 
   415 
   422 QGraphicsVideoItem::~QGraphicsVideoItem()
   416 QGraphicsVideoItem::~QGraphicsVideoItem()
   423 {
   417 {
   424 
   418     if (d_ptr->rendererControl) {
   425     if (d_ptr->outputControl)
       
   426         d_ptr->outputControl->setOutput(QVideoOutputControl::NoOutput);
       
   427 
       
   428     if (d_ptr->rendererControl)
       
   429         d_ptr->rendererControl->setSurface(0);
   419         d_ptr->rendererControl->setSurface(0);
       
   420         d_ptr->service->releaseControl(d_ptr->rendererControl);
       
   421     }
   430 
   422 
   431     if (d_ptr->currentView)
   423     if (d_ptr->currentView)
   432         d_ptr->currentView->setViewportUpdateMode(d_ptr->savedViewportUpdateMode);
   424         d_ptr->currentView->setViewportUpdateMode(d_ptr->savedViewportUpdateMode);
   433 
   425 
   434     delete d_ptr->surface;
   426     delete d_ptr->surface;
   438 QMediaObject *QGraphicsVideoItem::mediaObject() const
   430 QMediaObject *QGraphicsVideoItem::mediaObject() const
   439 {
   431 {
   440     return d_func()->mediaObject;
   432     return d_func()->mediaObject;
   441 }
   433 }
   442 
   434 
   443 void QGraphicsVideoItem::setMediaObject(QMediaObject *object)
   435 bool QGraphicsVideoItem::setMediaObject(QMediaObject *object)
   444 {
   436 {
   445     Q_D(QGraphicsVideoItem);
   437     Q_D(QGraphicsVideoItem);
   446 
   438 
   447     if (object == d->mediaObject)
   439     if (object == d->mediaObject)
   448         return;
   440         return true;
   449 
   441 
   450     d->clearService();
   442     d->clearService();
   451 
   443 
       
   444     d->mediaObject = object;
       
   445 
   452     if (d->mediaObject) {
   446     if (d->mediaObject) {
   453         disconnect(d->mediaObject, SIGNAL(destroyed()), this, SLOT(_q_mediaObjectDestroyed()));
       
   454         d->mediaObject->unbind(this);
       
   455     }
       
   456 
       
   457     d->mediaObject = object;
       
   458 
       
   459     if (d->mediaObject) {
       
   460         d->mediaObject->bind(this);
       
   461 
       
   462         connect(d->mediaObject, SIGNAL(destroyed()), this, SLOT(_q_mediaObjectDestroyed()));
       
   463 
       
   464         d->service = d->mediaObject->service();
   447         d->service = d->mediaObject->service();
   465 
   448 
   466         if (d->service) {
   449         if (d->service) {
   467             connect(d->service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed()));
       
   468 
       
   469             d->outputControl = qobject_cast<QVideoOutputControl *>(
       
   470                     d->service->control(QVideoOutputControl_iid));
       
   471             d->rendererControl = qobject_cast<QVideoRendererControl *>(
   450             d->rendererControl = qobject_cast<QVideoRendererControl *>(
   472                     d->service->control(QVideoRendererControl_iid));
   451                     d->service->requestControl(QVideoRendererControl_iid));
   473 
   452 
   474             if (d->outputControl != 0 && d->rendererControl != 0) {
   453             if (d->rendererControl != 0) {
       
   454                 connect(d->service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed()));
   475                 d->rendererControl->setSurface(d->surface);
   455                 d->rendererControl->setSurface(d->surface);
   476 
   456                 return true;
   477                 if (isVisible())
       
   478                     d->outputControl->setOutput(QVideoOutputControl::RendererOutput);
       
   479             }
   457             }
       
   458 
   480         }
   459         }
   481     }
   460     }
       
   461 
       
   462     return false;
   482 }
   463 }
   483 
   464 
   484 Qt::AspectRatioMode QGraphicsVideoItem::aspectRatioMode() const
   465 Qt::AspectRatioMode QGraphicsVideoItem::aspectRatioMode() const
   485 {
   466 {
   486     return d_func()->aspectRatioMode;
   467     return d_func()->aspectRatioMode;
   621 
   602 
   622 QVariant QGraphicsVideoItem::itemChange(GraphicsItemChange change, const QVariant &value)
   603 QVariant QGraphicsVideoItem::itemChange(GraphicsItemChange change, const QVariant &value)
   623 {
   604 {
   624     Q_D(QGraphicsVideoItem);
   605     Q_D(QGraphicsVideoItem);
   625 
   606 
   626     if (change == ItemVisibleChange && d->outputControl != 0 && d->rendererControl != 0) {
   607     if (change == ItemScenePositionHasChanged) {
   627         if (value.toBool()) {
       
   628             d->outputControl->setOutput(QVideoOutputControl::RendererOutput);
       
   629 
       
   630             return d->outputControl->output() == QVideoOutputControl::RendererOutput;
       
   631         } else {
       
   632             d->outputControl->setOutput(QVideoOutputControl::NoOutput);
       
   633 
       
   634             return value;
       
   635         }
       
   636     } else if (change == ItemScenePositionHasChanged) {
       
   637         update(boundingRect());
   608         update(boundingRect());
   638     } else {
   609     } else {
   639         return QGraphicsItem::itemChange(change, value);
   610         return QGraphicsItem::itemChange(change, value);
   640     }
   611     }
   641 
   612