no message
parent
2bc06e7dc3
commit
d3aff4e773
|
@ -34,14 +34,11 @@ void main(void) \
|
||||||
// rgb片段着色器源码
|
// rgb片段着色器源码
|
||||||
const char *fsrcrgb = "in vec3 ourColor; \
|
const char *fsrcrgb = "in vec3 ourColor; \
|
||||||
in vec2 TexCoord; \
|
in vec2 TexCoord; \
|
||||||
out vec4 color; \
|
uniform sampler2D rgbdata; \
|
||||||
uniform sampler2D ourTexture1; \
|
|
||||||
// Texture samplers \
|
|
||||||
uniform sampler2D ourTexture2; \
|
|
||||||
uniform float mixValue; \
|
uniform float mixValue; \
|
||||||
void main() \
|
void main() \
|
||||||
{ \
|
{ \
|
||||||
color = texture(ourTexture1, TexCoord); \
|
gl_FragColor = texture(rgbdata, TexCoord); \
|
||||||
}";
|
}";
|
||||||
|
|
||||||
void CPlayWidget::OnUpdateFrame() {
|
void CPlayWidget::OnUpdateFrame() {
|
||||||
|
@ -68,6 +65,7 @@ CPlayWidget::CPlayWidget(QWidget *parent):QOpenGLWidget(parent) {
|
||||||
id_y = 0;
|
id_y = 0;
|
||||||
id_u = 0;
|
id_u = 0;
|
||||||
id_v = 0;
|
id_v = 0;
|
||||||
|
m_pTextureRGB = nullptr;
|
||||||
m_pBufYuv420p = NULL;
|
m_pBufYuv420p = NULL;
|
||||||
m_pVSHader = NULL;
|
m_pVSHader = NULL;
|
||||||
m_pFSHader = NULL;
|
m_pFSHader = NULL;
|
||||||
|
@ -81,7 +79,7 @@ CPlayWidget::CPlayWidget(QWidget *parent):QOpenGLWidget(parent) {
|
||||||
mType = TYPE_YUV420P;
|
mType = TYPE_YUV420P;
|
||||||
connect(&this->tm,SIGNAL(timeout()),this,SLOT(OnUpdateFrame()));
|
connect(&this->tm,SIGNAL(timeout()),this,SLOT(OnUpdateFrame()));
|
||||||
|
|
||||||
tm.start(1000);
|
//tm.start(1000);
|
||||||
}
|
}
|
||||||
CPlayWidget::~CPlayWidget() {
|
CPlayWidget::~CPlayWidget() {
|
||||||
}
|
}
|
||||||
|
@ -91,8 +89,6 @@ void CPlayWidget::PlayOneFrame() {//函数功能读取一张yuv图像数据进
|
||||||
//打开yuv视频文件 注意修改文件路径
|
//打开yuv视频文件 注意修改文件路径
|
||||||
// m_pYuvFile = fopen("F://OpenglYuvDemo//1920_1080.yuv", "rb");
|
// m_pYuvFile = fopen("F://OpenglYuvDemo//1920_1080.yuv", "rb");
|
||||||
m_pYuvFile = fopen("F://md_sample_sp420_1080p.yuv", "rb");
|
m_pYuvFile = fopen("F://md_sample_sp420_1080p.yuv", "rb");
|
||||||
m_nVideoW = 1920;
|
|
||||||
m_nVideoH = 1080;
|
|
||||||
//根据yuv视频数据的分辨率设置宽高,demo当中是1080p,这个地方要注意跟实际数据分辨率对应上
|
//根据yuv视频数据的分辨率设置宽高,demo当中是1080p,这个地方要注意跟实际数据分辨率对应上
|
||||||
// m_nVideoW = 1920;
|
// m_nVideoW = 1920;
|
||||||
// m_nVideoH = 1080;
|
// m_nVideoH = 1080;
|
||||||
|
@ -122,6 +118,25 @@ int CPlayWidget::SetDataType(CPlayWidget::IMG_TYPE type)
|
||||||
this->mType = type;
|
this->mType = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int CPlayWidget::OnCameraData(uint8_t *dat, uint32_t size)
|
||||||
|
{
|
||||||
|
memcpy(this->m_pBufRgb32,dat,size);
|
||||||
|
qDebug()<<"camera receive data"<<size<<"\r\n";
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
int CPlayWidget::SetImgSize(uint32_t width, uint32_t height)
|
||||||
|
{
|
||||||
|
m_nVideoH = height;
|
||||||
|
m_nVideoW = width;
|
||||||
|
if(mType == TYPE_RGB32){
|
||||||
|
m_pBufRgb32 = new uint8_t[width * height *4];
|
||||||
|
}
|
||||||
|
if(mType == TYPE_YUV420P){
|
||||||
|
m_pBufYuv420p = new uint8_t[width * height *3/2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
|
@ -157,8 +172,12 @@ void CPlayWidget::initializeGL()
|
||||||
}
|
}
|
||||||
//初始化片段着色器 功能gpu中yuv转换成rgb
|
//初始化片段着色器 功能gpu中yuv转换成rgb
|
||||||
m_pFSHader = new QOpenGLShader(QOpenGLShader::Fragment, this);
|
m_pFSHader = new QOpenGLShader(QOpenGLShader::Fragment, this);
|
||||||
|
if(mType == TYPE_RGB32){
|
||||||
bCompile = m_pFSHader->compileSourceCode(fsrcyuv);
|
bCompile = m_pFSHader->compileSourceCode(fsrcrgb);
|
||||||
|
}
|
||||||
|
if(mType == TYPE_YUV420P){
|
||||||
|
bCompile = m_pFSHader->compileSourceCode(fsrcyuv);
|
||||||
|
}
|
||||||
if(!bCompile)
|
if(!bCompile)
|
||||||
{
|
{
|
||||||
// todo 设置错误状态
|
// todo 设置错误状态
|
||||||
|
@ -180,46 +199,13 @@ void CPlayWidget::initializeGL()
|
||||||
m_pShaderProgram->link();
|
m_pShaderProgram->link();
|
||||||
//激活所有链接
|
//激活所有链接
|
||||||
m_pShaderProgram->bind();
|
m_pShaderProgram->bind();
|
||||||
//读取着色器中的数据变量tex_y, tex_u, tex_v的位置,这些变量的声明可以在
|
|
||||||
//片段着色器源码中可以看到
|
if(this->mType == TYPE_YUV420P){
|
||||||
textureUniformY = m_pShaderProgram->uniformLocation("tex_y");
|
initShaderYuv();
|
||||||
textureUniformU = m_pShaderProgram->uniformLocation("tex_u");
|
}
|
||||||
textureUniformV = m_pShaderProgram->uniformLocation("tex_v");
|
if(this->mType == TYPE_RGB32){
|
||||||
// 顶点矩阵
|
initShaderRgb();
|
||||||
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();
|
|
||||||
glClearColor(0.3,0.3,0.3,0.0);//设置背景色
|
glClearColor(0.3,0.3,0.3,0.0);//设置背景色
|
||||||
}
|
}
|
||||||
void CPlayWidget::resizeGL(int w, int h)
|
void CPlayWidget::resizeGL(int w, int h)
|
||||||
|
@ -233,12 +219,94 @@ void CPlayWidget::resizeGL(int w, int h)
|
||||||
}
|
}
|
||||||
void CPlayWidget::paintGL()
|
void CPlayWidget::paintGL()
|
||||||
{
|
{
|
||||||
loadYuvTexture();
|
if(mType == TYPE_YUV420P)
|
||||||
|
loadYuvTexture();
|
||||||
|
if(mType == TYPE_RGB32){
|
||||||
|
loadRgbTexture();
|
||||||
|
}
|
||||||
//使用顶点数组方式绘制图形
|
//使用顶点数组方式绘制图形
|
||||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||||
return;
|
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()
|
int CPlayWidget::loadYuvTexture()
|
||||||
{
|
{
|
||||||
//加载y数据纹理
|
//加载y数据纹理
|
||||||
|
@ -288,3 +356,19 @@ void CPlayWidget::resizeGL(int w, int h)
|
||||||
glUniform1i(textureUniformV, 2);
|
glUniform1i(textureUniformV, 2);
|
||||||
return 0;
|
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);
|
||||||
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
#define ATTRIB_VERTEX 3
|
#define ATTRIB_VERTEX 3
|
||||||
#define ATTRIB_TEXTURE 4
|
#define ATTRIB_TEXTURE 4
|
||||||
class CPlayWidget:public QOpenGLWidget,protected QOpenGLFunctions
|
class CPlayWidget:public QOpenGLWidget,protected QOpenGLFunctions,public Camera::CameraObserver
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public slots:
|
public slots:
|
||||||
|
@ -26,6 +26,8 @@ public:
|
||||||
~CPlayWidget();
|
~CPlayWidget();
|
||||||
void PlayOneFrame();
|
void PlayOneFrame();
|
||||||
int SetDataType(IMG_TYPE);
|
int SetDataType(IMG_TYPE);
|
||||||
|
int OnCameraData(uint8_t *dat, uint32_t size) override;
|
||||||
|
int SetImgSize(uint32_t width,uint32_t );
|
||||||
protected:
|
protected:
|
||||||
QTimer tm;
|
QTimer tm;
|
||||||
void initializeGL() Q_DECL_OVERRIDE;
|
void initializeGL() Q_DECL_OVERRIDE;
|
||||||
|
@ -36,14 +38,18 @@ private:
|
||||||
GLuint textureUniformY; //y纹理数据位置
|
GLuint textureUniformY; //y纹理数据位置
|
||||||
GLuint textureUniformU; //u纹理数据位置
|
GLuint textureUniformU; //u纹理数据位置
|
||||||
GLuint textureUniformV; //v纹理数据位置
|
GLuint textureUniformV; //v纹理数据位置
|
||||||
|
GLuint textureUniformRGB; //RGB纹理位置
|
||||||
|
|
||||||
|
|
||||||
GLuint textureUnifromRGB; //rgb32 的纹理位置
|
GLuint textureUnifromRGB; //rgb32 的纹理位置
|
||||||
|
|
||||||
|
GLuint id_rgb;
|
||||||
GLuint id_y;
|
GLuint id_y;
|
||||||
GLuint id_u;
|
GLuint id_u;
|
||||||
GLuint id_v; //v纹理对象ID
|
GLuint id_v; //v纹理对象ID
|
||||||
|
|
||||||
|
QOpenGLTexture* m_pTextureRGB; //RGB 纹理是一整块的
|
||||||
|
|
||||||
QOpenGLTexture* m_pTextureY; //y纹理对象
|
QOpenGLTexture* m_pTextureY; //y纹理对象
|
||||||
QOpenGLTexture* m_pTextureU; //u纹理对象
|
QOpenGLTexture* m_pTextureU; //u纹理对象
|
||||||
QOpenGLTexture* m_pTextureV; //v纹理对象
|
QOpenGLTexture* m_pTextureV; //v纹理对象
|
||||||
|
@ -52,9 +58,14 @@ private:
|
||||||
QOpenGLShaderProgram *m_pShaderProgram; //着色器程序容器
|
QOpenGLShaderProgram *m_pShaderProgram; //着色器程序容器
|
||||||
int m_nVideoW; //视频分辨率宽
|
int m_nVideoW; //视频分辨率宽
|
||||||
int m_nVideoH; //视频分辨率高
|
int m_nVideoH; //视频分辨率高
|
||||||
unsigned char* m_pBufYuv420p;
|
unsigned char *m_pBufYuv420p;
|
||||||
|
unsigned char* m_pBufRgb32;
|
||||||
|
|
||||||
FILE* m_pYuvFile;
|
FILE* m_pYuvFile;
|
||||||
|
|
||||||
|
void initShaderYuv();
|
||||||
|
void initShaderRgb();
|
||||||
|
|
||||||
int loadYuvTexture();
|
int loadYuvTexture();
|
||||||
int loadRgbTexture();
|
int loadRgbTexture();
|
||||||
};
|
};
|
||||||
|
|
|
@ -12,7 +12,8 @@ int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
QApplication a(argc, argv);
|
QApplication a(argc, argv);
|
||||||
CPlayWidget gPlayer(nullptr);
|
CPlayWidget gPlayer(nullptr);
|
||||||
|
gPlayer.SetDataType(CPlayWidget::IMG_TYPE::TYPE_RGB32);
|
||||||
|
gPlayer.SetImgSize(1920,1080);
|
||||||
gPlayer.show();
|
gPlayer.show();
|
||||||
|
|
||||||
Camera *gCam = Camera::GetInstance();
|
Camera *gCam = Camera::GetInstance();
|
||||||
|
@ -20,7 +21,7 @@ int main(int argc, char *argv[])
|
||||||
for(auto itr = names.begin();itr != names.end();itr++){
|
for(auto itr = names.begin();itr != names.end();itr++){
|
||||||
qDebug()<<QString::fromStdWString(*itr);
|
qDebug()<<QString::fromStdWString(*itr);
|
||||||
}
|
}
|
||||||
gCam->SetCallBack(CameraDataCallback);
|
gCam->SetObserver(&gPlayer);
|
||||||
if(gCam->Open(*names.begin()) ){
|
if(gCam->Open(*names.begin()) ){
|
||||||
qDebug("open success");
|
qDebug("open success");
|
||||||
}else{
|
}else{
|
||||||
|
|
Loading…
Reference in New Issue