--- 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;
}
/*!