You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
PayloadAPP/Src/VideoGL/videowidget.h

121 lines
3.4 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#ifndef VIDEOWIDGET_H
#define VIDEOWIDGET_H
#include <qopenglpixeltransferoptions.h>
#include <qopenglshaderprogram.h>
#include <QGuiApplication>
#include <QMutex>
#include <QOpenGLFunctions_3_3_Core>
#include <QOpenGLTexture>
#include <QQueue>
#include <QScreen>
#include <QThread>
#include <QTimer>
#include <QWidget>
#include <QWindow>
#include "decodestream.h"
#include "ffmpeginclude.h"
#include "pushstream.h"
#include "readstream.h"
#define USE_WINDOW 0 // 1:使用QOpenGLWindow显示, 0使用QOpenGLWidget显示
#if USE_WINDOW
#include <QOpenGLWindow>
class VideoWidget : public QOpenGLWindow,
public QOpenGLFunctions_3_3_Core
#else
#include <QOpenGLWidget>
class VideoWidget : public QOpenGLWidget,
public QOpenGLFunctions_3_3_Core
#endif
{
Q_OBJECT
public:
#if USE_WINDOW
explicit VideoWidget(UpdateBehavior updateBehavior = NoPartialUpdate,
QWindow *parent = nullptr);
#else
explicit VideoWidget(QWidget *parent = nullptr,
Qt::WindowFlags f = Qt::WindowFlags());
#endif
~VideoWidget() override;
bool play(const QString &url);
void stopPlay();
bool pushStream(const QString &url);
void stopPushStream();
void setPullURL(const QString &url);
void setPushURL(const QString &url);
void setVedioSaveFileDirPath(const QString &dirPath);
protected:
void initializeGL() override; // 初始化gl
void resizeGL(int w, int h) override; // 窗口尺寸变化
void paintGL() override; // 刷新显示
void repaint(AVFrame *frame); // 设置需要绘制的图像帧
private:
// YUV420图像数据更新
void repaintTexYUV420P(AVFrame *frame);
void initTexYUV420P(int width, int height);
void freeTexYUV420P();
// NV12图像数据更新
void repaintTexNV12(AVFrame *frame);
void initTexNV12(AVFrame *frame);
void freeTexNV12();
private: // opengl
QOpenGLShaderProgram *m_program = nullptr;
QOpenGLTexture *m_texY = nullptr;
QOpenGLTexture *m_texU = nullptr;
QOpenGLTexture *m_texV = nullptr;
QOpenGLTexture *m_texUV = nullptr;
QOpenGLPixelTransferOptions m_options;
GLuint VBO =
0; // 顶点缓冲对象,负责将数据从内存放到缓存一个VBO可以用于多个VAO
GLuint VAO =
0; // 顶点数组对象,任何随后的顶点属性调用都会储存在这个VAO中一个VAO可以有多个VBO
GLuint EBO = 0; // 元素缓冲对象,它存储 OpenGL 用来决定要绘制哪些顶点的索引
QSize m_size;
QSizeF m_zoomSize;
QPointF m_pos;
int m_format; // 像素格式
private:
bool pullStream(const QString &url);
void receiveErrorMessage(QString message, int type);
private:
QString m_pullURL;
QString m_pushURL;
bool m_playFlag = false;
bool m_pullFlag = false;
bool m_pushFlag = false;
QString m_videoSaveDirPath;
ReadStream *readStreamer = nullptr;
QThread readStreamThread;
DecodeStream *decodeStreamer = nullptr;
QThread decodeStreamThread;
SaveStream *saveStreamer = nullptr;
QThread saveStreamThread;
PushStream *streamPusher = nullptr;
QThread pushStreamThread;
QMutex m_mutex;
signals:
void startPullSignal();
void sendErrorMessageSignal(QString message, int type);
public:
QSizeF getCurImgSize();
};
#endif // VIDEOWIDGET_H