QZXingFilter.h Example File
appdemos/qtws/QZXing/QZXingFilter.h
#ifndef QZXingFilter_H
#define QZXingFilter_H
#include <QObject>
#include <QAbstractVideoFilter>
#include <QDebug>
#include <QFuture>
#include <QZXing.h>
struct SimpleVideoFrame
{
QByteArray data;
QSize size;
QVideoFrame::PixelFormat pixelFormat;
SimpleVideoFrame()
: size{0,0}
, pixelFormat{QVideoFrame::Format_Invalid}
{}
void copyData(QVideoFrame & frame)
{
frame.map(QAbstractVideoBuffer::ReadOnly);
if(data.size() != frame.mappedBytes())
{
qDebug() << "needed to resize";
qDebug() << "size: " << data.size() << ", new size: " << frame.mappedBytes();
data.resize(frame.mappedBytes());
}
memcpy(data.data(), frame.bits(), frame.mappedBytes());
size = frame.size();
pixelFormat = frame.pixelFormat();
frame.unmap();
}
};
class QZXingFilter : public QAbstractVideoFilter
{
friend class QZXingFilterRunnable;
Q_OBJECT
Q_PROPERTY(bool decoding READ isDecoding NOTIFY isDecodingChanged)
Q_PROPERTY(QZXing* decoder READ getDecoder)
Q_PROPERTY(QRectF captureRect MEMBER captureRect NOTIFY captureRectChanged)
signals:
void isDecodingChanged();
void decodingFinished(bool succeeded, int decodeTime);
void decodingStarted();
void captureRectChanged();
private slots:
void handleDecodingStarted();
void handleDecodingFinished(bool succeeded);
private:
QZXing decoder;
bool decoding;
QRectF captureRect;
SimpleVideoFrame frame;
QFuture<void> processThread;
public:
explicit QZXingFilter(QObject *parent = 0);
virtual ~QZXingFilter();
bool isDecoding() {return decoding; }
QZXing* getDecoder() { return &decoder; }
QVideoFilterRunnable * createFilterRunnable();
};
class QZXingFilterRunnable : public QObject, public QVideoFilterRunnable
{
Q_OBJECT
public:
explicit QZXingFilterRunnable(QZXingFilter * filter);
virtual ~QZXingFilterRunnable();
QVideoFrame run(QVideoFrame * input, const QVideoSurfaceFormat &surfaceFormat, RunFlags flags);
void processVideoFrameProbed(SimpleVideoFrame & videoFrame, const QRect& captureRect);
private:
QString decode(const QImage &image);
private:
QZXingFilter * filter;
};
#endif // QZXingFilter_H