• 大小: 1.17MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-11-10
  • 语言: 其他
  • 标签: qt  opengl  渲染  yuv  

资源简介

qt opengl(after ver2.1) 渲染 nv12 qt opengl(after ver2.1) 渲染 nv12 qt opengl(after ver2.1) 渲染 nv12

资源截图

代码片段和文件信息

#include 

#include 
#include 

Gl_widget::Gl_widget(int width int height const QString& path QWidget* parent)
    :QGLWidget(QGLFormat(QGL::SampleBuffers) parent)
     video_width(width)
     video_height(height)
     y_texture(0)
     uv_texture(0)
     y_data(0)
     uv_data(0)
     file(path)
     timer(this)
     program(this)
{
    setFocusPolicy(Qt::StrongFocus);

    y_data = new unsigned char[(width*height*3)>>1];
    uv_data = y_data+(width*height);
    file.open(QIODevice::ReadOnly);
}

Gl_widget::~Gl_widget()
{
    file.close();

    glDeleteTextures(1 &y_texture);
    glDeleteTextures(1 &uv_texture);

    uv_data = 0;
    delete [] y_data;
    y_data = 0;
}
void Gl_widget::initializeGL()
{
    qDebug() << program.addShaderFromSourceCode(QGLShader::Fragment
     “uniform sampler2D y_texture;\n“
     “uniform sampler2D uv_texture;\n“
     “void main(void)\n“
     “{\n“
     “   float y u v red green blue;\n“
     “   y = texture2D(y_texture gl_TexCoord[0].st).r ;\n“
     “   y =  1.1643 * (y - 0.0625);\n“
     “   u = texture2D(uv_texture gl_TexCoord[0].st).r - 0.5;\n“
     “   v = texture2D(uv_texture gl_TexCoord[0].st).a - 0.5;\n“
     “   red = y+1.5958*v;\n“
     “   green = y-0.39173*u-0.81290*v;\n“
     “   blue = y+2.017*u;\n“
     “   gl_FragColor = vec4(red green blue 1.0);\n“
     “}“);

    qDebug() << program.link();
    qDebug() << program.bind();

    glGenTextures(1 &y_texture);
    glGenTextures(1 &uv_texture);

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D y_texture);
    glTexParameterf(GL_TEXTURE_2D GL_TEXTURE_MAG_FILTER GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D GL_TEXTURE_MIN_FILTER GL_NEAREST);
    glTexEnvf(GL_TEXTURE_ENVGL_TEXTURE_ENV_MODEGL_DECAL);
    glTexImage2D(GL_TEXTURE_2D 0 GL_LUMINANCE video_width video_height 0 GL_LUMINANCE GL_UNSIGNED_BYTE y_data);

    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D uv_texture);
    glTexParameterf(GL_TEXTURE_2D GL_TEXTURE_MAG_FILTER GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D GL_TEXTURE_MIN_FILTER GL_NEAREST);
    glTexEnvf(GL_TEXTURE_ENVGL_TEXTURE_ENV_MODEGL_DECAL);
    glTexImage2D(GL_TEXTURE_2D 0 GL_LUMINANCE_ALPHA video_width>>1 video_height>>1 0 GL_LUMINANCE_ALPHA GL_UNSIGNED_BYTE uv_data);

    program.setUniformValue(“y_texture“ 0);
    program.setUniformValue(“uv_texture“ 1);

    connect(&timer SIGNAL(timeout()) this SLOT(on_timeout()));
    timer.setInterval(25);
    timer.start();
}

void Gl_widget::paintGL()
{
    file.read((char*)y_data (video_width*video_height*3)>>1);

    glActiveTexture(GL_TEXTURE0);
    glTexSubImage2D(GL_TEXTURE_2D 0 0 0 video_width video_height GL_LUMINANCE GL_UNSIGNED_BYTE y_data);
    glActiveTexture(GL_TEXTURE1);
    glTexSubImage2D(GL_TEXTURE_2D 0 0 0 video_width>>1 video_height>>1 GL_LUMINANCE_ALPHA GL_UNSIGNED_BYTE uv_data);


    glClear(GL_COLOR_BUFFER_BIT);

    glEnable(

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2017-09-27 16:48  nv12_shader\
     文件        3605  2017-09-25 15:40  nv12_shader\gl_widget.cpp
     文件         673  2017-09-25 15:40  nv12_shader\gl_widget.h
     文件         280  2017-09-27 15:53  nv12_shader\main.cpp
     文件         280  2017-09-27 15:53  nv12_shader\main.cpp~
     文件     4320000  2017-09-25 15:40  nv12_shader\test_yuv420p_320x180.yuv
     文件     3110400  2017-09-25 15:42  nv12_shader\videotestsrc_1920x1080.nv12
     文件         363  2017-09-25 15:40  nv12_shader\yuv_shader.pro
     文件       44458  2017-09-25 15:40  nv12_shader\yuv_shader.pro.user
     文件         315  2017-09-25 15:40  nv12_shader\yuv_window.cpp
     文件         347  2017-09-25 15:40  nv12_shader\yuv_window.h
     文件         433  2017-09-25 15:40  nv12_shader\yuv_window.ui

评论

共有 条评论