static void render_video_1f(const glw_video_t *gv, glw_video_surface_t *s, int textype, int rectmode, glw_rctx_t *rc) { glw_backend_root_t *gbr = &gv->w.glw_root->gr_be; glw_program_t *gp; gv_surface_pixmap_upload(s, textype, gv); switch(gv->gv_planes) { case 3: glActiveTexture(GL_TEXTURE2); glBindTexture(textype, gv_tex_get(s, GVF_TEX_Cb)); glActiveTexture(GL_TEXTURE1); glBindTexture(textype, gv_tex_get(s, GVF_TEX_Cr)); glActiveTexture(GL_TEXTURE0); glBindTexture(textype, gv_tex_get(s, GVF_TEX_L)); gp = gbr->gbr_yuv2rgb_1f; break; case 1: glBindTexture(textype, gv_tex_get(s, 0)); gp = gbr->gbr_rgb2rgb_1f; break; default: return; } glw_render_video_quad(s->gvs_interlaced, rectmode, s->gvs_width[0], s->gvs_height[0], s->gvs_yshift, 0, gbr, gp, gv, rc); }
static void render_video_2f(const glw_video_t *gv, glw_video_surface_t *sa, glw_video_surface_t *sb, int textype, int rectmode, glw_rctx_t *rc) { const glw_video_config_t *gvc = &gv->gv_cfg_cur; glw_backend_root_t *gbr = &gv->w.glw_root->gr_be; gv_surface_pixmap_upload(sa, &gv->gv_cfg_cur, textype); gv_surface_pixmap_upload(sb, &gv->gv_cfg_cur, textype); glActiveTexture(GL_TEXTURE5); glBindTexture(textype, gv_tex_get(sb, GVF_TEX_Cb)); glActiveTexture(GL_TEXTURE4); glBindTexture(textype, gv_tex_get(sb, GVF_TEX_Cr)); glActiveTexture(GL_TEXTURE3); glBindTexture(textype, gv_tex_get(sb, GVF_TEX_L)); glActiveTexture(GL_TEXTURE2); glBindTexture(textype, gv_tex_get(sa, GVF_TEX_Cb)); glActiveTexture(GL_TEXTURE1); glBindTexture(textype, gv_tex_get(sa, GVF_TEX_Cr)); glActiveTexture(GL_TEXTURE0); glBindTexture(textype, gv_tex_get(sa, GVF_TEX_L)); render_video_quad(!!(gvc->gvc_flags & GVC_CUTBORDER), rectmode, gvc->gvc_width[0], gvc->gvc_height[0], sa->gvs_yshift, sb->gvs_yshift, gbr, gbr->gbr_yuv2rgb_2f, gv, rc); }
static void gv_surface_pixmap_upload(glw_video_surface_t *gvs, const glw_video_config_t *gvc, int textype) { if(gvs->gvs_uploaded || gvs->gvs_pbo[0] == 0) return; gvs->gvs_uploaded = 1; glBindBuffer(GL_PIXEL_UNPACK_BUFFER, gvs->gvs_pbo[0]); glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER); glBindTexture(textype, gv_tex_get(gvs, GVF_TEX_L)); gv_set_tex_meta(textype); glTexImage2D(textype, 0, 1, gvc->gvc_width[0], gvc->gvc_height[0], 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, gvs->gvs_pbo[1]); glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER); glBindTexture(textype, gv_tex_get(gvs, GVF_TEX_Cr)); gv_set_tex_meta(textype); glTexImage2D(textype, 0, 1, gvc->gvc_width[1], gvc->gvc_height[1], 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, gvs->gvs_pbo[2]); glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER); glBindTexture(textype, gv_tex_get(gvs, GVF_TEX_Cb)); gv_set_tex_meta(textype); glTexImage2D(textype, 0, 1, gvc->gvc_width[2], gvc->gvc_height[2], 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); gvs->gvs_pbo_ptr[0] = NULL; gvs->gvs_pbo_ptr[1] = NULL; gvs->gvs_pbo_ptr[2] = NULL; }
static void gv_surface_pixmap_upload(glw_video_surface_t *gvs, int textype, const glw_video_t *gv) { if(gvs->gvs_uploaded || gvs->gvs_pbo[0] == 0) return; gvs->gvs_uploaded = 1; for(int i = 0; i < gv->gv_planes; i++) { glBindBuffer(GL_PIXEL_UNPACK_BUFFER, gvs->gvs_pbo[i]); glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER); glBindTexture(textype, gv_tex_get(gvs, i)); gv_set_tex_meta(textype); glTexImage2D(textype, 0, gv->gv_tex_internal_format, gvs->gvs_width[i], gvs->gvs_height[i], 0, gv->gv_tex_format, gv->gv_tex_type, NULL); gvs->gvs_data[i] = NULL; } glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); }