summaryrefslogtreecommitdiffstats
path: root/plugins/multimedia/gstreamer/camerabin
diff options
context:
space:
mode:
authorEckhart Koppen <eckhart.koppen@nokia.com>2011-04-20 11:52:57 +0300
committerEckhart Koppen <eckhart.koppen@nokia.com>2011-04-20 11:52:57 +0300
commitfb3e9bc2d941462f1244aaf0ea79425a307f883d (patch)
treeafce91959098ec887ce466abc6e40342261df3db /plugins/multimedia/gstreamer/camerabin
parentc61d909c7b815319e40ba27d7f84e92aa5f1f946 (diff)
parent6f0dc7cc40dd63763a581a7fb6d4e76649b8026c (diff)
Merge branch 'master' into 1.2.0v1.2.0
Diffstat (limited to 'plugins/multimedia/gstreamer/camerabin')
-rw-r--r--plugins/multimedia/gstreamer/camerabin/camerabincontrol.cpp9
-rw-r--r--plugins/multimedia/gstreamer/camerabin/camerabincontrol.h1
-rw-r--r--plugins/multimedia/gstreamer/camerabin/camerabinimagecapture.cpp6
-rw-r--r--plugins/multimedia/gstreamer/camerabin/camerabinrecorder.cpp1
-rw-r--r--plugins/multimedia/gstreamer/camerabin/camerabinresourcepolicy.cpp194
-rw-r--r--plugins/multimedia/gstreamer/camerabin/camerabinresourcepolicy.h23
6 files changed, 94 insertions, 140 deletions
diff --git a/plugins/multimedia/gstreamer/camerabin/camerabincontrol.cpp b/plugins/multimedia/gstreamer/camerabin/camerabincontrol.cpp
index 56b9e84bc5..8c5a31b627 100644
--- a/plugins/multimedia/gstreamer/camerabin/camerabincontrol.cpp
+++ b/plugins/multimedia/gstreamer/camerabin/camerabincontrol.cpp
@@ -87,6 +87,8 @@ CameraBinControl::CameraBinControl(CameraBinSession *session)
SLOT(reloadLater()));
connect(m_session, SIGNAL(readyChanged(bool)),
SLOT(reloadLater()));
+ connect(m_session, SIGNAL(error(int,QString)),
+ SLOT(handleCameraError(int,QString)));
m_resourcePolicy = new CamerabinResourcePolicy(this);
connect(m_resourcePolicy, SIGNAL(resourcesGranted()),
@@ -121,6 +123,7 @@ void CameraBinControl::setCaptureMode(QCamera::CaptureMode mode)
CamerabinResourcePolicy::ImageCaptureResources :
CamerabinResourcePolicy::VideoCaptureResources);
}
+ emit captureModeChanged(mode);
}
}
@@ -293,6 +296,12 @@ void CameraBinControl::handleBusyChanged(bool busy)
}
}
+void CameraBinControl::handleCameraError(int errorCode, const QString &errorString)
+{
+ emit error(errorCode, errorString);
+ setState(QCamera::UnloadedState);
+}
+
void CameraBinControl::delayedReload()
{
#ifdef CAMEABIN_DEBUG
diff --git a/plugins/multimedia/gstreamer/camerabin/camerabincontrol.h b/plugins/multimedia/gstreamer/camerabin/camerabincontrol.h
index 5e45d7a4df..bab17e5a49 100644
--- a/plugins/multimedia/gstreamer/camerabin/camerabincontrol.h
+++ b/plugins/multimedia/gstreamer/camerabin/camerabincontrol.h
@@ -82,6 +82,7 @@ private slots:
void handleResourcesLost();
void handleBusyChanged(bool);
+ void handleCameraError(int error, const QString &errorString);
private:
void updateSupportedResolutions(const QString &device);
diff --git a/plugins/multimedia/gstreamer/camerabin/camerabinimagecapture.cpp b/plugins/multimedia/gstreamer/camerabin/camerabinimagecapture.cpp
index 18a6b664b9..3df1105bc3 100644
--- a/plugins/multimedia/gstreamer/camerabin/camerabinimagecapture.cpp
+++ b/plugins/multimedia/gstreamer/camerabin/camerabinimagecapture.cpp
@@ -104,6 +104,12 @@ bool CameraBinImageCapture::isReadyForCapture() const
int CameraBinImageCapture::capture(const QString &fileName)
{
m_requestId++;
+
+ if (!m_ready) {
+ emit error(m_requestId, QCameraImageCapture::NotReadyError, tr("Camera not ready"));
+ return m_requestId;
+ }
+
#ifdef DEBUG_CAPTURE
qDebug() << Q_FUNC_INFO << m_requestId << fileName;
#endif
diff --git a/plugins/multimedia/gstreamer/camerabin/camerabinrecorder.cpp b/plugins/multimedia/gstreamer/camerabin/camerabinrecorder.cpp
index a29831129c..0cd8a5aaf9 100644
--- a/plugins/multimedia/gstreamer/camerabin/camerabinrecorder.cpp
+++ b/plugins/multimedia/gstreamer/camerabin/camerabinrecorder.cpp
@@ -51,7 +51,6 @@ CameraBinRecorder::CameraBinRecorder(CameraBinSession *session)
m_state(QMediaRecorder::StoppedState)
{
connect(m_session, SIGNAL(stateChanged(QCamera::State)), SLOT(updateState()));
- connect(m_session, SIGNAL(error(int,QString)), SIGNAL(error(int,QString)));
connect(m_session, SIGNAL(durationChanged(qint64)), SIGNAL(durationChanged(qint64)));
connect(m_session, SIGNAL(mutedChanged(bool)), this, SIGNAL(mutedChanged(bool)));
}
diff --git a/plugins/multimedia/gstreamer/camerabin/camerabinresourcepolicy.cpp b/plugins/multimedia/gstreamer/camerabin/camerabinresourcepolicy.cpp
index 0d1357ad16..db9218c4a2 100644
--- a/plugins/multimedia/gstreamer/camerabin/camerabinresourcepolicy.cpp
+++ b/plugins/multimedia/gstreamer/camerabin/camerabinresourcepolicy.cpp
@@ -47,6 +47,7 @@
//#define DEBUG_RESOURCE_POLICY
#include <QtCore/qdebug.h>
+#include <QtCore/qset.h>
#ifdef HAVE_RESOURCE_POLICY
#include <policy/resource.h>
@@ -56,57 +57,39 @@
CamerabinResourcePolicy::CamerabinResourcePolicy(QObject *parent) :
QObject(parent),
- m_resourceSet(NoResources)
+ m_resourceSet(NoResources),
+ m_releasingResources(false)
{
#ifdef HAVE_RESOURCE_POLICY
- ResourcePolicy::ResourceSet *resourceSet;
-
//loaded resource set is also kept requested for image and video capture sets
- resourceSet = new ResourcePolicy::ResourceSet("camera", this);
-
- resourceSet->addResource(ResourcePolicy::VideoRecorderType);
- ResourcePolicy::LensCoverResource *lensCoverResource = new ResourcePolicy::LensCoverResource;
- lensCoverResource->setOptional(true);
- resourceSet->addResourceObject(lensCoverResource);
- resourceSet->update();
-
- m_resources.append(resourceSet);
- m_resourceStatuses.append(Initial);
-
- //still image resources:
- resourceSet = new ResourcePolicy::ResourceSet("camera", this);
- resourceSet->addResource(ResourcePolicy::VideoPlaybackType);
- resourceSet->addResource(ResourcePolicy::LedsType);
- resourceSet->update();
-
- m_resources.append(resourceSet);
- m_resourceStatuses.append(Initial);
-
- //video capture resources:
- resourceSet = new ResourcePolicy::ResourceSet("camera", this);
-
- resourceSet->addResource(ResourcePolicy::VideoPlaybackType);
- resourceSet->addResource(ResourcePolicy::AudioPlaybackType);
- resourceSet->addResource(ResourcePolicy::AudioRecorderType);
- resourceSet->addResource(ResourcePolicy::LedsType);
- resourceSet->update();
-
- m_resources.append(resourceSet);
- m_resourceStatuses.append(Initial);
-
- foreach (ResourcePolicy::ResourceSet *resource, m_resources) {
- connect(resource, SIGNAL(resourcesGranted(const QList<ResourcePolicy::ResourceType>)),
- this, SLOT(handleResourcesGranted()));
- connect(resource, SIGNAL(resourcesDenied()),
- this, SLOT(handleResourcesDenied()));
- connect(resource, SIGNAL(lostResources()),
- this, SLOT(handleResourcesLost()));
- }
+ m_resource = new ResourcePolicy::ResourceSet("camera");
+ m_resource->setAlwaysReply();
+ m_resource->initAndConnect();
+
+ connect(m_resource, SIGNAL(resourcesGranted(const QList<ResourcePolicy::ResourceType>)),
+ SIGNAL(resourcesGranted()));
+ connect(m_resource, SIGNAL(resourcesDenied()), SIGNAL(resourcesDenied()));
+ connect(m_resource, SIGNAL(lostResources()), SIGNAL(resourcesLost()));
+ connect(m_resource, SIGNAL(resourcesReleased()), SLOT(handleResourcesReleased()));
#endif
}
CamerabinResourcePolicy::~CamerabinResourcePolicy()
{
+#ifdef HAVE_RESOURCE_POLICY
+ //ensure the resources are released
+ if (m_resourceSet != NoResources)
+ setResourceSet(NoResources);
+
+ //don't delete the resource set until resources are released
+ if (m_releasingResources) {
+ m_resource->connect(m_resource, SIGNAL(resourcesReleased()),
+ SLOT(deleteLater()));
+ } else {
+ delete m_resource;
+ m_resource = 0;
+ }
+#endif
}
CamerabinResourcePolicy::ResourceSet CamerabinResourcePolicy::resourceSet() const
@@ -116,8 +99,7 @@ CamerabinResourcePolicy::ResourceSet CamerabinResourcePolicy::resourceSet() cons
void CamerabinResourcePolicy::setResourceSet(CamerabinResourcePolicy::ResourceSet set)
{
- if (m_resourceSet == set)
- return;
+ CamerabinResourcePolicy::ResourceSet oldSet = m_resourceSet;
m_resourceSet = set;
#ifdef DEBUG_RESOURCE_POLICY
@@ -125,108 +107,82 @@ void CamerabinResourcePolicy::setResourceSet(CamerabinResourcePolicy::ResourceSe
#endif
#ifdef HAVE_RESOURCE_POLICY
- m_requestedSets.clear();
+ QSet<ResourcePolicy::ResourceType> requestedTypes;
+
switch (set) {
case NoResources:
break;
case LoadedResources:
- m_requestedSets << LoadedResourcesSet;
+ requestedTypes << ResourcePolicy::LensCoverType //to detect lens cover is opened/closed
+ << ResourcePolicy::VideoRecorderType //to open camera device
+ << ResourcePolicy::SnapButtonType; //to detect capture button events
break;
case ImageCaptureResources:
- m_requestedSets << LoadedResourcesSet << ImageResourcesSet;
+ requestedTypes << ResourcePolicy::LensCoverType
+ << ResourcePolicy::VideoPlaybackType
+ << ResourcePolicy::VideoRecorderType
+ << ResourcePolicy::AudioPlaybackType
+ << ResourcePolicy::ScaleButtonType
+ << ResourcePolicy::LedsType
+ << ResourcePolicy::SnapButtonType;
break;
case VideoCaptureResources:
- m_requestedSets << LoadedResourcesSet << VideoResouresSet;
+ requestedTypes << ResourcePolicy::LensCoverType
+ << ResourcePolicy::VideoPlaybackType
+ << ResourcePolicy::VideoRecorderType
+ << ResourcePolicy::AudioPlaybackType
+ << ResourcePolicy::AudioRecorderType
+ << ResourcePolicy::ScaleButtonType
+ << ResourcePolicy::LedsType
+ << ResourcePolicy::SnapButtonType;
break;
}
- //release the resource we don't need any more
- for (int i=0; i<m_resources.count(); i++) {
- if (!m_requestedSets.contains(i) && m_resourceStatuses[i] != Initial) {
- m_resourceStatuses[i] = Initial;
- m_resources[i]->release();
- }
- }
+ QSet<ResourcePolicy::ResourceType> currentTypes;
+ foreach (ResourcePolicy::Resource *resource, m_resource->resources())
+ currentTypes << resource->type();
- //and acquire ones we need
- foreach (int i, m_requestedSets) {
- if (m_resourceStatuses[i] == Initial) {
- m_resourceStatuses[i] = RequestedResource;
- m_resources[i]->acquire();
- }
- }
-#endif
-}
+ foreach (ResourcePolicy::ResourceType resourceType, currentTypes - requestedTypes)
+ m_resource->deleteResource(resourceType);
-bool CamerabinResourcePolicy::isResourcesGranted() const
-{
- foreach (int i, m_requestedSets) {
- if (m_resourceStatuses[i] != GrantedResource)
- return false;
+ foreach (ResourcePolicy::ResourceType resourceType, requestedTypes - currentTypes) {
+ if (resourceType == ResourcePolicy::LensCoverType) {
+ ResourcePolicy::LensCoverResource *lensCoverResource = new ResourcePolicy::LensCoverResource;
+ lensCoverResource->setOptional(true);
+ m_resource->addResourceObject(lensCoverResource);
+ } else {
+ m_resource->addResource(resourceType);
+ }
}
- return true;
-}
-
-
-
-void CamerabinResourcePolicy::handleResourcesGranted()
-{
-#ifdef HAVE_RESOURCE_POLICY
- for (int i=0; i<m_resources.count(); i++) {
- if (sender() == m_resources[i]) {
- m_resourceStatuses[i] = GrantedResource;
-
-#ifdef DEBUG_RESOURCE_POLICY
- qDebug() << Q_FUNC_INFO << "Resource granted" << i;
-#endif
- if (m_requestedSets.contains(i)) {
- if (isResourcesGranted())
- emit resourcesGranted();
- }
- break;
+ m_resource->update();
+ if (set != NoResources) {
+ m_resource->acquire();
+ } else {
+ if (oldSet != NoResources) {
+ m_releasingResources = true;
+ m_resource->release();
}
}
#endif
}
-void CamerabinResourcePolicy::handleResourcesDenied()
+bool CamerabinResourcePolicy::isResourcesGranted() const
{
#ifdef HAVE_RESOURCE_POLICY
- for (int i=0; i<m_resources.count(); i++) {
- if (sender() == m_resources[i]) {
- bool wasGranted = isResourcesGranted();
- m_resourceStatuses[i] = RequestedResource;
-
-#ifdef DEBUG_RESOURCE_POLICY
- qDebug() << Q_FUNC_INFO << "Resource denied" << i << "was granted:" << wasGranted;
-#endif
- if (wasGranted && m_requestedSets.contains(i))
- emit resourcesDenied();
-
- break;
- }
- }
+ foreach (ResourcePolicy::Resource *resource, m_resource->resources())
+ if (!resource->isOptional() && !resource->isGranted())
+ return false;
#endif
+ return true;
}
-void CamerabinResourcePolicy::handleResourcesLost()
+void CamerabinResourcePolicy::handleResourcesReleased()
{
#ifdef HAVE_RESOURCE_POLICY
- for (int i=0; i<m_resources.count(); i++) {
- if (sender() == m_resources[i]) {
- bool wasGranted = isResourcesGranted();
- m_resourceStatuses[i] = RequestedResource;
-
#ifdef DEBUG_RESOURCE_POLICY
- qDebug() << Q_FUNC_INFO << "Resource lost" << i << "was granted:" << wasGranted;
+ qDebug() << Q_FUNC_INFO;
#endif
-
- if (wasGranted && m_requestedSets.contains(i))
- emit resourcesLost();
-
- break;
- }
- }
+ m_releasingResources = false;
#endif
}
diff --git a/plugins/multimedia/gstreamer/camerabin/camerabinresourcepolicy.h b/plugins/multimedia/gstreamer/camerabin/camerabinresourcepolicy.h
index 4d30da7cc1..cd2d846881 100644
--- a/plugins/multimedia/gstreamer/camerabin/camerabinresourcepolicy.h
+++ b/plugins/multimedia/gstreamer/camerabin/camerabinresourcepolicy.h
@@ -43,7 +43,6 @@
#define CAMERARESOURCEPOLICY_H
#include <QtCore/qobject.h>
-#include <QtCore/qlist.h>
namespace ResourcePolicy {
class ResourceSet;
@@ -74,28 +73,12 @@ Q_SIGNALS:
void resourcesLost();
private Q_SLOTS:
- void handleResourcesGranted();
- void handleResourcesDenied();
- void handleResourcesLost();
+ void handleResourcesReleased();
private:
ResourceSet m_resourceSet;
-
- enum ResourceStatus {
- Initial = 0,
- RequestedResource,
- GrantedResource
- };
-
- enum {
- LoadedResourcesSet = 0,
- ImageResourcesSet,
- VideoResouresSet
- };
-
- QList<ResourcePolicy::ResourceSet *> m_resources;
- QList<ResourceStatus> m_resourceStatuses;
- QList<int> m_requestedSets;
+ ResourcePolicy::ResourceSet *m_resource;
+ bool m_releasingResources;
};
#endif