From d3353c796edb62f6114d2e76a5804d149ff8e819 Mon Sep 17 00:00:00 2001 From: "DESKTOP-4RNDQIC\\29019" <290198252@qq.com> Date: Sat, 2 Oct 2021 13:58:29 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=82=E9=85=8Dmsvc=20=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/qt_gl_/yuvgl/components/toast.cpp | 12 +- client/qt_gl_/yuvgl/components/toast.h | 8 +- client/qt_gl_/yuvgl/cplaywidget.cpp | 391 +++++----- client/qt_gl_/yuvgl/cplaywidget.h | 41 +- client/qt_gl_/yuvgl/librtmp/hashswf.c | 1 - client/qt_gl_/yuvgl/librtmp/log.c | 1 - client/qt_gl_/yuvgl/librtmp/rtmp_sys.h | 11 +- client/qt_gl_/yuvgl/main.cpp | 28 +- client/qt_gl_/yuvgl/mainwindow.cpp | 28 +- client/qt_gl_/yuvgl/mainwindow.h | 1 - client/qt_gl_/yuvgl/mainwindow.ui | 8 +- client/qt_gl_/yuvgl/media/CameraCapture.cpp | 2 + client/qt_gl_/yuvgl/media/CameraCapture.h | 38 +- client/qt_gl_/yuvgl/media/RtmpPusher.h | 20 +- client/qt_gl_/yuvgl/media/audiocaptureff.cpp | 4 +- client/qt_gl_/yuvgl/media/audiocaptureff.h | 10 +- client/qt_gl_/yuvgl/utils/Base64.cpp | 1 - client/qt_gl_/yuvgl/yuvgl.pro | 27 +- client/qt_gl_/yuvgl/yuvgl.pro.user | 739 ++++++++++++++++++- 19 files changed, 1073 insertions(+), 298 deletions(-) diff --git a/client/qt_gl_/yuvgl/components/toast.cpp b/client/qt_gl_/yuvgl/components/toast.cpp index bdc55f1..e2b6987 100644 --- a/client/qt_gl_/yuvgl/components/toast.cpp +++ b/client/qt_gl_/yuvgl/components/toast.cpp @@ -4,6 +4,7 @@ #include #include #include +#include ToastWidget::ToastWidget(QWidget *parent) : QWidget(parent) @@ -58,12 +59,11 @@ void ToastWidget::showTip(const QString& text, QWidget* parent /*= nullptr*/) toast->setText(text); toast->setStyleSheet("font:bold;font-size:24px;color:rgb(255,255,255);"); toast->adjustSize(); //设置完文本后调整下大小 - // 测试显示位于主屏的70%高度位置 - QScreen* pScreen = QGuiApplication::primaryScreen(); - toast->move((pScreen->size().width() - toast->width()) / 2, - pScreen->size().height() * 5 / 10); - toast->showAnimation(1000); + qDebug()<geometry(); + toast->move((parent->geometry().x() + (parent->size().width() - toast->width()) / 2), + parent->geometry().y() + (parent->size().height() * 5 / 10)); + toast->showAnimation(100); } void ToastWidget::paintEvent(QPaintEvent *event) @@ -71,7 +71,7 @@ void ToastWidget::paintEvent(QPaintEvent *event) QPainter paint(this); paint.begin(this); auto kBackgroundColor = QColor(255, 255, 255); - kBackgroundColor.setAlpha(0.0 * 255);// 透明度为0 + kBackgroundColor.setAlpha(0.1);// 透明度为0 paint.setRenderHint(QPainter::Antialiasing, true); paint.setPen(Qt::NoPen); paint.setBrush(QBrush(kBackgroundColor, Qt::SolidPattern));//设置画刷形式 diff --git a/client/qt_gl_/yuvgl/components/toast.h b/client/qt_gl_/yuvgl/components/toast.h index fcfb9f9..41c8209 100644 --- a/client/qt_gl_/yuvgl/components/toast.h +++ b/client/qt_gl_/yuvgl/components/toast.h @@ -1,11 +1,7 @@ -/** @file Toast.h - * @brief Qt模拟安卓移动客户端Toast提示消息 - * @note qss set in ui file - * @author lesliefish - * @date 2019/05/31 - */ + #ifndef __TOAST__ #define __TOAST__ + #include #include "ui_toast.h" diff --git a/client/qt_gl_/yuvgl/cplaywidget.cpp b/client/qt_gl_/yuvgl/cplaywidget.cpp index a876fff..f4e8d87 100644 --- a/client/qt_gl_/yuvgl/cplaywidget.cpp +++ b/client/qt_gl_/yuvgl/cplaywidget.cpp @@ -1,3 +1,4 @@ +#include "CPlayWidget.h" #include #include @@ -5,7 +6,8 @@ #include "CPlayWidget.h" -// 顶点着色器源码 +// ɫԴ + const char *vsrcyuv = "attribute vec4 vertexIn; \ attribute vec2 textureIn; \ varying vec2 textureOut; \ @@ -14,7 +16,10 @@ void main(void) \ gl_Position = vertexIn; \ textureOut = textureIn; \ }"; -// 片段着色器源码 + + +// ƬɫԴ + const char *fsrcyuv = "varying vec2 textureOut; \ uniform sampler2D tex_y; \ uniform sampler2D tex_u; \ @@ -31,8 +36,11 @@ void main(void) \ 1.13983, -0.58060, 0) * yuv; \ gl_FragColor = vec4(rgb, 1); \ }"; -// rgb片段着色器源码 -// 注意MEDIASUBTYPE_RGB32 是bgr的,所以需要再进行一次转换 + +// rgbƬɫԴ +// עMEDIASUBTYPE_RGB32 bgrģҪٽһת + + const char *fsrcrgb = "varying vec2 textureOut; \ uniform sampler2D rgbdata; \ void main() \ @@ -52,7 +60,7 @@ void CPlayWidget::OnPaintData(const uint8_t *data, uint32_t len) qDebug("CPlayWidget::PlayOneFrame new data memory. Len=%d width=%d height=%d\n", len, m_nVideoW, m_nVideoW); memcpy(m_pBufYuv420p, data,len); - //刷新界面,触发paintGL接口 + //ˢ½,paintGLӿ update(); } } @@ -65,7 +73,7 @@ CPlayWidget::CPlayWidget(QWidget *parent):QOpenGLWidget(parent) { id_u = 0; id_v = 0; m_pTextureRGB = nullptr; - m_pBufYuv420p = NULL; + m_pBufYuv420p = nullptr; m_pVSHader = NULL; m_pFSHader = NULL; m_pShaderProgram = NULL; @@ -83,17 +91,19 @@ CPlayWidget::CPlayWidget(QWidget *parent):QOpenGLWidget(parent) { CPlayWidget::~CPlayWidget() { } -void CPlayWidget::PlayOneFrame() {//函数功能读取一张yuv图像数据进行显示,每单击一次,就显示一张图片 +void CPlayWidget::PlayOneFrame() {//ܶȡһyuvͼݽʾ,ÿһΣʾһͼƬ if(NULL == m_pYuvFile) { - //打开yuv视频文件 注意修改文件路径 + //yuvƵļ ע޸ļ· // m_pYuvFile = fopen("F://OpenglYuvDemo//1920_1080.yuv", "rb"); m_pYuvFile = fopen("F://md_sample_sp420_1080p.yuv", "rb"); - //根据yuv视频数据的分辨率设置宽高,demo当中是1080p,这个地方要注意跟实际数据分辨率对应上 + //yuvƵݵķֱÿ,demo1080pطҪעʵݷֱʶӦ // m_nVideoW = 1920; // m_nVideoH = 1080; } - //申请内存存一帧yuv图像数据,其大小为分辨率的1.5倍 + //ڴһ֡yuvͼ,СΪֱʵ1.5 + + int nLen = m_nVideoW*m_nVideoH*3/2; if(nullptr == m_pBufYuv420p) { @@ -101,26 +111,30 @@ void CPlayWidget::PlayOneFrame() {//函数功能读取一张yuv图像数据进 qDebug("CPlayWidget::PlayOneFrame new data memory. Len=%d width=%d height=%d\n", nLen, m_nVideoW, m_nVideoW); } - //将一帧yuv图像读到内存中 + //һ֡yuvͼڴ + if(NULL == m_pYuvFile) { qFatal("read yuv file err.may be path is wrong!\n"); return; } fread(m_pBufYuv420p, 1, nLen, m_pYuvFile); - //刷新界面,触发paintGL接口 + //ˢ½,paintGLӿ update(); return; } int CPlayWidget::SetDataType(CPlayWidget::IMG_TYPE type){ this->mType = type; + return 0; } int CPlayWidget::OnCameraData(uint8_t *dat, uint32_t size) { memcpy(this->m_pBufRgb32,dat,size); update(); + return 0; + } int CPlayWidget::SetImgSize(uint32_t width, uint32_t height) @@ -133,6 +147,7 @@ int CPlayWidget::SetImgSize(uint32_t width, uint32_t height) if(mType == TYPE_YUV420P){ m_pBufYuv420p = new uint8_t[width * height *3/2]; } + return 0; } @@ -144,7 +159,7 @@ U = - 0.1687 R - 0.3313 G + 0.5 B + 128 V = 0.5 R - 0.4187 G - 0.0813 B + 128 -反过来,RGB 也可以直接从YUV (256级别) 计算: +RGB ҲֱӴYUV (256) : R = Y + 1.402 (Cr-128) @@ -156,19 +171,21 @@ void CPlayWidget::initializeGL() { initializeOpenGLFunctions(); glEnable(GL_DEPTH_TEST); - //现代opengl渲染管线依赖着色器来处理传入的数据 - //着色器:就是使用openGL着色语言(OpenGL Shading Language, GLSL)编写的一个小函数, - // GLSL是构成所有OpenGL着色器的语言,具体的GLSL语言的语法需要读者查找相关资料 - //初始化顶点着色器 对象 + + //ִopenglȾɫ + //ɫʹopenGLɫ(OpenGL Shading Language, GLSL)дһС, + // GLSLǹOpenGLɫ,GLSLԵ﷨Ҫ߲ + //ʼɫ + m_pVSHader = new QOpenGLShader(QOpenGLShader::Vertex, this); - //编译顶点着色器程序 + //붥ɫ bool bCompile = m_pVSHader->compileSourceCode(vsrcyuv); if(!bCompile) { - // todo 设置错误状态 + // todo ô״̬ } - //初始化片段着色器 功能gpu中yuv转换成rgb + //ʼƬɫ gpuyuvתrgb m_pFSHader = new QOpenGLShader(QOpenGLShader::Fragment, this); if(mType == TYPE_RGB32){ bCompile = m_pFSHader->compileSourceCode(fsrcrgb); @@ -178,23 +195,31 @@ void CPlayWidget::initializeGL() } if(!bCompile) { - // todo 设置错误状态 + // todo ô״̬ } #define PROGRAM_VERTEX_ATTRIBUTE 0 #define PROGRAM_TEXCOORD_ATTRIBUTE 1 - //创建着色器程序容器 + //ɫ + m_pShaderProgram = new QOpenGLShaderProgram; - //将片段着色器添加到程序容器 + //Ƭɫӵ + m_pShaderProgram->addShader(m_pFSHader); - //将顶点着色器添加到程序容器 + //ɫӵ + m_pShaderProgram->addShader(m_pVSHader); - //绑定属性vertexIn到指定位置ATTRIB_VERTEX,该属性在顶点着色源码其中有声明 + //vertexInָλATTRIB_VERTEX,ڶɫԴ + m_pShaderProgram->bindAttributeLocation("vertexIn", ATTRIB_VERTEX); - //绑定属性textureIn到指定位置ATTRIB_TEXTURE,该属性在顶点着色源码其中有声明 + //textureInָλATTRIB_TEXTURE,ڶɫԴ + m_pShaderProgram->bindAttributeLocation("textureIn", ATTRIB_TEXTURE); - //链接所有所有添入到的着色器程序 + //뵽ɫ + m_pShaderProgram->link(); - //激活所有链接 + + // + m_pShaderProgram->bind(); if(this->mType == TYPE_YUV420P){ @@ -203,175 +228,181 @@ void CPlayWidget::initializeGL() if(this->mType == TYPE_RGB32){ initShaderRgb(); } - glClearColor(0.0,0.0,0.0,0.0);//设置背景色 + glClearColor(0.0,0.0,0.0,0.0);//ñɫ } + + void CPlayWidget::resizeGL(int w, int h) { - if(h == 0)// 防止被零除 + if(h == 0)// ֹ { - h = 1;// 将高设为1 + h = 1;// Ϊ1 } - //设置视口 + //ӿ glViewport(0,0, w,h); } - void CPlayWidget::paintGL() - { + +void CPlayWidget::paintGL() +{ if(mType == TYPE_YUV420P) loadYuvTexture(); if(mType == TYPE_RGB32){ loadRgbTexture(); } - //使用顶点数组方式绘制图形 + //ʹö鷽ʽͼ glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); return; - } +} - void CPlayWidget::initShaderYuv() - { - //读取着色器中的数据变量tex_y, tex_u, tex_v的位置,这些变量的声明可以在 - //片段着色器源码中可以看到 - textureUniformY = m_pShaderProgram->uniformLocation("tex_y"); - textureUniformU = m_pShaderProgram->uniformLocation("tex_u"); - textureUniformV = m_pShaderProgram->uniformLocation("tex_v"); - // 顶点矩阵 - static const GLfloat vertexVertices[] = { - -1.0f, -1.0f, - 1.0f, -1.0f, - -1.0f, 1.0f, - 1.0f, 1.0f, - }; - //纹理矩阵 - static const GLfloat textureVertices[] = { - 0.0f, 1.0f, - 1.0f, 1.0f, - 0.0f, 0.0f, - 1.0f, 0.0f, - }; - //设置属性ATTRIB_VERTEX的顶点矩阵值以及格式 - glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, vertexVertices); - //设置属性ATTRIB_TEXTURE的纹理矩阵值以及格式 - glVertexAttribPointer(ATTRIB_TEXTURE, 2, GL_FLOAT, 0, 0, textureVertices); - //启用ATTRIB_VERTEX属性的数据,默认是关闭的 - glEnableVertexAttribArray(ATTRIB_VERTEX); - //启用ATTRIB_TEXTURE属性的数据,默认是关闭的 - glEnableVertexAttribArray(ATTRIB_TEXTURE); - //分别创建y,u,v纹理对象 - m_pTextureY = new QOpenGLTexture(QOpenGLTexture::Target2D); - m_pTextureU = new QOpenGLTexture(QOpenGLTexture::Target2D); - m_pTextureV = new QOpenGLTexture(QOpenGLTexture::Target2D); - m_pTextureY->create(); - m_pTextureU->create(); - m_pTextureV->create(); - //获取返回y分量的纹理索引值 - id_y = m_pTextureY->textureId(); - //获取返回u分量的纹理索引值 - id_u = m_pTextureU->textureId(); - //获取返回v分量的纹理索引值 - id_v = m_pTextureV->textureId(); - } +void CPlayWidget::initShaderYuv() +{ + //ȡɫеݱtex_y, tex_u, tex_vλ,Щ + //ƬɫԴпԿ + textureUniformY = m_pShaderProgram->uniformLocation("tex_y"); + textureUniformU = m_pShaderProgram->uniformLocation("tex_u"); + textureUniformV = m_pShaderProgram->uniformLocation("tex_v"); + // + static const GLfloat vertexVertices[] = { + -1.0f, -1.0f, + 1.0f, -1.0f, + -1.0f, 1.0f, + 1.0f, 1.0f, + }; + // + static const GLfloat textureVertices[] = { + 0.0f, 1.0f, + 1.0f, 1.0f, + 0.0f, 0.0f, + 1.0f, 0.0f, + }; + //ATTRIB_VERTEXĶֵԼʽ + glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, vertexVertices); + //ATTRIB_TEXTUREֵԼʽ + glVertexAttribPointer(ATTRIB_TEXTURE, 2, GL_FLOAT, 0, 0, textureVertices); + //ATTRIB_VERTEXԵ,Ĭǹرյ + glEnableVertexAttribArray(ATTRIB_VERTEX); + //ATTRIB_TEXTUREԵ,Ĭǹرյ + glEnableVertexAttribArray(ATTRIB_TEXTURE); + //ֱ𴴽y,u,v + m_pTextureY = new QOpenGLTexture(QOpenGLTexture::Target2D); + m_pTextureU = new QOpenGLTexture(QOpenGLTexture::Target2D); + m_pTextureV = new QOpenGLTexture(QOpenGLTexture::Target2D); + m_pTextureY->create(); + m_pTextureU->create(); + m_pTextureV->create(); + //ȡyֵ + id_y = m_pTextureY->textureId(); + //ȡuֵ + id_u = m_pTextureU->textureId(); + //ȡvֵ + id_v = m_pTextureV->textureId(); +} - void CPlayWidget::initShaderRgb() - { - //读取着色器中的数据变量tex_y, tex_u, tex_v的位置,这些变量的声明可以在 - //片段着色器源码中可以看到 - textureUniformRGB = m_pShaderProgram->uniformLocation("rgbdata"); - // 顶点矩阵 - static const GLfloat vertexVertices[] = { - -1.0f, -1.0f, - 1.0f, -1.0f, - -1.0f, 1.0f, - 1.0f, 1.0f, - }; - //纹理矩阵 - static const GLfloat textureVertices[] = { - 0.0f, 0.0f, - 1.0f, 0.0f, - 0.0f, 1.0f, - 1.0f, 1.0f, - }; - //设置属性ATTRIB_VERTEX的顶点矩阵值以及格式 - glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, vertexVertices); - //设置属性ATTRIB_TEXTURE的纹理矩阵值以及格式 - glVertexAttribPointer(ATTRIB_TEXTURE, 2, GL_FLOAT, 0, 0, textureVertices); - //启用ATTRIB_VERTEX属性的数据,默认是关闭的 - glEnableVertexAttribArray(ATTRIB_VERTEX); - //启用ATTRIB_TEXTURE属性的数据,默认是关闭的 - glEnableVertexAttribArray(ATTRIB_TEXTURE); - //分别创建y,u,v纹理对象 - m_pTextureRGB = new QOpenGLTexture(QOpenGLTexture::Target2D); - m_pTextureRGB->create(); - //获取返回y分量的纹理索引值 - id_rgb = m_pTextureRGB->textureId(); - } +void CPlayWidget::initShaderRgb() +{ + //ȡɫеݱtex_y, tex_u, tex_vλ,Щ + //ƬɫԴпԿ + textureUniformRGB = m_pShaderProgram->uniformLocation("rgbdata"); + // + static const GLfloat vertexVertices[] = { + -1.0f, -1.0f, + 1.0f, -1.0f, + -1.0f, 1.0f, + 1.0f, 1.0f, + }; - int CPlayWidget::loadYuvTexture() - { - //加载y数据纹理 - //激活纹理单元GL_TEXTURE0 + // + + static const GLfloat textureVertices[] = { + 0.0f, 0.0f, + 1.0f, 0.0f, + 0.0f, 1.0f, + 1.0f, 1.0f, + }; + //ATTRIB_VERTEXĶֵԼʽ + glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, vertexVertices); + //ATTRIB_TEXTUREֵԼʽ + glVertexAttribPointer(ATTRIB_TEXTURE, 2, GL_FLOAT, 0, 0, textureVertices); + //ATTRIB_VERTEXԵ,Ĭǹرյ + glEnableVertexAttribArray(ATTRIB_VERTEX); + //ATTRIB_TEXTUREԵ,Ĭǹرյ + glEnableVertexAttribArray(ATTRIB_TEXTURE); + //ֱ𴴽y,u,v + m_pTextureRGB = new QOpenGLTexture(QOpenGLTexture::Target2D); + m_pTextureRGB->create(); + //ȡyֵ + id_rgb = m_pTextureRGB->textureId(); +} + +int CPlayWidget::loadYuvTexture() +{ + //y + //ԪGL_TEXTURE0 + glActiveTexture(GL_TEXTURE0); + //ʹy + glBindTexture(GL_TEXTURE_2D, id_y); + //ʹڴm_pBufYuv420pݴy + glTexImage2D(GL_TEXTURE_2D, + 0, + GL_RED, + m_nVideoW, + m_nVideoH, + 0, + GL_RED, + GL_UNSIGNED_BYTE, + m_pBufYuv420p); + + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + //u + glActiveTexture(GL_TEXTURE1);//ԪGL_TEXTURE1 + glBindTexture(GL_TEXTURE_2D, id_u); + glTexImage2D(GL_TEXTURE_2D, + 0, GL_RED, + m_nVideoW/2, + m_nVideoH/2, + 0, + GL_RED, + GL_UNSIGNED_BYTE, + (char*)m_pBufYuv420p+m_nVideoW*m_nVideoH); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + //v + glActiveTexture(GL_TEXTURE2);//ԪGL_TEXTURE2 + glBindTexture(GL_TEXTURE_2D, id_v); + glTexImage2D(GL_TEXTURE_2D, + 0, GL_RED, + m_nVideoW/2, + m_nVideoH/2, + 0, GL_RED, + GL_UNSIGNED_BYTE, + (char*)m_pBufYuv420p+m_nVideoW*m_nVideoH*5/4); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + //ָyҪʹֵ ֻ0,1,2ȱʾԪopenglԻĵط + //0ӦԪGL_TEXTURE0 1ӦԪGL_TEXTURE1 2ӦĵԪ + glUniform1i(textureUniformY, 0); + //ָuҪʹֵ + glUniform1i(textureUniformU, 1); + //ָvҪʹֵ + glUniform1i(textureUniformV, 2); + return 0; +} + +int CPlayWidget::loadRgbTexture() +{ + //rgb + //ԪGL_TEXTURE0 glActiveTexture(GL_TEXTURE0); - //使用来自y数据生成纹理 - glBindTexture(GL_TEXTURE_2D, id_y); - //使用内存中m_pBufYuv420p数据创建真正的y数据纹理 - glTexImage2D(GL_TEXTURE_2D, - 0, - GL_RED, - m_nVideoW, - m_nVideoH, - 0, - GL_RED, - GL_UNSIGNED_BYTE, - m_pBufYuv420p); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - //加载u数据纹理 - glActiveTexture(GL_TEXTURE1);//激活纹理单元GL_TEXTURE1 - glBindTexture(GL_TEXTURE_2D, id_u); - glTexImage2D(GL_TEXTURE_2D, - 0, GL_RED, - m_nVideoW/2, - m_nVideoH/2, - 0, - GL_RED, - GL_UNSIGNED_BYTE, - (char*)m_pBufYuv420p+m_nVideoW*m_nVideoH); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - //加载v数据纹理 - glActiveTexture(GL_TEXTURE2);//激活纹理单元GL_TEXTURE2 - glBindTexture(GL_TEXTURE_2D, id_v); - glTexImage2D(GL_TEXTURE_2D, - 0, GL_RED, - m_nVideoW/2, - m_nVideoH/2, - 0, GL_RED, - GL_UNSIGNED_BYTE, - (char*)m_pBufYuv420p+m_nVideoW*m_nVideoH*5/4); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - //指定y纹理要使用新值 只能用0,1,2等表示纹理单元的索引,这是opengl不人性化的地方 - //0对应纹理单元GL_TEXTURE0 1对应纹理单元GL_TEXTURE1 2对应纹理的单元 - glUniform1i(textureUniformY, 0); - //指定u纹理要使用新值 - glUniform1i(textureUniformU, 1); - //指定v纹理要使用新值 - glUniform1i(textureUniformV, 2); - return 0; - } - - int CPlayWidget::loadRgbTexture() - { - //加载rgb数据纹理 - //激活纹理单元GL_TEXTURE0 - glActiveTexture(GL_TEXTURE0); - //使用来自y数据生成纹理 + //ʹy glBindTexture(GL_TEXTURE_2D, id_rgb); - //使用内存中m_pBufYuv420p数据创建真正的y数据纹理 + //ʹڴm_pBufYuv420pݴy glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, @@ -386,4 +417,6 @@ void CPlayWidget::resizeGL(int w, int h) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glUniform1i(textureUniformRGB, 0); - } + return 0; +} + diff --git a/client/qt_gl_/yuvgl/cplaywidget.h b/client/qt_gl_/yuvgl/cplaywidget.h index b2afa63..ec88d6e 100644 --- a/client/qt_gl_/yuvgl/cplaywidget.h +++ b/client/qt_gl_/yuvgl/cplaywidget.h @@ -11,6 +11,9 @@ #define ATTRIB_VERTEX 3 #define ATTRIB_TEXTURE 4 + + + class CPlayWidget:public QOpenGLWidget,protected QOpenGLFunctions,public Camera::CameraObserver { Q_OBJECT @@ -30,34 +33,34 @@ public: int SetImgSize(uint32_t width,uint32_t ); protected: QTimer tm; - void initializeGL() Q_DECL_OVERRIDE; - void resizeGL(int w, int h) Q_DECL_OVERRIDE; - void paintGL() Q_DECL_OVERRIDE; + void initializeGL() override; + void resizeGL(int w, int h) override; + void paintGL() override; private: - IMG_TYPE mType; // 目前只支持到RGB32,YUV420P - GLuint textureUniformY; //y纹理数据位置 - GLuint textureUniformU; //u纹理数据位置 - GLuint textureUniformV; //v纹理数据位置 - GLuint textureUniformRGB; //RGB纹理位置 + IMG_TYPE mType; // Ŀǰֵֻ֧RGB32,YUV420P + GLuint textureUniformY; //yλ + GLuint textureUniformU; //uλ + GLuint textureUniformV; //vλ + GLuint textureUniformRGB; //RGBλ - GLuint textureUnifromRGB; //rgb32 的纹理位置 + GLuint textureUnifromRGB; //rgb32 λ GLuint id_rgb; GLuint id_y; GLuint id_u; - GLuint id_v; //v纹理对象ID + GLuint id_v; //vID - QOpenGLTexture* m_pTextureRGB; //RGB 纹理是一整块的 + QOpenGLTexture* m_pTextureRGB; //RGB һ - QOpenGLTexture* m_pTextureY; //y纹理对象 - QOpenGLTexture* m_pTextureU; //u纹理对象 - QOpenGLTexture* m_pTextureV; //v纹理对象 - QOpenGLShader *m_pVSHader; //顶点着色器程序对象 - QOpenGLShader *m_pFSHader; //片段着色器对象 - QOpenGLShaderProgram *m_pShaderProgram; //着色器程序容器 - int m_nVideoW; //视频分辨率宽 - int m_nVideoH; //视频分辨率高 + QOpenGLTexture* m_pTextureY; //y + QOpenGLTexture* m_pTextureU; //u + QOpenGLTexture* m_pTextureV; //v + QOpenGLShader *m_pVSHader; //ɫ + QOpenGLShader *m_pFSHader; //Ƭɫ + QOpenGLShaderProgram *m_pShaderProgram; //ɫ + int m_nVideoW; //Ƶֱʿ + int m_nVideoH; //Ƶֱʸ unsigned char *m_pBufYuv420p; unsigned char* m_pBufRgb32; diff --git a/client/qt_gl_/yuvgl/librtmp/hashswf.c b/client/qt_gl_/yuvgl/librtmp/hashswf.c index 9f4e2c0..6ec31c0 100644 --- a/client/qt_gl_/yuvgl/librtmp/hashswf.c +++ b/client/qt_gl_/yuvgl/librtmp/hashswf.c @@ -20,7 +20,6 @@ * http://www.gnu.org/copyleft/lgpl.html */ -#include #include #include #include diff --git a/client/qt_gl_/yuvgl/librtmp/log.c b/client/qt_gl_/yuvgl/librtmp/log.c index 1b52000..52e849f 100644 --- a/client/qt_gl_/yuvgl/librtmp/log.c +++ b/client/qt_gl_/yuvgl/librtmp/log.c @@ -21,7 +21,6 @@ * http://www.gnu.org/copyleft/lgpl.html */ -#include #include #include #include diff --git a/client/qt_gl_/yuvgl/librtmp/rtmp_sys.h b/client/qt_gl_/yuvgl/librtmp/rtmp_sys.h index 85d7e53..d5437c7 100644 --- a/client/qt_gl_/yuvgl/librtmp/rtmp_sys.h +++ b/client/qt_gl_/yuvgl/librtmp/rtmp_sys.h @@ -27,18 +27,17 @@ #include #include -#ifdef _MSC_VER /* MSVC */ -#define snprintf _snprintf -#define strcasecmp stricmp -#define strncasecmp strnicmp -#define vsnprintf _vsnprintf +#if _MSC_VER < 1500 /* MSVC */ + #define snprintf _snprintf + #define strcasecmp stricmp + #define strncasecmp strnicmp + #define vsnprintf _vsnprintf #endif #define GetSockError() WSAGetLastError() #define SetSockError(e) WSASetLastError(e) #define setsockopt(a,b,c,d,e) (setsockopt)(a,b,c,(const char *)d,(int)e) #define EWOULDBLOCK WSAETIMEDOUT /* we don't use nonblocking, but we do use timeouts */ -#define sleep(n) Sleep(n*1000) #define msleep(n) Sleep(n) #define SET_RCVTIMEO(tv,s) int tv = s*1000 #else /* !_WIN32 */ diff --git a/client/qt_gl_/yuvgl/main.cpp b/client/qt_gl_/yuvgl/main.cpp index 77070fd..d00a430 100644 --- a/client/qt_gl_/yuvgl/main.cpp +++ b/client/qt_gl_/yuvgl/main.cpp @@ -7,36 +7,26 @@ #include #include #include -#include -void initQss() -{ - QFile file(":/qss/css/qss.css"); - if (!file.open(QIODevice::ReadOnly)) - exit(0); - QTextStream in(&file); - QString css = in.readAll(); - qApp->setStyleSheet(css); - //qApp->setFont(QFont("微软雅黑", 9)); - return; -} +#ifdef __MINGW32__ +#include +#include "winuser.h" +#endif + + + int RegiesterOwnType(){ - //qRegisterMetaType("SerialThread"); return 0; } - int main(int argc, char *argv[]) { + QssEventFilter filter; QApplication app(argc, argv); - app.installNativeEventFilter(&filter); - - initQss(); //step 2 MainWindow main; - main.setGeometry(0,0,800,600); main.setWindowTitle("视频采集rtmp推流工具"); - + main.setFixedSize(1920,1080); main.show(); return app.exec(); } diff --git a/client/qt_gl_/yuvgl/mainwindow.cpp b/client/qt_gl_/yuvgl/mainwindow.cpp index c5809b8..ce8aa54 100644 --- a/client/qt_gl_/yuvgl/mainwindow.cpp +++ b/client/qt_gl_/yuvgl/mainwindow.cpp @@ -1,10 +1,14 @@ -#include "mainwindow.h" +#include "mainwindow.h" #include "ui_mainwindow.h" #include #include +#if _MSC_VER >= 1600 +#pragma execution_character_set("utf-8") +#endif + MainWindow::MainWindow(QWidget *parent) : - QssMainWindow(parent), + QssMainWindow(parent,0,1.5), ui(new Ui::MainWindow), m_bCameraOpen(false), mCamera(nullptr), @@ -33,16 +37,13 @@ MainWindow::MainWindow(QWidget *parent) : mMic = mAudioCapture->EnumSpeakers(); qDebug()<<"capture "<::iterator itr = mMic.begin();itr != mMic.end();itr++){ - + qDebug()<name)<index; } - //mAudioCapture->SetObserver(mAudioCoder); - //mAudioCapture->InitCapture(0, 44100, 2); - //mAudioCapture->StartCapture(); - mPusher = new H264RtmpPuser(); + mTimer = new QTimer(this); connect(mTimer, SIGNAL(timeout()), this, SLOT(DetectDpi())); - mTimer->start(1000); + mTimer->start(100); } @@ -103,7 +104,7 @@ void MainWindow::on_pushButton_2_clicked() const char* address = ui->lineEdit->text().toLocal8Bit().data(); qDebug()<RTMP264_Connect("rtmp://127.0.0.1:1939/live/1")) { - ToastWidget::showTip("已经连接上RTMP服务器",this); + ToastWidget::showTip("已经连接上RTMP服务器",this->parentWidget()); mVideoCoder->SetOberver(mPusher); mPusher->StartPush(); ui->pushButton_2->setText("关闭推流"); @@ -114,11 +115,10 @@ void MainWindow::on_pushButton_2_clicked() }*/ } else { - ToastWidget::showTip("连接RTMP服务器失败,请检查服务器地址",this); + ToastWidget::showTip("连接RTMP服务器失败,请检查服务器地址",this->parentWidget()); } }else{ - ToastWidget::showTip("正在推流,请先关闭",this); - + ToastWidget::showTip("正在推流,请先关闭",this->parentWidget()); } } } @@ -132,10 +132,10 @@ void MainWindow::on_pushButton_3_clicked() void MainWindow::DetectDpi() { - qDebug()<<"detect dpi"; +// qDebug()<<"detect dpi"; int horizontalDPI = logicalDpiX(); int verticalDPI = logicalDpiY(); - qDebug()< diff --git a/client/qt_gl_/yuvgl/mainwindow.ui b/client/qt_gl_/yuvgl/mainwindow.ui index 5f6cc67..2b192d4 100644 --- a/client/qt_gl_/yuvgl/mainwindow.ui +++ b/client/qt_gl_/yuvgl/mainwindow.ui @@ -10,6 +10,12 @@ 1116 + + + 0 + 0 + + 600 @@ -132,7 +138,7 @@ 60 - 0 + 50 diff --git a/client/qt_gl_/yuvgl/media/CameraCapture.cpp b/client/qt_gl_/yuvgl/media/CameraCapture.cpp index f9ec206..5737f73 100644 --- a/client/qt_gl_/yuvgl/media/CameraCapture.cpp +++ b/client/qt_gl_/yuvgl/media/CameraCapture.cpp @@ -1,7 +1,9 @@ #include "CameraCapture.h" #include +#ifdef __MINGW32__ #pragma comment(lib, "strmiids") +#endif //define release maco #define ReleaseInterface(x) \ if ( nullptr != x ) \ diff --git a/client/qt_gl_/yuvgl/media/CameraCapture.h b/client/qt_gl_/yuvgl/media/CameraCapture.h index 4bab7db..02e8605 100644 --- a/client/qt_gl_/yuvgl/media/CameraCapture.h +++ b/client/qt_gl_/yuvgl/media/CameraCapture.h @@ -7,8 +7,10 @@ #include #include #include "guiddef.h" + using namespace std; + class Camera { public: @@ -22,6 +24,26 @@ public: public: virtual int OnCameraData(uint8_t *dat, uint32_t size) { return 0; }; }; + + + class SampleGrabberCallback : public ISampleGrabberCB + { + public: + ULONG STDMETHODCALLTYPE AddRef(); + ULONG STDMETHODCALLTYPE Release(); + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject); + HRESULT STDMETHODCALLTYPE SampleCB(double Time, IMediaSample *pSample); + HRESULT STDMETHODCALLTYPE BufferCB(double Time, BYTE *pBuffer, long BufferLen); + std::function mNewDataCallBack; + mutex mMux; + + int SetObserver(CameraObserver *); + int RemoveObserver(CameraObserver *p); + private: + vector mObserver; + }; + + Camera(wstring camera); Camera(const Camera &) = delete; Camera& operator =(const Camera&) = delete; @@ -35,23 +57,7 @@ private: int mVideoWidth, mVideoHeight, mBitDepth; std::function mFrameCallBack; -private: - class SampleGrabberCallback : public ISampleGrabberCB - { - public: - ULONG STDMETHODCALLTYPE AddRef(); - ULONG STDMETHODCALLTYPE Release(); - HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject); - HRESULT STDMETHODCALLTYPE SampleCB(double Time, IMediaSample *pSample); - HRESULT STDMETHODCALLTYPE BufferCB(double Time, BYTE *pBuffer, long BufferLen); - std::function mNewDataCallBack; - mutex mMux; - int SetObserver(CameraObserver *); - int RemoveObserver(CameraObserver *p); - private: - vector mObserver; - }; IGraphBuilder *mGraphBuilder; ICaptureGraphBuilder2 *mCaptureGB; IMediaControl *mMediaControl; diff --git a/client/qt_gl_/yuvgl/media/RtmpPusher.h b/client/qt_gl_/yuvgl/media/RtmpPusher.h index 64010d9..48859cd 100644 --- a/client/qt_gl_/yuvgl/media/RtmpPusher.h +++ b/client/qt_gl_/yuvgl/media/RtmpPusher.h @@ -1,14 +1,22 @@ #pragma once + #ifdef __cplusplus -extern "C"{ +extern "C" { #endif + + #include "librtmp_send264.h" #include "librtmp\rtmp.h" #include "librtmp\rtmp_sys.h" + + + #ifdef __cplusplus } #endif -#include "librtmp\amf.h" + +#include "librtmp\amf.h" + #include "AACAudioCoder.h" #include "sps_decode.h" #include "VideoCoder.h" @@ -16,19 +24,11 @@ extern "C"{ #include #include #include - -#ifdef WIN32 -#include -#pragma comment(lib,"WS2_32.lib") -#pragma comment(lib,"winmm.lib") -#endif - #include using namespace std; #define RTMP_HEAD_SIZE (sizeof(RTMPPacket)+RTMP_MAX_HEADER_SIZE) - class RtmpPusher { protected: diff --git a/client/qt_gl_/yuvgl/media/audiocaptureff.cpp b/client/qt_gl_/yuvgl/media/audiocaptureff.cpp index f760762..8ec86ad 100644 --- a/client/qt_gl_/yuvgl/media/audiocaptureff.cpp +++ b/client/qt_gl_/yuvgl/media/audiocaptureff.cpp @@ -1,6 +1,6 @@ #include "audiocaptureff.h" - +#ifdef __MINGW32__ std::string WString2String(const std::wstring& ws) { std::string strLocale = setlocale(LC_ALL, ""); @@ -14,6 +14,8 @@ std::string WString2String(const std::wstring& ws) setlocale(LC_ALL, strLocale.c_str()); return strResult; } +#endif + vector CaptureAudioFfmpeg::EnumSpeakers() { vector ret; diff --git a/client/qt_gl_/yuvgl/media/audiocaptureff.h b/client/qt_gl_/yuvgl/media/audiocaptureff.h index 7dae1c8..15276ac 100644 --- a/client/qt_gl_/yuvgl/media/audiocaptureff.h +++ b/client/qt_gl_/yuvgl/media/audiocaptureff.h @@ -70,12 +70,12 @@ private: CaptureAudioObserver *observer; int initAudioFilters(); AVFormatContext *mInfmt_ctx = nullptr; - AVFormatContext * mOutfmt_ctx = NULL; + AVFormatContext * mOutfmt_ctx = nullptr; int64_t mLastReadPacktTime; - AVFilterContext *mBuffersinkCtx = NULL; - AVFilterContext *mBuffersrcCtx = NULL; - AVFilterGraph *mFilterGraph = NULL; - AVCodecContext* mOutPutAudioEncContext = NULL; + AVFilterContext *mBuffersinkCtx = nullptr; + AVFilterContext *mBuffersrcCtx = nullptr; + AVFilterGraph *mFilterGraph = nullptr; + AVCodecContext* mOutPutAudioEncContext = nullptr; int64_t mAudioCount = 0; int flush_encoder(AVFormatContext *fmt_ctx, unsigned int stream_index); diff --git a/client/qt_gl_/yuvgl/utils/Base64.cpp b/client/qt_gl_/yuvgl/utils/Base64.cpp index dccaeac..0dc54f0 100644 --- a/client/qt_gl_/yuvgl/utils/Base64.cpp +++ b/client/qt_gl_/yuvgl/utils/Base64.cpp @@ -1,5 +1,4 @@ #include "Base64.h" -#include "stdio.h" #include "string.h" int DecodeBase64(char * pInput, char * pOutput) { int i = 0; diff --git a/client/qt_gl_/yuvgl/yuvgl.pro b/client/qt_gl_/yuvgl/yuvgl.pro index a8122e0..7dd5606 100644 --- a/client/qt_gl_/yuvgl/yuvgl.pro +++ b/client/qt_gl_/yuvgl/yuvgl.pro @@ -9,7 +9,10 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets QT += network QT += multimedia TARGET = yuvgl -TEMPLATE = app + + +INCLUDEPATH += $$[QT_INSTALL_HEADERS]/QtZlib + include(D:\\project\\c++qt\\qsswraper\\qsswraper.pri) # The following define makes your compiler emit warnings if you use @@ -21,9 +24,10 @@ DEFINES += QT_DEPRECATED_WARNINGS # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 -QMAKE_CXXFLAGS += -std=c++11 -CONFIG += c++11 +CONFIG += C++11 + +DEFINES += WIN32_LEAN_AND_MEAN SOURCES += \ components/toast.cpp \ @@ -56,10 +60,19 @@ FORMS += \ mainwindow.ui INCLUDEPATH += media/ third/ffmpeg/include/ inc/ third/ -LIBS += -L$$PWD/third/libs/ -LIBS += -lm -lavformat -lavdevice -lavfilter -lavcodec -lavutil -lswresample -lswscale -lpthread -lm -lfdk-aac -lx264 -liconv -lucrtbase -lstrmiids -LIBS += -lole32 -loleAut32 -lquartz -ldxguid -ldxapi -lwinmm -lbcrypt -lssl -lcrypto -lGdi32 -lws2_32 -lbz2 -lz -lportaudio -lshlwapi -lvfw32 -lpostproc -luuid -# Default rules for deployment. +contains(DEFINES, __MINGW32__){ + message("sfasdfdsf") + LIBS += -L$$PWD/third/libs/ + LIBS += -lm -lavformat -lavdevice -lavfilter -lavcodec -lavutil -lswresample -lswscale -lpthread -lm -lfdk-aac -lx264 -liconv -lucrtbase -lstrmiids + LIBS += -lole32 -loleAut32 -lquartz -ldxguid -ldxapi -lwinmm -lbcrypt -lssl -lcrypto -lGdi32 -lws2_32 -lbz2 -lz -lportaudio -lshlwapi -lvfw32 -lpostproc -luuid +}else{ + message("111") + LIBS += -L$$PWD/third/libs/ + LIBS += -lm -lavformat -lavdevice -lavfilter -lavcodec -lavutil -lswresample -lswscale -lpthread -lm -lfdk-aac -lx264 -liconv -lucrtbase -lstrmiids + LIBS += -lole32 -loleAut32 -lquartz -ldxguid -ldxapi -lwinmm -lbcrypt -lssl -lcrypto -lGdi32 -lz -lportaudio -lshlwapi -lvfw32 -lpostproc -luuid +} + + QMAKE_CXXFLAGS_RELEASE += -Zi QMAKE_LFLAGS_RELEASE += /DEBUG /OPT:REF diff --git a/client/qt_gl_/yuvgl/yuvgl.pro.user b/client/qt_gl_/yuvgl/yuvgl.pro.user index 10f4775..af761af 100644 --- a/client/qt_gl_/yuvgl/yuvgl.pro.user +++ b/client/qt_gl_/yuvgl/yuvgl.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -29,7 +29,7 @@ 2 - UTF-8 + GB2312 false 4 false @@ -44,7 +44,7 @@ true 0 8 - true + false 1 true true @@ -63,6 +63,492 @@ ProjectExplorer.Project.Target.0 + + Desktop Qt 5.14.0 MSVC2017 32bit + Desktop Qt 5.14.0 MSVC2017 32bit + qt.qt5.5140.win32_msvc2017_kit + 0 + 0 + 0 + + D:/project/multimedia/client/qt_gl_/yuvgl + + + true + QtProjectManager.QMakeBuildStep + true + + false + false + false + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + + + D:/project/multimedia/client/qt_gl_/build-yuvgl-Desktop_Qt_5_14_0_MSVC2017_32bit-Release + + + true + QtProjectManager.QMakeBuildStep + false + + false + false + true + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + + + D:/project/multimedia/client/qt_gl_/build-yuvgl-Desktop_Qt_5_14_0_MSVC2017_32bit-Profile + + + true + QtProjectManager.QMakeBuildStep + true + + false + true + true + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + + 3 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + Qt4ProjectManager.Qt4RunConfiguration:D:/project/multimedia/client/qt_gl_/yuvgl/yuvgl.pro + D:/project/multimedia/client/qt_gl_/yuvgl/yuvgl.pro + + false + + false + true + true + false + false + true + + D:/project/multimedia/client/qt_gl_/yuvgl + + 1 + + + + ProjectExplorer.Project.Target.1 + + Desktop Qt 5.14.0 MSVC2017 64bit + Desktop Qt 5.14.0 MSVC2017 64bit + qt.qt5.5140.win64_msvc2017_64_kit + 0 + 0 + 0 + + D:/project/multimedia/client/qt_gl_/yuvgl + + + true + QtProjectManager.QMakeBuildStep + true + + false + false + false + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + + + D:/project/multimedia/client/qt_gl_/build-yuvgl-Desktop_Qt_5_14_0_MSVC2017_64bit-Release + + + true + QtProjectManager.QMakeBuildStep + false + + false + false + true + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + + + D:/project/multimedia/client/qt_gl_/build-yuvgl-Desktop_Qt_5_14_0_MSVC2017_64bit-Profile + + + true + QtProjectManager.QMakeBuildStep + true + + false + true + true + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + + 3 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + Qt4ProjectManager.Qt4RunConfiguration:D:/project/multimedia/client/qt_gl_/yuvgl/yuvgl.pro + D:/project/multimedia/client/qt_gl_/yuvgl/yuvgl.pro + + false + + false + true + true + false + false + true + + + + 1 + + + + ProjectExplorer.Project.Target.2 Desktop Qt 5.14.0 MinGW 32-bit Desktop Qt 5.14.0 MinGW 32-bit @@ -299,14 +785,257 @@ false true - D:/project/multimedia/client/qt_gl_/build-yuvgl-Desktop_Qt_5_14_0_MinGW_32_bit-Debug + + + 1 + + + + ProjectExplorer.Project.Target.3 + + Desktop Qt 5.14.0 MinGW 64-bit + Desktop Qt 5.14.0 MinGW 64-bit + qt.qt5.5140.win64_mingw73_kit + 0 + 0 + 0 + + D:/project/multimedia/client/qt_gl_/build-yuvgl-Desktop_Qt_5_14_0_MinGW_64_bit-Debug + + + true + QtProjectManager.QMakeBuildStep + true + + false + false + false + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + + + D:/project/multimedia/client/qt_gl_/build-yuvgl-Desktop_Qt_5_14_0_MinGW_64_bit-Release + + + true + QtProjectManager.QMakeBuildStep + false + + false + false + true + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + + + D:/project/multimedia/client/qt_gl_/build-yuvgl-Desktop_Qt_5_14_0_MinGW_64_bit-Profile + + + true + QtProjectManager.QMakeBuildStep + true + + false + true + true + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + + 3 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + Qt4ProjectManager.Qt4RunConfiguration:D:/project/multimedia/client/qt_gl_/yuvgl/yuvgl.pro + D:/project/multimedia/client/qt_gl_/yuvgl/yuvgl.pro + + false + + false + true + true + false + false + true + + 1 ProjectExplorer.Project.TargetCount - 1 + 4 ProjectExplorer.Project.Updater.FileVersion