X-Git-Url: http://cgit.sxemacs.org/?a=blobdiff_plain;f=lib%2Fqtcamvideomode.cpp;h=762c108de0d6e125814b36d170d508fd0b7cc19c;hb=bbaadb8139399ca7d6088bf8ff69fa487eae57bd;hp=f805e99231d0a9ef853880325ded51edda5c596b;hpb=86dc1abe8ce6c2a622b6ccb73167eb8acac5eb59;p=harmattan%2Fcameraplus diff --git a/lib/qtcamvideomode.cpp b/lib/qtcamvideomode.cpp index f805e99..762c108 100644 --- a/lib/qtcamvideomode.cpp +++ b/lib/qtcamvideomode.cpp @@ -1,19 +1,45 @@ +/*! + * This file is part of CameraPlus. + * + * Copyright (C) 2012-2013 Mohammed Sameer + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + #include "qtcamvideomode.h" #include "qtcammode_p.h" #include #include "qtcamdevice_p.h" #include "qtcamdevice.h" #include "qtcamvideosettings.h" +#include "qtcamnotifications.h" +#include +#include class QtCamVideoModePrivate : public QtCamModePrivate { public: QtCamVideoModePrivate(QtCamDevicePrivate *dev) : QtCamModePrivate(dev), - settings(dev->conf->defaultVideoSettings()) { + settings(dev->conf->videoSettings(dev->id)), + resolution(settings->defaultResolution()) { } - ~QtCamVideoModePrivate() {} + ~QtCamVideoModePrivate() { + delete settings; + } void _d_idleStateChanged(bool isIdle) { if (isIdle && dev->active == dev->video) { @@ -22,11 +48,57 @@ public: } } - QtCamVideoSettings settings; + QtCamVideoSettings *settings; + QtCamVideoResolution resolution; +}; + +class VideoDoneHandler : public DoneHandler { +public: + VideoDoneHandler(QtCamModePrivate *d, QObject *parent = 0) : + DoneHandler(d, "video-done", parent), m_done(false) {} + + virtual void handleMessage(GstMessage *message) { + DoneHandler::handleMessage(message); + wake(); + } + + void lock() { + m_mutex.lock(); + } + + void unlock() { + m_mutex.unlock(); + } + + void wait() { + m_cond.wait(&m_mutex); + } + + void reset() { + m_done = false; + } + + bool isDone() { + return m_done; + } + +private: + void wake() { + lock(); + m_done = true; + m_cond.wakeOne(); + unlock(); + } + + bool m_done; + QMutex m_mutex; + QWaitCondition m_cond; }; QtCamVideoMode::QtCamVideoMode(QtCamDevicePrivate *dev, QObject *parent) : - QtCamMode(new QtCamVideoModePrivate(dev), "mode-video", "video-done", parent) { + QtCamMode(new QtCamVideoModePrivate(dev), "mode-video", parent) { + + d_ptr->init(new VideoDoneHandler(d_ptr, this)); d = (QtCamVideoModePrivate *)QtCamMode::d_ptr; @@ -55,25 +127,25 @@ bool QtCamVideoMode::canCapture() { void QtCamVideoMode::applySettings() { bool night = d_ptr->inNightMode(); - int fps = night ? d->settings.nightFrameRate() : d->settings.frameRate(); + int fps = night ? d->resolution.nightFrameRate() : d->resolution.frameRate(); - d_ptr->setCaps("viewfinder-caps", d->settings.captureResolution(), fps); + d_ptr->setCaps("viewfinder-caps", d->resolution.captureResolution(), fps); - d_ptr->setCaps("video-capture-caps", d->settings.captureResolution(), fps); + d_ptr->setCaps("video-capture-caps", d->resolution.captureResolution(), fps); - setPreviewSize(d->settings.previewResolution()); + d_ptr->setPreviewSize(d->resolution.previewResolution()); - // TODO: - // d_ptr->resetCaps("image-capture-caps"); + // Not sure this is needed but just in case. + d_ptr->resetCaps("image-capture-caps"); } void QtCamVideoMode::start() { - // Nothing + d_ptr->disableViewfinderFilters(); } void QtCamVideoMode::stop() { if (isRecording()) { - stopRecording(); + stopRecording(true); } } @@ -81,7 +153,7 @@ bool QtCamVideoMode::isRecording() { return !d_ptr->dev->q_ptr->isIdle(); } -bool QtCamVideoMode::startRecording(const QString& fileName) { +bool QtCamVideoMode::startRecording(const QString& fileName, const QString& tmpFileName) { if (!canCapture() || isRecording()) { return false; } @@ -90,11 +162,19 @@ bool QtCamVideoMode::startRecording(const QString& fileName) { return false; } - setFileName(fileName); + d_ptr->setFileName(fileName); + d_ptr->setTempFileName(tmpFileName); + + QString file = tmpFileName.isEmpty() ? fileName : tmpFileName; + + QMetaObject::invokeMethod(d_ptr->dev->notifications, "videoRecordingStarted"); - g_object_set(d_ptr->dev->cameraBin, "location", fileName.toUtf8().data(), NULL); + g_object_set(d_ptr->dev->cameraBin, "location", file.toUtf8().data(), NULL); g_signal_emit_by_name(d_ptr->dev->cameraBin, "start-capture", NULL); + VideoDoneHandler *handler = dynamic_cast(d_ptr->doneHandler); + handler->reset(); + emit recordingStateChanged(); emit canCaptureChanged(); @@ -102,16 +182,38 @@ bool QtCamVideoMode::startRecording(const QString& fileName) { return true; } -void QtCamVideoMode::stopRecording() { +void QtCamVideoMode::stopRecording(bool sync) { if (isRecording()) { + VideoDoneHandler *handler = dynamic_cast(d_ptr->doneHandler); + if (sync) { + handler->lock(); + + if (handler->isDone()) { + handler->unlock(); + return; + } + } + g_signal_emit_by_name(d_ptr->dev->cameraBin, "stop-capture", NULL); + + if (sync) { + handler->wait(); + handler->unlock(); + } } } -bool QtCamVideoMode::setSettings(const QtCamVideoSettings& settings) { - d->settings = settings; +bool QtCamVideoMode::setResolution(const QtCamVideoResolution& resolution) { + d->resolution = resolution; + + if (!d_ptr->dev->q_ptr->isRunning()) { + // We will return true here because setting the resolution on a non-running pipeline + // doesn't make much sense (Probably the only use case is as a kind of optimization only). + // We will set it anyway when the pipeline gets started. + return true; + } - if (!d_ptr->dev->q_ptr->isRunning() || isRecording()) { + if (isRecording()) { return false; } @@ -129,4 +231,12 @@ void QtCamVideoMode::setProfile(GstEncodingProfile *profile) { g_object_set(d_ptr->dev->cameraBin, "video-profile", profile, NULL); } +QtCamVideoSettings *QtCamVideoMode::settings() { + return d->settings; +} + +QtCamVideoResolution QtCamVideoMode::currentResolution() { + return d->resolution; +} + #include "moc_qtcamvideomode.cpp"