Multiple fixes:
authorMohammed Sameer <msameer@foolab.org>
Fri, 2 Aug 2013 22:09:27 +0000 (01:09 +0300)
committerMohammed Sameer <msameer@foolab.org>
Fri, 2 Aug 2013 22:09:27 +0000 (01:09 +0300)
- Drop QtCamViewfinder::setDevice() as it's not really needed
- Added Camera::prepareForDeviceChange() signal to notify about the destruction of device.

Viewfinder will reset QtCamDevice viewfinder when Camera emits prepareForDeviceChange().
This allows us to properly restart the pipeline for the secondary camera.

declarative/camera.cpp
declarative/camera.h
declarative/viewfinder.cpp
declarative/viewfinder.h
lib/qtcamdevice.cpp
lib/qtcamgraphicsviewfinder.cpp
lib/qtcamgraphicsviewfinder.h
lib/qtcamviewfinder.h

index 96298b5..2ce7aed 100644 (file)
@@ -153,6 +153,7 @@ bool Camera::setDeviceId(const QVariant& deviceId) {
   }
 
   if (m_dev && m_dev->stop(false)) {
   }
 
   if (m_dev && m_dev->stop(false)) {
+    emit prepareForDeviceChange();
     delete m_dev;
   }
   else if (m_dev) {
     delete m_dev;
   }
   else if (m_dev) {
index f6bb59e..b533991 100644 (file)
@@ -141,6 +141,7 @@ public:
 signals:
   void deviceCountChanged();
   void deviceIdChanged();
 signals:
   void deviceCountChanged();
   void deviceIdChanged();
+  void prepareForDeviceChange();
   void deviceChanged();
   void modeChanged();
   void idleStateChanged();
   void deviceChanged();
   void modeChanged();
   void idleStateChanged();
index 6c9c36f..841fd14 100644 (file)
@@ -43,6 +43,7 @@ Viewfinder::Viewfinder(QQuickItem *parent) :
   m_renderer(0),
   m_cam(0),
   m_conf(0),
   m_renderer(0),
   m_cam(0),
   m_conf(0),
+  m_dev(0),
   m_enabled(true) {
 
 #if defined(QT4)
   m_enabled(true) {
 
 #if defined(QT4)
@@ -92,12 +93,14 @@ void Viewfinder::setCamera(Camera *camera) {
 
   if (m_cam) {
     QObject::disconnect(m_cam, SIGNAL(deviceChanged()), this, SLOT(deviceChanged()));
 
   if (m_cam) {
     QObject::disconnect(m_cam, SIGNAL(deviceChanged()), this, SLOT(deviceChanged()));
+    QObject::disconnect(m_cam, SIGNAL(prepareForDeviceChange()), this, SLOT(prepareForDeviceChange()));
   }
 
   m_cam = camera;
 
   if (m_cam) {
     QObject::connect(m_cam, SIGNAL(deviceChanged()), this, SLOT(deviceChanged()));
   }
 
   m_cam = camera;
 
   if (m_cam) {
     QObject::connect(m_cam, SIGNAL(deviceChanged()), this, SLOT(deviceChanged()));
+    QObject::connect(m_cam, SIGNAL(prepareForDeviceChange()), this, SLOT(prepareForDeviceChange()));
   }
 
   if (isComponentComplete()) {
   }
 
   if (isComponentComplete()) {
@@ -219,10 +222,15 @@ void Viewfinder::deviceChanged() {
     return;
   }
 
     return;
   }
 
-  QtCamDevice *dev = m_cam->device();
+  if (m_dev) {
+    qmlInfo(this) << "Cannot set a new device without cleaning up the existing one";
+    abort();
+  }
+
+  m_dev = m_cam->device();
 
 
-  if (dev) {
-    dev->setViewfinder(this);
+  if (m_dev) {
+    m_dev->setViewfinder(this);
   }
 
   emit renderAreaChanged();
   }
 
   emit renderAreaChanged();
@@ -233,12 +241,6 @@ GstElement *Viewfinder::sinkElement() {
   return m_renderer ? m_renderer->sinkElement() : 0;
 }
 
   return m_renderer ? m_renderer->sinkElement() : 0;
 }
 
-bool Viewfinder::setDevice(QtCamDevice *device) {
-  Q_UNUSED(device);
-
-  return true;
-}
-
 void Viewfinder::stop() {
   if (m_renderer) {
     m_renderer->reset();
 void Viewfinder::stop() {
   if (m_renderer) {
     m_renderer->reset();
@@ -250,3 +252,10 @@ void Viewfinder::updateRequested() {
     update();
   }
 }
     update();
   }
 }
+
+void Viewfinder::prepareForDeviceChange() {
+  if (m_dev) {
+    m_dev->setViewfinder(0);
+    m_dev = 0;
+  }
+}
index 868099c..b289d0a 100644 (file)
@@ -33,6 +33,7 @@
 class QtCamViewfinderRenderer;
 class Camera;
 class CameraConfig;
 class QtCamViewfinderRenderer;
 class Camera;
 class CameraConfig;
+class QtCamDevice;
 
 #if defined(QT4)
 class Viewfinder : public QDeclarativeItem, public QtCamViewfinder {
 
 #if defined(QT4)
 class Viewfinder : public QDeclarativeItem, public QtCamViewfinder {
@@ -76,7 +77,6 @@ public:
 #endif
 
   GstElement *sinkElement();
 #endif
 
   GstElement *sinkElement();
-  bool setDevice(QtCamDevice *device);
   void stop();
 
 signals:
   void stop();
 
 signals:
@@ -93,11 +93,13 @@ protected:
 private slots:
   void deviceChanged();
   void updateRequested();
 private slots:
   void deviceChanged();
   void updateRequested();
+  void prepareForDeviceChange();
 
 private:
   QtCamViewfinderRenderer *m_renderer;
   Camera *m_cam;
   CameraConfig *m_conf;
 
 private:
   QtCamViewfinderRenderer *m_renderer;
   Camera *m_cam;
   CameraConfig *m_conf;
+  QtCamDevice *m_dev;
   bool m_enabled;
 };
 
   bool m_enabled;
 };
 
index d48bba2..38da29b 100644 (file)
@@ -158,10 +158,6 @@ bool QtCamDevice::setViewfinder(QtCamViewfinder *viewfinder) {
     return true;
   }
 
     return true;
   }
 
-  if (!viewfinder->setDevice(this)) {
-    return false;
-  }
-
   d_ptr->viewfinder = viewfinder;
   d_ptr->sink = 0;
 
   d_ptr->viewfinder = viewfinder;
   d_ptr->sink = 0;
 
index 4755c3d..6ace193 100644 (file)
@@ -81,33 +81,6 @@ GstElement *QtCamGraphicsViewfinder::sinkElement() {
   return d_ptr->renderer->sinkElement();
 }
 
   return d_ptr->renderer->sinkElement();
 }
 
-bool QtCamGraphicsViewfinder::setDevice(QtCamDevice *device) {
-  if (device && d_ptr->dev == device) {
-    return true;
-  }
-
-  if (d_ptr->dev) {
-    qWarning() << "QtCamGraphicsViewfinder: viewfinder cannot be replaced.";
-    return false;
-  }
-
-  if (!device) {
-    qWarning() << "QtCamGraphicsViewfinder: viewfinder cannot be unset.";
-    return false;
-  }
-
-  // This is to break the loop.
-  d_ptr->dev = device;
-  if (!device->setViewfinder(this)) {
-    d_ptr->dev = 0;
-    return false;
-  }
-
-  d_ptr->resetBackend();
-
-  return true;
-}
-
 void QtCamGraphicsViewfinder::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
                                    QWidget *widget) {
   Q_UNUSED(widget);
 void QtCamGraphicsViewfinder::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
                                    QWidget *widget) {
   Q_UNUSED(widget);
index 0cc99bc..26d7f8c 100644 (file)
@@ -37,7 +37,6 @@ public:
   virtual ~QtCamGraphicsViewfinder();
 
   virtual GstElement *sinkElement();
   virtual ~QtCamGraphicsViewfinder();
 
   virtual GstElement *sinkElement();
-  virtual bool setDevice(QtCamDevice *device);
   virtual void stop();
 
   virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
   virtual void stop();
 
   virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
index 2f1ff2b..223ec08 100644 (file)
@@ -34,7 +34,6 @@ public:
   virtual ~QtCamViewfinder();
 
   virtual GstElement *sinkElement() = 0;
   virtual ~QtCamViewfinder();
 
   virtual GstElement *sinkElement() = 0;
-  virtual bool setDevice(QtCamDevice *device) = 0;
   virtual void stop() = 0;
 
   virtual QRectF renderArea() const = 0;
   virtual void stop() = 0;
 
   virtual QRectF renderArea() const = 0;