void CU1VideoPlayer::U1Video_RTInitialize()
{
///--- Crea las texturas que va a usar para renderizar el vĚdeo
TESTRENDERTHREAD();
...
///---
GFXSelectTextureUnit(0);
m_oFrameTexture_Y.Initialize(GFX_TEXTURE_LINEAR, GFX_TEXTURE_LINEAR, GFX_TEXTURE_CLAMP_TO_EDGE, GFX_TEXTURE_CLAMP_TO_EDGE,
GFX_TEXTURE_2D, GFX_TEXTURE_STATIC);
m_oFrameTexture_Y.m_uWidth=1280;
m_oFrameTexture_Y.m_uHeight=720;
m_oFrameTexture_Y.BindTexture(0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, 1280, 720, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
///////
m_oFrameTexture_U.Initialize(GFX_TEXTURE_LINEAR, GFX_TEXTURE_LINEAR, GFX_TEXTURE_CLAMP_TO_EDGE, GFX_TEXTURE_CLAMP_TO_EDGE,
GFX_TEXTURE_2D, GFX_TEXTURE_STATIC);
m_oFrameTexture_U.m_uWidth=1280>>1;
m_oFrameTexture_U.m_uHeight=720>>1;
m_oFrameTexture_U.BindTexture(0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, 1280>>1, 720>>1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
///////
m_oFrameTexture_V.Initialize(GFX_TEXTURE_LINEAR, GFX_TEXTURE_LINEAR, GFX_TEXTURE_CLAMP_TO_EDGE, GFX_TEXTURE_CLAMP_TO_EDGE,
GFX_TEXTURE_2D, GFX_TEXTURE_STATIC);
m_oFrameTexture_V.m_uWidth=1280>>1;
m_oFrameTexture_V.m_uHeight=720>>1;
m_oFrameTexture_V.BindTexture(0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, 1280>>1, 720>>1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
//////////////////////////////////////////////////////////////////////////
///--- Crea el PBO para las texturas
glGenBuffers(1, &m_uiGLPBOID_Y);
glGenBuffers(1, &m_uiGLPBOID_U);
glGenBuffers(1, &m_uiGLPBOID_V);
...
}
bool CU1VideoPlayer::RTPrivUpdateTexture()
{
bool bRet=false;
...
if(...){
if(g_bSup_ARB_pixel_buffer_object){
const int iWidth=1280;
const int iHeight=720;
const int iWidth2=1280>>1;
const int iHeight2=720>>1;
///--- Bind
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, m_uiGLPBOID_Y);
glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, iWidth*iHeight, NULL, GL_STREAM_DRAW_ARB);
uint8_t *pboMemory;
pboMemory=(uint8_t*)glMapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY);
XXXXTrapIf(pboMemory==NULL);
if(pboMemory){
m_pVDecoder->TransferBitmap(pboMemory, iWidth, iHeight, 0);
if(!glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB)) {
///--- Handle error case
...
}
m_oFrameTexture_Y.BindTexture(0);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, iWidth, iHeight, GL_RED, GL_UNSIGNED_BYTE, NULL);
}
//////////////////////////////////////////////////////////////////////////
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, m_uiGLPBOID_U);
glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, iWidth2*iHeight2, NULL, GL_STREAM_DRAW_ARB);
pboMemory=(uint8_t*)glMapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY);
XXXXTrapIf(pboMemory==NULL);
if(pboMemory){
m_pVDecoder->TransferBitmap(pboMemory, iWidth2, iHeight2, 1);
glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB);
m_oFrameTexture_U.BindTexture(0);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, iWidth2, iHeight2, GL_RED, GL_UNSIGNED_BYTE, NULL);
}
//////////////////////////////////////////////////////////////////////////
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, m_uiGLPBOID_V);
glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, iWidth2*iHeight2, NULL, GL_STREAM_DRAW_ARB);
pboMemory=(uint8_t*)glMapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY);
XXXXTrapIf(pboMemory==NULL);
if(pboMemory){
m_pVDecoder->TransferBitmap(pboMemory, iWidth2, iHeight2, 2);
glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB);
m_oFrameTexture_V.BindTexture(0);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, iWidth2, iHeight2, GL_RED, GL_UNSIGNED_BYTE, NULL);
}
///--- unbind
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
bRet=true;
}
else
{
...
}
}
return bRet;
}