qtmobility/src/multimedia/qgraphicsvideoitem.cpp
changeset 14 6fbed849b4f4
parent 11 06b8e2af4411
--- a/qtmobility/src/multimedia/qgraphicsvideoitem.cpp	Fri Jun 11 14:26:25 2010 +0300
+++ b/qtmobility/src/multimedia/qgraphicsvideoitem.cpp	Wed Jun 23 19:08:38 2010 +0300
@@ -41,15 +41,15 @@
 
 #include "qgraphicsvideoitem.h"
 
-#include "qmediaobject.h"
-#include "qmediaservice.h"
-#include "qpaintervideosurface_p.h"
-#include "qvideooutputcontrol.h"
-#include "qvideorenderercontrol.h"
+#include <qmediaobject.h>
+#include <qmediaservice.h>
+#include <qpaintervideosurface_p.h>
+#include <qvideorenderercontrol.h>
 
 #include <QtCore/qcoreevent.h>
+#include <QtCore/qpointer.h>
 
-#include <QtMultimedia/qvideosurfaceformat.h>
+#include <qvideosurfaceformat.h>
 
 #if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1)
 #include <QtOpenGL/qgl.h>
@@ -65,7 +65,6 @@
         , surface(0)
         , mediaObject(0)
         , service(0)
-        , outputControl(0)
         , rendererControl(0)
         , aspectRatioMode(Qt::KeepAspectRatio)
         , updatePaintDevice(true)
@@ -76,9 +75,8 @@
     QGraphicsVideoItem *q_ptr;
 
     QPainterVideoSurface *surface;
-    QMediaObject *mediaObject;
+    QPointer<QMediaObject> mediaObject;
     QMediaService *service;
-    QVideoOutputControl *outputControl;
     QVideoRendererControl *rendererControl;
     Qt::AspectRatioMode aspectRatioMode;
     bool updatePaintDevice;
@@ -93,18 +91,14 @@
     void _q_present();
     void _q_formatChanged(const QVideoSurfaceFormat &format);
     void _q_serviceDestroyed();
-    void _q_mediaObjectDestroyed();
 };
 
 void QGraphicsVideoItemPrivate::clearService()
 {
-    if (outputControl) {
-        outputControl->setOutput(QVideoOutputControl::NoOutput);
-        outputControl = 0;
-    }
     if (rendererControl) {
         surface->stop();
         rendererControl->setSurface(0);
+        service->releaseControl(rendererControl);
         rendererControl = 0;
     }
     if (service) {
@@ -164,18 +158,11 @@
 void QGraphicsVideoItemPrivate::_q_serviceDestroyed()
 {
     rendererControl = 0;
-    outputControl = 0;
     service = 0;
 
     surface->stop();
 }
 
-void QGraphicsVideoItemPrivate::_q_mediaObjectDestroyed()
-{
-    mediaObject = 0;
-
-    clearService();
-}
 
 /*!
     \class QGraphicsVideoItem
@@ -193,8 +180,8 @@
     player = new QMediaPlayer(this);
 
     QGraphicsVideoItem *item = new QGraphicsVideoItem;
-    item->setMediaObject(player);
-    graphicsView->scence()->addItem(item);
+    player->setVideoOutput(item);
+    graphicsView->scene()->addItem(item);
     graphicsView->show();
 
     player->setMedia(video);
@@ -229,11 +216,10 @@
 */
 QGraphicsVideoItem::~QGraphicsVideoItem()
 {
-    if (d_ptr->outputControl)
-        d_ptr->outputControl->setOutput(QVideoOutputControl::NoOutput);
-
-    if (d_ptr->rendererControl)
+    if (d_ptr->rendererControl) {
         d_ptr->rendererControl->setSurface(0);
+        d_ptr->service->releaseControl(d_ptr->rendererControl);
+    }
 
     delete d_ptr->surface;
     delete d_ptr;
@@ -250,45 +236,40 @@
     return d_func()->mediaObject;
 }
 
-void QGraphicsVideoItem::setMediaObject(QMediaObject *object)
+bool QGraphicsVideoItem::setMediaObject(QMediaObject *object)
 {
     Q_D(QGraphicsVideoItem);
 
     if (object == d->mediaObject)
-        return;
+        return true;
 
     d->clearService();
 
-    if (d->mediaObject) {
-        disconnect(d->mediaObject, SIGNAL(destroyed()), this, SLOT(_q_mediaObjectDestroyed()));
-        d->mediaObject->unbind(this);
-    }
-
     d->mediaObject = object;
 
     if (d->mediaObject) {
-        d->mediaObject->bind(this);
-
-        connect(d->mediaObject, SIGNAL(destroyed()), this, SLOT(_q_mediaObjectDestroyed()));
-
         d->service = d->mediaObject->service();
 
         if (d->service) {
-            connect(d->service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed()));
+            QMediaControl *control = d->service->requestControl(QVideoRendererControl_iid);
+            if (control) {
+                d->rendererControl = qobject_cast<QVideoRendererControl *>(control);
+
+                if (d->rendererControl) {
+                    d->rendererControl->setSurface(d->surface);
 
-            d->outputControl = qobject_cast<QVideoOutputControl *>(
-                    d->service->control(QVideoOutputControl_iid));
-            d->rendererControl = qobject_cast<QVideoRendererControl *>(
-                    d->service->control(QVideoRendererControl_iid));
+                    connect(d->service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed()));
 
-            if (d->outputControl != 0 && d->rendererControl != 0) {
-                d->rendererControl->setSurface(d->surface);
-
-                if (isVisible())
-                    d->outputControl->setOutput(QVideoOutputControl::RendererOutput);
+                    return true;
+                }
+                if (control)
+                    d->service->releaseControl(control);
             }
         }
     }
+
+    d->mediaObject = 0;
+    return false;
 }
 
 /*!