bool CRendererMediaCodec::UploadTexture(int index) { #ifdef DEBUG_VERBOSE unsigned int time = XbmcThreads::SystemClockMillis(); int mindex = -1; #endif YUVBUFFER &buf = m_buffers[index]; if (buf.hwDec) { #ifdef DEBUG_VERBOSE mindex = ((CDVDMediaCodecInfo *)buf.hwDec)->GetIndex(); #endif buf.fields[0][0].id = ((CDVDMediaCodecInfo *)buf.hwDec)->GetTextureID(); ((CDVDMediaCodecInfo *)buf.hwDec)->UpdateTexImage(); ((CDVDMediaCodecInfo *)buf.hwDec)->GetTransformMatrix(m_textureMatrix); SAFE_RELEASE(buf.hwDec); } CalculateTextureSourceRects(index, 1); #ifdef DEBUG_VERBOSE CLog::Log(LOGDEBUG, "UploadSurfaceTexture %d: img: %d tm:%d", index, mindex, XbmcThreads::SystemClockMillis() - time); #endif return true; }
bool CRendererVAAPI::UploadTexture(int index) { if (m_format == RENDER_FMT_VAAPINV12) { return UploadNV12Texture(index); } VAAPI::CVaapiRenderPicture *vaapi = (VAAPI::CVaapiRenderPicture*)m_buffers[index].hwDec; YV12Image &im = m_buffers[index].image; YUVFIELDS &fields = m_buffers[index].fields; if (!vaapi || !vaapi->valid) { return false; } YUVPLANES &planes = fields[0]; planes[0].texwidth = vaapi->texWidth; planes[0].texheight = vaapi->texHeight; planes[1].texwidth = planes[0].texwidth >> im.cshift_x; planes[1].texheight = planes[0].texheight >> im.cshift_y; planes[2].texwidth = planes[1].texwidth; planes[2].texheight = planes[1].texheight; for (int p = 0; p < 3; p++) { planes[p].pixpertex_x = 1; planes[p].pixpertex_y = 1; } // set textures fields[0][0].id = vaapi->textureY; fields[0][1].id = vaapi->textureVU; fields[0][2].id = vaapi->textureVU; glEnable(m_textureTarget); for (int p=0; p<2; p++) { glBindTexture(m_textureTarget,fields[0][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); glDisable(m_textureTarget); return true; }
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) { YUVBUFFER &buf = m_buffers[index]; YUVPLANE (&planes)[YuvImage::MAX_PLANES] = m_buffers[index].fields[0]; VTB::CVideoBufferVTB *vb = dynamic_cast<VTB::CVideoBufferVTB*>(buf.videoBuffer); if (!vb) { return false; } CVImageBufferRef cvBufferRef = vb->GetPB(); glEnable(m_textureTarget); // It is the fastest way to render a CVPixelBuffer backed // with an IOSurface as there is no CPU -> GPU upload. CGLContextObj cgl_ctx = (CGLContextObj)g_Windowing.GetCGLContextObj(); IOSurfaceRef surface = CVPixelBufferGetIOSurface(cvBufferRef); OSType format_type = IOSurfaceGetPixelFormat(surface); if (format_type != kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange) { return false; } GLsizei surfplanes = IOSurfaceGetPlaneCount(surface); if (surfplanes != 2) { return false; } GLsizei widthY = IOSurfaceGetWidthOfPlane(surface, 0); GLsizei widthUV = IOSurfaceGetWidthOfPlane(surface, 1); GLsizei heightY = IOSurfaceGetHeightOfPlane(surface, 0); GLsizei heightUV = IOSurfaceGetHeightOfPlane(surface, 1); glBindTexture(m_textureTarget, planes[0].id); CGLTexImageIOSurface2D(cgl_ctx, m_textureTarget, GL_LUMINANCE, widthY, heightY, GL_LUMINANCE, GL_UNSIGNED_BYTE, surface, 0); 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, planes[1].id); CGLTexImageIOSurface2D(cgl_ctx, m_textureTarget, GL_LUMINANCE_ALPHA, widthUV, heightUV, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, surface, 1); 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); glDisable(m_textureTarget); CalculateTextureSourceRects(index, 3); return true; }
bool CRendererMediaCodec::UploadTexture(int index) { ReleaseBuffer(index); CalculateTextureSourceRects(index, 1); return true; }
bool CRendererVDPAU::UploadVDPAUTexture420(int index) { VDPAU::CVdpauRenderPicture *vdpau = (VDPAU::CVdpauRenderPicture*)m_buffers[index].hwDec; YV12Image &im = m_buffers[index].image; YUVFIELDS &fields = m_buffers[index].fields; if (!vdpau || !vdpau->valid) { return false; } im.height = vdpau->texHeight; im.width = vdpau->texWidth; // YUV for (int f = FIELD_TOP; f<=FIELD_BOT ; f++) { YUVPLANES &planes = fields[f]; planes[0].texwidth = im.width; planes[0].texheight = im.height >> 1; planes[1].texwidth = planes[0].texwidth >> im.cshift_x; planes[1].texheight = planes[0].texheight >> im.cshift_y; planes[2].texwidth = planes[1].texwidth; planes[2].texheight = planes[1].texheight; for (int p = 0; p < 3; p++) { planes[p].pixpertex_x = 1; planes[p].pixpertex_y = 1; } } // crop // m_sourceRect.x1 += vdpau->crop.x1; // m_sourceRect.x2 -= vdpau->crop.x2; // m_sourceRect.y1 += vdpau->crop.y1; // m_sourceRect.y2 -= vdpau->crop.y2; // set textures fields[1][0].id = vdpau->texture[0]; fields[1][1].id = vdpau->texture[2]; fields[1][2].id = vdpau->texture[2]; fields[2][0].id = vdpau->texture[1]; fields[2][1].id = vdpau->texture[3]; fields[2][2].id = vdpau->texture[3]; glEnable(m_textureTarget); for (int f = FIELD_TOP; f <= FIELD_BOT; f++) { for (int p=0; p<2; p++) { glBindTexture(m_textureTarget,fields[f][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); glDisable(m_textureTarget); 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; }