/*!
* This file is part of CameraPlus.
*
- * Copyright (C) 2012 Mohammed Sameer <msameer@foolab.org>
+ * Copyright (C) 2012-2013 Mohammed Sameer <msameer@foolab.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
#include "qtcamdevice_p.h"
#include "qtcamdevice.h"
#include <QDebug>
-#include "qtcamgstreamermessagehandler.h"
#include "qtcamgstreamermessagelistener.h"
#include <gst/video/video.h>
#include <QImage>
QtCamMode *mode;
};
-class DoneHandler : public QtCamGStreamerMessageHandler {
-public:
- DoneHandler(QtCamModePrivate *m, const char *done, QObject *parent = 0) :
- QtCamGStreamerMessageHandler(done, parent) {
- mode = m;
- }
-
- virtual void handleMessage(GstMessage *message) {
- // If we have a temp file then we rename it:
- if (!mode->tempFileName.isEmpty() && !mode->fileName.isEmpty()) {
- if (!QFile::rename(mode->tempFileName, mode->fileName)) {
- qCritical() << "Failed to rename" << mode->tempFileName << "to" << mode->fileName;
- }
- }
-
- QString fileName;
- const GstStructure *s = gst_message_get_structure(message);
- if (gst_structure_has_field(s, "filename")) {
- const char *str = gst_structure_get_string(s, "filename");
- if (str) {
- fileName = QString::fromUtf8(str);
- }
- }
-
- if (fileName.isEmpty()) {
- fileName = mode->fileName;
- }
-
- QMetaObject::invokeMethod(mode->q_ptr, "saved", Q_ARG(QString, fileName));
- }
-
- QtCamModePrivate *mode;
-};
-
-QtCamMode::QtCamMode(QtCamModePrivate *d, const char *mode, const char *done, QObject *parent) :
+QtCamMode::QtCamMode(QtCamModePrivate *d, const char *mode, QObject *parent) :
QObject(parent), d_ptr(d) {
d_ptr->q_ptr = this;
d_ptr->id = d_ptr->modeId(mode);
d_ptr->previewImageHandler = new PreviewImageHandler(this, this);
- d_ptr->doneHandler = new DoneHandler(d_ptr, done, this);
+ d_ptr->doneHandler = 0;
}
QtCamMode::~QtCamMode() {
d_ptr->dev->active = this;
- // TODO: check that we can actually do it. Perhaps the pipeline is busy.
g_object_set(d_ptr->dev->cameraBin, "mode", d_ptr->id, NULL);
d_ptr->dev->listener->addHandler(d_ptr->previewImageHandler);
- d_ptr->dev->listener->addHandler(d_ptr->doneHandler);
+
+ // This has to be sync. VideoDoneHandler will lock a mutex that is already
+ // locked from the main thread.
+ d_ptr->dev->listener->addSyncHandler(d_ptr->doneHandler);
start();
}
d_ptr->dev->listener->removeHandler(d_ptr->previewImageHandler);
- d_ptr->dev->listener->removeHandler(d_ptr->doneHandler);
+ d_ptr->dev->listener->removeSyncHandler(d_ptr->doneHandler);
d_ptr->previewImageHandler->setParent(this);
d_ptr->doneHandler->setParent(this);
QtCamDevice *QtCamMode::device() const {
return d_ptr->dev->q_ptr;
}
+
+void QtCamMode::disablePreview() {
+ d_ptr->setPreviewSize(QSize());
+}