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

119 lines
3.3 KiB
C

#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);
};
#endif // VIDEOWIDGET_H