X-Git-Url: http://cgit.sxemacs.org/?a=blobdiff_plain;f=lib%2Fqtcamvideomode.cpp;h=762c108de0d6e125814b36d170d508fd0b7cc19c;hb=bbaadb8139399ca7d6088bf8ff69fa487eae57bd;hp=d3d88859057477a9ef2ca354c5c1c9e721606626;hpb=9289ae82be24afc06797d75d2fcf5502d776555a;p=harmattan%2Fcameraplus diff --git a/lib/qtcamvideomode.cpp b/lib/qtcamvideomode.cpp index d3d8885..762c108 100644 --- a/lib/qtcamvideomode.cpp +++ b/lib/qtcamvideomode.cpp @@ -1,7 +1,7 @@ /*! * This file is part of CameraPlus. * - * Copyright (C) 2012 Mohammed Sameer + * 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 @@ -24,6 +24,9 @@ #include "qtcamdevice_p.h" #include "qtcamdevice.h" #include "qtcamvideosettings.h" +#include "qtcamnotifications.h" +#include +#include class QtCamVideoModePrivate : public QtCamModePrivate { public: @@ -49,8 +52,53 @@ public: 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; @@ -85,19 +133,19 @@ void QtCamVideoMode::applySettings() { d_ptr->setCaps("video-capture-caps", d->resolution.captureResolution(), fps); - setPreviewSize(d->resolution.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); } } @@ -105,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; } @@ -114,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; - g_object_set(d_ptr->dev->cameraBin, "location", fileName.toUtf8().data(), NULL); + QMetaObject::invokeMethod(d_ptr->dev->notifications, "videoRecordingStarted"); + + 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(); @@ -126,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::setResolution(const QtCamVideoResolution& resolution) { d->resolution = resolution; - if (!d_ptr->dev->q_ptr->isRunning() || isRecording()) { + 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 (isRecording()) { return false; } @@ -157,4 +235,8 @@ QtCamVideoSettings *QtCamVideoMode::settings() { return d->settings; } +QtCamVideoResolution QtCamVideoMode::currentResolution() { + return d->resolution; +} + #include "moc_qtcamvideomode.cpp"