bool CRendererVTB::UploadTexture(int index) { CRenderBuffer &buf = m_vtbBuffers[index]; if (!buf.m_videoBuffer) return false; CVOpenGLESTextureCacheFlush(m_textureCache, 0); if (buf.m_textureY) CFRelease(buf.m_textureY); buf.m_textureY = nullptr; if (buf.m_textureUV) CFRelease(buf.m_textureUV); buf.m_textureUV = nullptr; YV12Image &im = m_buffers[index].image; YUVFIELDS &fields = m_buffers[index].fields; YUVPLANES &planes = fields[0]; CVReturn ret; ret = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, m_textureCache, buf.m_videoBuffer, NULL, GL_TEXTURE_2D, GL_LUMINANCE, im.width, im.height, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &buf.m_textureY); if (ret != kCVReturnSuccess) { CLog::Log(LOGERROR, "CRendererVTB::UploadTexture - Error uploading texture Y (err: %d)", ret); return false; } ret = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, m_textureCache, buf.m_videoBuffer, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, im.width/2, im.height/2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &buf.m_textureUV); if (ret != kCVReturnSuccess) { CLog::Log(LOGERROR, "CRendererVTB::UploadTexture - Error uploading texture UV (err: %d)", ret); return false; } // set textures planes[0].id = CVOpenGLESTextureGetName(buf.m_textureY); planes[1].id = CVOpenGLESTextureGetName(buf.m_textureUV); planes[2].id = CVOpenGLESTextureGetName(buf.m_textureUV); glEnable(m_textureTarget); for (int p=0; p<2; p++) { glBindTexture(m_textureTarget, planes[p].id); glTexParameteri(m_textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(m_textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glBindTexture(m_textureTarget, 0); VerifyGLState(); } CalculateTextureSourceRects(index, 3); return true; }
bool CRendererVTB::UploadTexture(int index) { CRenderBuffer &renderBuf = m_vtbBuffers[index]; YUVBUFFER &buf = m_buffers[index]; YUVPLANE (&planes)[YuvImage::MAX_PLANES] = m_buffers[index].fields[0]; YuvImage &im = m_buffers[index].image; VTB::CVideoBufferVTB *vb = dynamic_cast<VTB::CVideoBufferVTB*>(buf.videoBuffer); if (!vb) { return false; } CVOpenGLESTextureCacheFlush(m_textureCache, 0); if (renderBuf.m_textureY) CFRelease(renderBuf.m_textureY); renderBuf.m_textureY = nullptr; if (renderBuf.m_textureUV) CFRelease(renderBuf.m_textureUV); renderBuf.m_textureUV = nullptr; CVReturn ret; ret = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, m_textureCache, vb->GetPB(), nullptr, GL_TEXTURE_2D, GL_LUMINANCE, im.width, im.height, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &renderBuf.m_textureY); if (ret != kCVReturnSuccess) { CLog::Log(LOGERROR, "CRendererVTB::UploadTexture - Error uploading texture Y (err: %d)", ret); return false; } ret = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, m_textureCache, vb->GetPB(), nullptr, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, im.width/2, im.height/2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &renderBuf.m_textureUV); if (ret != kCVReturnSuccess) { CLog::Log(LOGERROR, "CRendererVTB::UploadTexture - Error uploading texture UV (err: %d)", ret); return false; } // set textures planes[0].id = CVOpenGLESTextureGetName(renderBuf.m_textureY); planes[1].id = CVOpenGLESTextureGetName(renderBuf.m_textureUV); planes[2].id = CVOpenGLESTextureGetName(renderBuf.m_textureUV); for (int p=0; p<2; p++) { glBindTexture(m_textureTarget, planes[p].id); glTexParameteri(m_textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(m_textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glBindTexture(m_textureTarget, 0); VerifyGLState(); } CalculateTextureSourceRects(index, 3); return true; }