示例#1
0
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);
}
示例#2
0
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);
}
示例#3
0
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;
}
示例#4
0
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);
}