#include "qvideowidget_uyvy.h" #include "qvideoshader.h" #include "mainwindow.h" #include QVideoWidget_UYVY::QVideoWidget_UYVY(QWidget* parent, Qt::WindowFlags f):QVideoWidget(parent, f) { CommonData* pCommonData = MainWindow::GetCommonData(); int nVideoWidth = pCommonData->GetVideoWidth(); int nVideoHeight = pCommonData->GetVideoHeight(); m_nTextureWidth = nVideoWidth; m_nTextureHeight = nVideoHeight; } QVideoWidget_UYVY::~QVideoWidget_UYVY() { } void QVideoWidget_UYVY::initializeGL() { QOpenGLContext * pCurrent = QOpenGLContext::currentContext(); QSurfaceFormat format; format.setVersion(3, 0); format.setDepthBufferSize(24); QSurfaceFormat::setDefaultFormat(format); initializeOpenGLFunctions(); QString strGLSLVersion = reinterpret_cast(glGetString(GL_SHADING_LANGUAGE_VERSION)); qDebug("glslVer: %s\n",strGLSLVersion); int nGLSLVersion = 30; if(strGLSLVersion.contains("3.1")==true) { nGLSLVersion = 31; } else if(strGLSLVersion.contains("3.2")==true) { nGLSLVersion = 32; } setUpdateBehavior(QOpenGLWidget::NoPartialUpdate); //setUpdateBehavior(QOpenGLWidget::PartialUpdate); GLuint nFrameBufferObject = defaultFramebufferObject(); int i=0; for(i=0 ; i<18 ; i++) { m_fNormalRect[i] = -1; } GLfloat afTexCoord[] = { 0.0f,1.0f, 1.0f,1.0f, 0.0f,0.0f, 1.0f,0.0f, 0.0f,0.0f, 1.0f,1.0f }; memcpy(m_fNormalRectTexture, afTexCoord, sizeof(GLfloat)*2*6); m_nTmpDisplayType = 0; CommonData* pCommonData = MainWindow::GetCommonData(); int nWidth = pCommonData->GetVideoWidth(); int nHeight = pCommonData->GetVideoHeight(); //nWidth = m_nTextureWidth; //nHeight = m_nTextureHeight; m_pVideoShader = new QVideoShader; m_pVideoShader->CreateTexture(nWidth*2, nHeight, QOpenGLTexture::Target2D, QOpenGLTexture::R8_UNorm); char *pSrcVertex = NULL; if(nGLSLVersion==30) { pSrcVertex = "#version 300 es\n" "attribute highp vec4 vertex;\n" "attribute highp vec4 texCoord;\n" "uniform mediump mat4 matrix;\n" "varying highp vec4 texc;\n" "void main(void)\n" "{\n" " gl_Position = matrix * vertex;\n" " texc = texCoord;\n" "}\n"; } else { pSrcVertex = "#version 300 es\n" "in highp vec4 vertex;\n" "in highp vec4 texCoord;\n" "uniform mediump mat4 matrix;\n" "out highp vec4 texc;\n" "void main(void)\n" "{\n" " gl_Position = matrix * vertex;\n" " texc = texCoord;\n" "}\n"; } /* char *pSrcFragmentCaptureEnvent = "#version 300 es\n" "in highp vec4 texc;\n" "uniform sampler2D tex;\n" "out lowp vec4 FragColor;\n" "uniform lowp int nImageWidth;\n" "uniform lowp int nImageHeight;\n" "void main(void)\n" "{\n" " int nX=0;\n" " int nY=0;\n" " highp float fX = 0.0;\n" " highp float fY = 0.0;\n" " int nInternalIndex = 0;\n" " highp float fImageWidth = float(nImageWidth);\n" " highp float fImageHeight = float(nImageHeight);\n" " fX = texc.s*fImageWidth;\n" " fY = texc.t*fImageHeight;\n" " nX = int(fX);\n" " nY = int(fY);\n" " int nStartX = int((int(nX/4)) * 4);\n" " if(nStartX%2==1) return;\n" " int nIndexY = nStartX + 1 + int(mod(float(nX/2), 2.0)) * 2;\n" " int nIndexU = nStartX;\n" " int nIndexV = nStartX+2;\n" //" if(nX<4) { FragColor = vec4(0.0, 0.0, 0.0, 1.0); return; }\n" " fX = float((nX/2)*2+1)/(fImageWidth);\n" " fY = float(nY)/(fImageHeight);\n" " highp vec4 colorY = texture2D(tex, vec2(float(nIndexY)/(fImageWidth)+0.5/fImageWidth,fY+0.5/fImageHeight));\n" " highp vec4 colorU = texture2D(tex, vec2(float(nIndexU)/(fImageWidth)+0.5/fImageWidth,fY+0.5/fImageHeight));\n" " highp vec4 colorV = texture2D(tex, vec2(float(nIndexV)/(fImageWidth)+0.5/fImageWidth,fY+0.5/fImageHeight));\n" " highp float fColorY = colorY.r;\n" " highp float fColorU = colorU.r;\n" " highp float fColorV = colorV.r;\n" //" FragColor = vec4(fColorY, fColorU, fColorV, 1.0); return;\n" " highp float fR = fColorY;\n" " highp float fG = fColorY;\n" " highp float fB = fColorY;\n" " fColorY=1.1643*(fColorY-0.0625);" " fColorU=fColorU-0.5;" " fColorV=fColorV-0.5;" " fR=clamp(fColorY+1.5958*fColorV, 0.0, 1.0);" " fG=clamp(fColorY-0.39173*fColorU-0.81290*fColorV, 0.0, 1.0);" " fB=clamp(fColorY+2.017*fColorU, 0.0, 1.0);" " FragColor = vec4(fR, fG, fB, 1.0);\n" "}\n"; */ char *pSrcFragmentCaptureEnvent = "#version 300 es\n" "in highp vec4 texc;\n" "uniform sampler2D tex;\n" "out lowp vec4 FragColor;\n" "uniform lowp int nImageWidth;\n" "uniform lowp int nImageHeight;\n" "void main(void)\n" "{\n" " int nX=0;\n" " int nY=0;\n" " highp float fX = 0.0;\n" " highp float fY = 0.0;\n" //" highp float fTextureWidth = 1920.0;\n" //" highp float fTextureHeight = 1080.0;\n" " highp float fImageWidth = float(nImageWidth);\n" " highp float fImageHeight = float(nImageHeight);\n" " highp float fX1 = texc.s * 1280.0;\n" " highp float fY1 = texc.t * 720.0;\n" " fX = texc.s*fImageWidth;\n" " fY = texc.t*fImageHeight;\n" " nX = int(fX);\n" " nY = int(fY);\n" //" int nX1 = int(fX1);\n" //" int nY1 = int(fY1);\n" //" highp float fNewX = float(nX1) * 1.5;\n" //" highp float fNewY = float(nY1) * 1.5;\n" //" highp float fGabX = fNewX - float(int(fNewX));\n" //" highp float fGabY = fNewY - float(int(fNewY));\n" //" if(fGabY==0.5)\n" //" {\n" //" FragColor = vec4(0, 0, 0, 1.0);\n" //" return;\n" //" }\n" //" else\n" //" {\n" //" FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n" //" return;\n" //" }\n" " int nStartX = 0;\n" " int nIndexY = 0;\n" " int nIndexU = 0;\n" " int nIndexV = 0;\n" " highp vec4 colorY = vec4(0.0, 0.0, 0.0, 0.0);\n" " highp vec4 colorU = vec4(0.0, 0.0, 0.0, 0.0);\n" " highp vec4 colorV = vec4(0.0, 0.0, 0.0, 0.0);\n" " highp float fColorY = 0.0;\n" " highp float fColorU = 0.0;\n" " highp float fColorV = 0.0;\n" " highp float fR1 = 0.0;\n" " highp float fG1 = 0.0;\n" " highp float fB1 = 0.0;\n" " highp float fR2 = 0.0;\n" " highp float fG2 = 0.0;\n" " highp float fB2 = 0.0;\n" " highp float fR3 = 0.0;\n" " highp float fG3 = 0.0;\n" " highp float fB3 = 0.0;\n" " highp float fR4 = 0.0;\n" " highp float fG4 = 0.0;\n" " highp float fB4 = 0.0;\n" " nStartX = int((int(nX/4)) * 4);\n" " nIndexY = nStartX + 1 + int(mod(float(nX/2), 2.0)) * 2;\n" " nIndexU = nStartX;\n" " nIndexV = nStartX+2;\n" " fX = float((nX/2)*2+1)/(fImageWidth);\n" " fY = float(nY)/(fImageHeight);\n" " colorY = texture2D(tex, vec2(float(nIndexY)/(fImageWidth)+0.5/fImageWidth,fY));\n" " colorU = texture2D(tex, vec2(float(nIndexU)/(fImageWidth)+0.5/fImageWidth,fY));\n" " colorV = texture2D(tex, vec2(float(nIndexV)/(fImageWidth)+0.5/fImageWidth,fY));\n" " fColorY = colorY.r;\n" " fColorU = colorU.r;\n" " fColorV = colorV.r;\n" " fColorY=1.1643*(fColorY-0.0625);" " fColorU=fColorU-0.5;" " fColorV=fColorV-0.5;" " fR1=clamp(fColorY+1.5958*fColorV, 0.0, 1.0);" " fG1=clamp(fColorY-0.39173*fColorU-0.81290*fColorV, 0.0, 1.0);" " fB1=clamp(fColorY+2.017*fColorU, 0.0, 1.0);" " nStartX = int((int((nX+1)/4)) * 4);\n" " nIndexY = nStartX + 1 + int(mod(float((nX+1)/2), 2.0)) * 2;\n" " nIndexU = nStartX;\n" " nIndexV = nStartX+2;\n" " fX = float((nX/2)*2+1)/(fImageWidth);\n" " fY = float(nY)/(fImageHeight);\n" " colorY = texture2D(tex, vec2(float(nIndexY)/(fImageWidth)+0.5/fImageWidth,fY+0.5/fImageHeight));\n" " colorU = texture2D(tex, vec2(float(nIndexU)/(fImageWidth)+0.5/fImageWidth,fY+0.5/fImageHeight));\n" " colorV = texture2D(tex, vec2(float(nIndexV)/(fImageWidth)+0.5/fImageWidth,fY+0.5/fImageHeight));\n" " fColorY = colorY.r;\n" " fColorU = colorU.r;\n" " fColorV = colorV.r;\n" " fColorY = colorY.r;\n" " fColorU = colorU.r;\n" " fColorV = colorV.r;\n" " fColorY=1.1643*(fColorY-0.0625);" " fColorU=fColorU-0.5;" " fColorV=fColorV-0.5;" " fR2=clamp(fColorY+1.5958*fColorV, 0.0, 1.0);" " fG2=clamp(fColorY-0.39173*fColorU-0.81290*fColorV, 0.0, 1.0);" " fB2=clamp(fColorY+2.017*fColorU, 0.0, 1.0);" " nStartX = int((int(nX/4)) * 4);\n" " nIndexY = nStartX + 1 + int(mod(float(nX/2), 2.0)) * 2;\n" " nIndexU = nStartX;\n" " nIndexV = nStartX+2;\n" " fX = float((nX/2)*2+1)/(fImageWidth);\n" " fY = float(nY+1)/(fImageHeight);\n" " colorY = texture2D(tex, vec2(float(nIndexY)/(fImageWidth)+0.5/fImageWidth,fY));\n" " colorU = texture2D(tex, vec2(float(nIndexU)/(fImageWidth)+0.5/fImageWidth,fY));\n" " colorV = texture2D(tex, vec2(float(nIndexV)/(fImageWidth)+0.5/fImageWidth,fY));\n" " fColorY = colorY.r;\n" " fColorU = colorU.r;\n" " fColorV = colorV.r;\n" " fColorY=1.1643*(fColorY-0.0625);" " fColorU=fColorU-0.5;" " fColorV=fColorV-0.5;" " fR3=clamp(fColorY+1.5958*fColorV, 0.0, 1.0);" " fG3=clamp(fColorY-0.39173*fColorU-0.81290*fColorV, 0.0, 1.0);" " fB3=clamp(fColorY+2.017*fColorU, 0.0, 1.0);" " nStartX = int((int((nX+1)/4)) * 4);\n" " nIndexY = nStartX + 1 + int(mod(float((nX+1)/2), 2.0)) * 2;\n" " nIndexU = nStartX;\n" " nIndexV = nStartX+2;\n" " fX = float((nX/2)*2+1)/(fImageWidth);\n" " fY = float(nY+1)/(fImageHeight);\n" " colorY = texture2D(tex, vec2(float(nIndexY)/(fImageWidth)+0.5/fImageWidth,fY));\n" " colorU = texture2D(tex, vec2(float(nIndexU)/(fImageWidth)+0.5/fImageWidth,fY));\n" " colorV = texture2D(tex, vec2(float(nIndexV)/(fImageWidth)+0.5/fImageWidth,fY));\n" " fColorY = colorY.r;\n" " fColorU = colorU.r;\n" " fColorV = colorV.r;\n" " fColorY=1.1643*(fColorY-0.0625);" " fColorU=fColorU-0.5;" " fColorV=fColorV-0.5;" " fR4=clamp(fColorY+1.5958*fColorV, 0.0, 1.0);" " fG4=clamp(fColorY-0.39173*fColorU-0.81290*fColorV, 0.0, 1.0);" " fB4=clamp(fColorY+2.017*fColorU, 0.0, 1.0);" //" highp float fR = fR1;\n" //" highp float fG = fG1;\n" //" highp float fB = fB1;\n" //" fR = fR1*(1.0-fGabX)*(1.0-fGabY)+fR2*(fGabX)*(1.0-fGabY)+fR3*(1.0-fGabX)*(fGabY)+fR4*(fGabX)*(fGabY);\n" //" fG = fG1*(1.0-fGabX)*(1.0-fGabY)+fG2*(fGabX)*(1.0-fGabY)+fG3*(1.0-fGabX)*(fGabY)+fG4*(fGabX)*(fGabY);\n" //" fB = fB1*(1.0-fGabX)*(1.0-fGabY)+fB2*(fGabX)*(1.0-fGabY)+fB3*(1.0-fGabX)*(fGabY)+fB4*(fGabX)*(fGabY);\n" " highp float fR = fR1*0.25+fR2*0.25+fR3*0.25+fR4*0.25;\n" " highp float fG = fG1*0.25+fG2*0.25+fG3*0.25+fG4*0.25;\n" " highp float fB = fB1*0.25+fB2*0.25+fB3*0.25+fB4*0.25;\n" //" if(fGabY==0.0 && fGabX==0.0)\n" //" {\n" //" fR = fR1*0.25+fR2*0.25+fR3*0.25+fR4*0.25;\n" //" fG = fG1*0.25+fG2*0.25+fG3*0.25+fG4*0.25;\n" //" fB = fB1*0.25+fB2*0.25+fB3*0.25+fB4*0.25;\n" //" }\n" " FragColor = vec4(fR, fG, fB, 1.0);\n" "}\n"; m_pVideoShader->CreateShader((const char*)pSrcVertex, (const char*)pSrcFragmentCaptureEnvent); m_pVideoShader->CreateGeometry(); if (!m_VBOVideo.isCreated()) { //float fRatioWidth = 1572.0f/1920.0f; float fRatioWidth = 1.0; GLfloat afVertices[] = { -1, -fRatioWidth, -1, 1,-fRatioWidth,-1, -1,fRatioWidth,-1, 1, fRatioWidth,-1, -1,fRatioWidth,-1, 1,-fRatioWidth,-1 }; GLfloat afTexCoord[] = { 0.0f,1.0f, 1.0f,1.0f, 0.0f,0.0f, 1.0f,0.0f, 0.0f,0.0f, 1.0f,1.0f }; GLfloat afNormals[] = { 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1, 0,0,1 }; m_VBOVideo.create(); m_VBOVideo.bind(); m_VBOVideo.allocate(6 * 5 * sizeof(GLfloat)); m_VBOVideo.write(0, afVertices, 6*3*sizeof(GLfloat)); m_VBOVideo.write(6*3*sizeof(GLfloat), afTexCoord, 6*2*sizeof(GLfloat)); //m_VBOVideo.write(6*5*sizeof(GLfloat), afNormals, 6*3*sizeof(GLfloat)); m_VBOVideo.release(); } GLfloat afVertices[] = { -1,1, -1, -0.767,1,-1, -1,-1,-1, -0.767, -1,-1, -1,-1,-1, -0.767,1,-1 }; QFile fileTest("test.data"); if(fileTest.exists()==true) { if(fileTest.open(QFile::ReadOnly)==true) { int nBytes = fileTest.size(); uint8_t* pDataTest = new uint8_t[nBytes]; fileTest.read((char*)pDataTest, nBytes); if(nBytes>0) { memcpy(m_QueueData[0], pDataTest, nBytes); m_bChange = true; m_nIndexDisplay = -1; UpdateTexture(); m_bChange = true; } delete[] pDataTest; } } }