diff --git a/client/qt_gl_render/yuvgl/cplaywidget.cpp b/client/qt_gl_render/yuvgl/cplaywidget.cpp index 014b786..bd9f811 100644 --- a/client/qt_gl_render/yuvgl/cplaywidget.cpp +++ b/client/qt_gl_render/yuvgl/cplaywidget.cpp @@ -34,14 +34,11 @@ void main(void) \ // rgb片段着色器源码 const char *fsrcrgb = "in vec3 ourColor; \ in vec2 TexCoord; \ - out vec4 color; \ - uniform sampler2D ourTexture1; \ - // Texture samplers \ - uniform sampler2D ourTexture2; \ + uniform sampler2D rgbdata; \ uniform float mixValue; \ void main() \ { \ - color = texture(ourTexture1, TexCoord); \ + gl_FragColor = texture(rgbdata, TexCoord); \ }"; void CPlayWidget::OnUpdateFrame() { @@ -68,6 +65,7 @@ CPlayWidget::CPlayWidget(QWidget *parent):QOpenGLWidget(parent) { id_y = 0; id_u = 0; id_v = 0; + m_pTextureRGB = nullptr; m_pBufYuv420p = NULL; m_pVSHader = NULL; m_pFSHader = NULL; @@ -81,7 +79,7 @@ CPlayWidget::CPlayWidget(QWidget *parent):QOpenGLWidget(parent) { mType = TYPE_YUV420P; connect(&this->tm,SIGNAL(timeout()),this,SLOT(OnUpdateFrame())); - tm.start(1000); + //tm.start(1000); } CPlayWidget::~CPlayWidget() { } @@ -91,8 +89,6 @@ void CPlayWidget::PlayOneFrame() {//函数功能读取一张yuv图像数据进 //打开yuv视频文件 注意修改文件路径 // m_pYuvFile = fopen("F://OpenglYuvDemo//1920_1080.yuv", "rb"); m_pYuvFile = fopen("F://md_sample_sp420_1080p.yuv", "rb"); - m_nVideoW = 1920; - m_nVideoH = 1080; //根据yuv视频数据的分辨率设置宽高,demo当中是1080p,这个地方要注意跟实际数据分辨率对应上 // m_nVideoW = 1920; // m_nVideoH = 1080; @@ -122,6 +118,25 @@ int CPlayWidget::SetDataType(CPlayWidget::IMG_TYPE type) this->mType = type; } +int CPlayWidget::OnCameraData(uint8_t *dat, uint32_t size) +{ + memcpy(this->m_pBufRgb32,dat,size); + qDebug()<<"camera receive data"<compileSourceCode(fsrcyuv); + if(mType == TYPE_RGB32){ + bCompile = m_pFSHader->compileSourceCode(fsrcrgb); + } + if(mType == TYPE_YUV420P){ + bCompile = m_pFSHader->compileSourceCode(fsrcyuv); + } if(!bCompile) { // todo 设置错误状态 @@ -180,46 +199,13 @@ void CPlayWidget::initializeGL() m_pShaderProgram->link(); //激活所有链接 m_pShaderProgram->bind(); - //读取着色器中的数据变量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(); + + if(this->mType == TYPE_YUV420P){ + initShaderYuv(); + } + if(this->mType == TYPE_RGB32){ + initShaderRgb(); + } glClearColor(0.3,0.3,0.3,0.0);//设置背景色 } void CPlayWidget::resizeGL(int w, int h) @@ -233,12 +219,94 @@ void CPlayWidget::resizeGL(int w, int h) } void CPlayWidget::paintGL() { - loadYuvTexture(); + 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::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, 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_pTextureRGB = new QOpenGLTexture(QOpenGLTexture::Target2D); + m_pTextureRGB->create(); + //获取返回y分量的纹理索引值 + id_rgb = m_pTextureRGB->textureId(); + } + int CPlayWidget::loadYuvTexture() { //加载y数据纹理 @@ -288,3 +356,19 @@ void CPlayWidget::resizeGL(int w, int h) glUniform1i(textureUniformV, 2); return 0; } + + int CPlayWidget::loadRgbTexture() + { + //加载rgb数据纹理 + //激活纹理单元GL_TEXTURE0 + glActiveTexture(GL_TEXTURE0); + //使用来自y数据生成纹理 + glBindTexture(GL_TEXTURE_2D, id_rgb); + //使用内存中m_pBufYuv420p数据创建真正的y数据纹理 + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_nVideoW, m_nVideoH, 0, GL_RGB, GL_UNSIGNED_BYTE, m_pBufRgb32); + 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); + glUniform1i(textureUniformRGB, 0); + } diff --git a/client/qt_gl_render/yuvgl/cplaywidget.h b/client/qt_gl_render/yuvgl/cplaywidget.h index 9781211..b2afa63 100644 --- a/client/qt_gl_render/yuvgl/cplaywidget.h +++ b/client/qt_gl_render/yuvgl/cplaywidget.h @@ -11,7 +11,7 @@ #define ATTRIB_VERTEX 3 #define ATTRIB_TEXTURE 4 -class CPlayWidget:public QOpenGLWidget,protected QOpenGLFunctions +class CPlayWidget:public QOpenGLWidget,protected QOpenGLFunctions,public Camera::CameraObserver { Q_OBJECT public slots: @@ -26,6 +26,8 @@ public: ~CPlayWidget(); void PlayOneFrame(); int SetDataType(IMG_TYPE); + int OnCameraData(uint8_t *dat, uint32_t size) override; + int SetImgSize(uint32_t width,uint32_t ); protected: QTimer tm; void initializeGL() Q_DECL_OVERRIDE; @@ -36,14 +38,18 @@ private: GLuint textureUniformY; //y纹理数据位置 GLuint textureUniformU; //u纹理数据位置 GLuint textureUniformV; //v纹理数据位置 + GLuint textureUniformRGB; //RGB纹理位置 GLuint textureUnifromRGB; //rgb32 的纹理位置 - + GLuint id_rgb; GLuint id_y; GLuint id_u; GLuint id_v; //v纹理对象ID + + QOpenGLTexture* m_pTextureRGB; //RGB 纹理是一整块的 + QOpenGLTexture* m_pTextureY; //y纹理对象 QOpenGLTexture* m_pTextureU; //u纹理对象 QOpenGLTexture* m_pTextureV; //v纹理对象 @@ -52,9 +58,14 @@ private: QOpenGLShaderProgram *m_pShaderProgram; //着色器程序容器 int m_nVideoW; //视频分辨率宽 int m_nVideoH; //视频分辨率高 - unsigned char* m_pBufYuv420p; + unsigned char *m_pBufYuv420p; + unsigned char* m_pBufRgb32; + FILE* m_pYuvFile; + void initShaderYuv(); + void initShaderRgb(); + int loadYuvTexture(); int loadRgbTexture(); }; diff --git a/client/qt_gl_render/yuvgl/main.cpp b/client/qt_gl_render/yuvgl/main.cpp index 5e5f334..7d12ce9 100644 --- a/client/qt_gl_render/yuvgl/main.cpp +++ b/client/qt_gl_render/yuvgl/main.cpp @@ -12,7 +12,8 @@ int main(int argc, char *argv[]) { QApplication a(argc, argv); CPlayWidget gPlayer(nullptr); - + gPlayer.SetDataType(CPlayWidget::IMG_TYPE::TYPE_RGB32); + gPlayer.SetImgSize(1920,1080); gPlayer.show(); Camera *gCam = Camera::GetInstance(); @@ -20,7 +21,7 @@ int main(int argc, char *argv[]) for(auto itr = names.begin();itr != names.end();itr++){ qDebug()<SetCallBack(CameraDataCallback); + gCam->SetObserver(&gPlayer); if(gCam->Open(*names.begin()) ){ qDebug("open success"); }else{