qtmobility/src/multimedia/qgraphicsvideoitem.cpp
changeset 14 6fbed849b4f4
parent 11 06b8e2af4411
equal deleted inserted replaced
11:06b8e2af4411 14:6fbed849b4f4
    39 **
    39 **
    40 ****************************************************************************/
    40 ****************************************************************************/
    41 
    41 
    42 #include "qgraphicsvideoitem.h"
    42 #include "qgraphicsvideoitem.h"
    43 
    43 
    44 #include "qmediaobject.h"
    44 #include <qmediaobject.h>
    45 #include "qmediaservice.h"
    45 #include <qmediaservice.h>
    46 #include "qpaintervideosurface_p.h"
    46 #include <qpaintervideosurface_p.h>
    47 #include "qvideooutputcontrol.h"
    47 #include <qvideorenderercontrol.h>
    48 #include "qvideorenderercontrol.h"
       
    49 
    48 
    50 #include <QtCore/qcoreevent.h>
    49 #include <QtCore/qcoreevent.h>
    51 
    50 #include <QtCore/qpointer.h>
    52 #include <QtMultimedia/qvideosurfaceformat.h>
    51 
       
    52 #include <qvideosurfaceformat.h>
    53 
    53 
    54 #if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1)
    54 #if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1)
    55 #include <QtOpenGL/qgl.h>
    55 #include <QtOpenGL/qgl.h>
    56 #endif
    56 #endif
    57 
    57 
    63     QGraphicsVideoItemPrivate()
    63     QGraphicsVideoItemPrivate()
    64         : q_ptr(0)
    64         : q_ptr(0)
    65         , surface(0)
    65         , surface(0)
    66         , mediaObject(0)
    66         , mediaObject(0)
    67         , service(0)
    67         , service(0)
    68         , outputControl(0)
       
    69         , rendererControl(0)
    68         , rendererControl(0)
    70         , aspectRatioMode(Qt::KeepAspectRatio)
    69         , aspectRatioMode(Qt::KeepAspectRatio)
    71         , updatePaintDevice(true)
    70         , updatePaintDevice(true)
    72         , rect(0.0, 0.0, 320, 240)
    71         , rect(0.0, 0.0, 320, 240)
    73     {
    72     {
    74     }
    73     }
    75 
    74 
    76     QGraphicsVideoItem *q_ptr;
    75     QGraphicsVideoItem *q_ptr;
    77 
    76 
    78     QPainterVideoSurface *surface;
    77     QPainterVideoSurface *surface;
    79     QMediaObject *mediaObject;
    78     QPointer<QMediaObject> mediaObject;
    80     QMediaService *service;
    79     QMediaService *service;
    81     QVideoOutputControl *outputControl;
       
    82     QVideoRendererControl *rendererControl;
    80     QVideoRendererControl *rendererControl;
    83     Qt::AspectRatioMode aspectRatioMode;
    81     Qt::AspectRatioMode aspectRatioMode;
    84     bool updatePaintDevice;
    82     bool updatePaintDevice;
    85     QRectF rect;
    83     QRectF rect;
    86     QRectF boundingRect;
    84     QRectF boundingRect;
    91     void updateRects();
    89     void updateRects();
    92 
    90 
    93     void _q_present();
    91     void _q_present();
    94     void _q_formatChanged(const QVideoSurfaceFormat &format);
    92     void _q_formatChanged(const QVideoSurfaceFormat &format);
    95     void _q_serviceDestroyed();
    93     void _q_serviceDestroyed();
    96     void _q_mediaObjectDestroyed();
       
    97 };
    94 };
    98 
    95 
    99 void QGraphicsVideoItemPrivate::clearService()
    96 void QGraphicsVideoItemPrivate::clearService()
   100 {
    97 {
   101     if (outputControl) {
       
   102         outputControl->setOutput(QVideoOutputControl::NoOutput);
       
   103         outputControl = 0;
       
   104     }
       
   105     if (rendererControl) {
    98     if (rendererControl) {
   106         surface->stop();
    99         surface->stop();
   107         rendererControl->setSurface(0);
   100         rendererControl->setSurface(0);
       
   101         service->releaseControl(rendererControl);
   108         rendererControl = 0;
   102         rendererControl = 0;
   109     }
   103     }
   110     if (service) {
   104     if (service) {
   111         QObject::disconnect(service, SIGNAL(destroyed()), q_ptr, SLOT(_q_serviceDestroyed()));
   105         QObject::disconnect(service, SIGNAL(destroyed()), q_ptr, SLOT(_q_serviceDestroyed()));
   112         service = 0;
   106         service = 0;
   162 }
   156 }
   163 
   157 
   164 void QGraphicsVideoItemPrivate::_q_serviceDestroyed()
   158 void QGraphicsVideoItemPrivate::_q_serviceDestroyed()
   165 {
   159 {
   166     rendererControl = 0;
   160     rendererControl = 0;
   167     outputControl = 0;
       
   168     service = 0;
   161     service = 0;
   169 
   162 
   170     surface->stop();
   163     surface->stop();
   171 }
   164 }
   172 
   165 
   173 void QGraphicsVideoItemPrivate::_q_mediaObjectDestroyed()
       
   174 {
       
   175     mediaObject = 0;
       
   176 
       
   177     clearService();
       
   178 }
       
   179 
   166 
   180 /*!
   167 /*!
   181     \class QGraphicsVideoItem
   168     \class QGraphicsVideoItem
   182 
   169 
   183     \brief The QGraphicsVideoItem class provides a graphics item which display video produced by a QMediaObject.
   170     \brief The QGraphicsVideoItem class provides a graphics item which display video produced by a QMediaObject.
   191 
   178 
   192     \code
   179     \code
   193     player = new QMediaPlayer(this);
   180     player = new QMediaPlayer(this);
   194 
   181 
   195     QGraphicsVideoItem *item = new QGraphicsVideoItem;
   182     QGraphicsVideoItem *item = new QGraphicsVideoItem;
   196     item->setMediaObject(player);
   183     player->setVideoOutput(item);
   197     graphicsView->scence()->addItem(item);
   184     graphicsView->scene()->addItem(item);
   198     graphicsView->show();
   185     graphicsView->show();
   199 
   186 
   200     player->setMedia(video);
   187     player->setMedia(video);
   201     player->play();
   188     player->play();
   202     \endcode
   189     \endcode
   227 /*!
   214 /*!
   228     Destroys a video graphics item.
   215     Destroys a video graphics item.
   229 */
   216 */
   230 QGraphicsVideoItem::~QGraphicsVideoItem()
   217 QGraphicsVideoItem::~QGraphicsVideoItem()
   231 {
   218 {
   232     if (d_ptr->outputControl)
   219     if (d_ptr->rendererControl) {
   233         d_ptr->outputControl->setOutput(QVideoOutputControl::NoOutput);
       
   234 
       
   235     if (d_ptr->rendererControl)
       
   236         d_ptr->rendererControl->setSurface(0);
   220         d_ptr->rendererControl->setSurface(0);
       
   221         d_ptr->service->releaseControl(d_ptr->rendererControl);
       
   222     }
   237 
   223 
   238     delete d_ptr->surface;
   224     delete d_ptr->surface;
   239     delete d_ptr;
   225     delete d_ptr;
   240 }
   226 }
   241 
   227 
   248 QMediaObject *QGraphicsVideoItem::mediaObject() const
   234 QMediaObject *QGraphicsVideoItem::mediaObject() const
   249 {
   235 {
   250     return d_func()->mediaObject;
   236     return d_func()->mediaObject;
   251 }
   237 }
   252 
   238 
   253 void QGraphicsVideoItem::setMediaObject(QMediaObject *object)
   239 bool QGraphicsVideoItem::setMediaObject(QMediaObject *object)
   254 {
   240 {
   255     Q_D(QGraphicsVideoItem);
   241     Q_D(QGraphicsVideoItem);
   256 
   242 
   257     if (object == d->mediaObject)
   243     if (object == d->mediaObject)
   258         return;
   244         return true;
   259 
   245 
   260     d->clearService();
   246     d->clearService();
   261 
   247 
       
   248     d->mediaObject = object;
       
   249 
   262     if (d->mediaObject) {
   250     if (d->mediaObject) {
   263         disconnect(d->mediaObject, SIGNAL(destroyed()), this, SLOT(_q_mediaObjectDestroyed()));
       
   264         d->mediaObject->unbind(this);
       
   265     }
       
   266 
       
   267     d->mediaObject = object;
       
   268 
       
   269     if (d->mediaObject) {
       
   270         d->mediaObject->bind(this);
       
   271 
       
   272         connect(d->mediaObject, SIGNAL(destroyed()), this, SLOT(_q_mediaObjectDestroyed()));
       
   273 
       
   274         d->service = d->mediaObject->service();
   251         d->service = d->mediaObject->service();
   275 
   252 
   276         if (d->service) {
   253         if (d->service) {
   277             connect(d->service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed()));
   254             QMediaControl *control = d->service->requestControl(QVideoRendererControl_iid);
   278 
   255             if (control) {
   279             d->outputControl = qobject_cast<QVideoOutputControl *>(
   256                 d->rendererControl = qobject_cast<QVideoRendererControl *>(control);
   280                     d->service->control(QVideoOutputControl_iid));
   257 
   281             d->rendererControl = qobject_cast<QVideoRendererControl *>(
   258                 if (d->rendererControl) {
   282                     d->service->control(QVideoRendererControl_iid));
   259                     d->rendererControl->setSurface(d->surface);
   283 
   260 
   284             if (d->outputControl != 0 && d->rendererControl != 0) {
   261                     connect(d->service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed()));
   285                 d->rendererControl->setSurface(d->surface);
   262 
   286 
   263                     return true;
   287                 if (isVisible())
   264                 }
   288                     d->outputControl->setOutput(QVideoOutputControl::RendererOutput);
   265                 if (control)
       
   266                     d->service->releaseControl(control);
   289             }
   267             }
   290         }
   268         }
   291     }
   269     }
       
   270 
       
   271     d->mediaObject = 0;
       
   272     return false;
   292 }
   273 }
   293 
   274 
   294 /*!
   275 /*!
   295     \property QGraphicsVideoItem::aspectRatioMode
   276     \property QGraphicsVideoItem::aspectRatioMode
   296     \brief how a video is scaled to fit the graphics item's size.
   277     \brief how a video is scaled to fit the graphics item's size.