first commit

This commit is contained in:
2026-02-21 17:11:31 +09:00
commit 18b4338361
4001 changed files with 365464 additions and 0 deletions

View File

@@ -0,0 +1,143 @@
/******************************************************************************
VideoCapture.h: description
Copyright (C) 2012-2016 Wang Bin <wbsecg1@gmail.com>
* 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 <QtCore/QObject>
#include <QtGui/QImage>
#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