/****************************************************************************** VideoCapture.h: description Copyright (C) 2012-2016 Wang Bin * This file is part of QtAV 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 ******************************************************************************/ #ifndef QTAV_VIDEOCAPTURE_H #define QTAV_VIDEOCAPTURE_H #include #include #include "_fav_constants.h" #include "VideoFrame.h" namespace FAV { //on capture per thread or all in one thread? class Q_AV_EXPORT VideoCapture : public QObject { Q_OBJECT Q_PROPERTY(bool async READ isAsync WRITE setAsync NOTIFY asyncChanged) Q_PROPERTY(bool autoSave READ autoSave WRITE setAutoSave NOTIFY autoSaveChanged) Q_PROPERTY(bool originalFormat READ isOriginalFormat WRITE setOriginalFormat NOTIFY originalFormatChanged) Q_PROPERTY(QString saveFormat READ saveFormat WRITE setSaveFormat NOTIFY saveFormatChanged) Q_PROPERTY(int quality READ quality WRITE setQuality NOTIFY qualityChanged) Q_PROPERTY(QString captureName READ captureName WRITE setCaptureName NOTIFY captureNameChanged) Q_PROPERTY(QString captureDir READ captureDir WRITE setCaptureDir NOTIFY captureDirChanged) public: explicit VideoCapture(QObject *parent = 0); // TODO: if async is true, the cloned hw frame shares the same interop object with original frame, so interop obj may do 2 map() at the same time. It's not safe void setAsync(bool value = true); bool isAsync() const; /*! * \brief setAutoSave * If auto save is true, then the captured video frame will be saved as a file when frame is available. * Otherwise, signal ready() and finished() will be emitted without doing other things. */ void setAutoSave(bool value = true); bool autoSave() const; /*! * \brief setOriginalFormat * Save the original frame, can be YUV, NV12 etc. No format converting. default is false * The file name suffix is video frame's format name in lower case, e.g. yuv420p, nv12. * quality property will not take effect. */ void setOriginalFormat(bool value = true); bool isOriginalFormat() const; /*! * \brief setFormat * Set saved format. can be "PNG", "jpg" etc. Not be used if save raw frame data. * \param format image format string like "png", "jpg" */ void setSaveFormat(const QString& format); QString saveFormat() const; /*! * \brief setQuality * Set saved image quality. Not be used if save original frame data. * \param value 0-100, larger is better quality. -1: default quality */ void setQuality(int value); int quality() const; /*! * \brief name * suffix is auto add * empty name: filename_timestamp.format(suffix is videoframe.format.name() if save as raw data) * If autoSave() is true, saved file name will add a timestamp string. */ void setCaptureName(const QString& value); QString captureName() const; void setCaptureDir(const QString& value); QString captureDir() const; public Q_SLOTS: void capture(); Q_SIGNALS: void requested(); /*use it to popup a dialog for selecting dir, name etc. TODO: block avthread if not async*/ /*! * \brief frameAvailable * Emitted when requested frame is available. */ void frameAvailable(const FAV::VideoFrame& frame); /*! * \brief imageCaptured * Emitted when captured video frame is converted to a QImage. * \param image */ void imageCaptured(const QImage& image); //TODO: emit only if not original format is set? void failed(); /*! * \brief saved * Only for autoSave is true. Emitted when captured frame is saved. * \param path the saved captured frame path. */ void saved(const QString& path); void asyncChanged(); void autoSaveChanged(); void originalFormatChanged(); void saveFormatChanged(); void qualityChanged(); void captureNameChanged(); void captureDirChanged(); private Q_SLOTS: void handleAppQuit(); private: void setVideoFrame(const VideoFrame& frame); // It's called by VideoThread after immediatly setVideoFrame(). Will emit ready() void start(); friend class CaptureTask; friend class VideoThread; bool async; bool auto_save; bool original_fmt; //TODO: use blocking queue? If not, the parameters will change when thre previous is not finished //or use a capture event that wrapper all these parameters int qual; QImage::Format qfmt; QString fmt; QString name, dir; VideoFrame frame; }; } //namespace FAV #endif // QTAV_VIDEOCAPTURE_H