display->rejectedDepthBuffer = 0;
display->rejectedTextureFBO = 0;
+ display->displayedTexture = 0;
+ display->displayedTextureWidth = 0;
+ display->displayedTextureHeight = 0;
+
display->requestedTexture = 0;
display->requestedTexture_u = 0;
display->requestedTexture_v = 0;
"void main(void) {\n"
" float r,g,b,y,u,v;\n"
" vec2 nxy=gl_TexCoord[0].xy;\n"
- " y=texture2DRect(Ytex,nxy).r;\n"
- " u=texture2DRect(Utex,nxy*0.5).r;\n"
+ " y=texture2DRect(Ytex,nxy*0.5).r;\n"
+ " u=texture2DRect(Utex,nxy).r;\n"
" v=texture2DRect(Vtex,nxy*0.5).r;\n"
" y=1.1643*(y-0.0625);\n"
" u=u-0.5;\n"
void
gst_gl_display_textureChanged (GstGLDisplay* display, GstVideoFormat video_format,
GLuint texture, GLuint texture_u, GLuint texture_v,
- gint width, gint height, gpointer data)
+ gint width, gint height, gpointer data, GLuint* outputTexture)
{
gst_gl_display_lock (display);
display->candidateTexture = texture;
display->candidateData = data;
gst_gl_display_postMessage (GST_GL_DISPLAY_ACTION_CHANGE, display);
g_cond_wait (display->cond_fill, display->mutex);
+ //Here texture width and height are always the same than the fbo
+ if (outputTexture)
+ *outputTexture = display->textureFBO;
gst_gl_display_unlock (display);
}
/* Called by gst_gl elements */
gboolean
-gst_gl_display_postRedisplay (GstGLDisplay* display)
+gst_gl_display_postRedisplay (GstGLDisplay* display, GLuint texture, gint width , gint height)
{
gboolean isAlive = TRUE;
gst_gl_display_lock (display);
isAlive = display->isAlive;
+ if (texture)
+ {
+ display->displayedTexture = texture;
+ display->displayedTextureWidth = width;
+ display->displayedTextureHeight = height;
+ }
gst_gl_display_postMessage (GST_GL_DISPLAY_ACTION_REDISPLAY, display);
gst_gl_display_unlock (display);
if (display->clientDrawCallback)
{
gboolean doRedisplay =
- display->clientDrawCallback(display->textureFBO,
- display->textureFBOWidth, display->textureFBOHeight);
+ display->clientDrawCallback(display->displayedTexture,
+ display->displayedTextureWidth, display->displayedTextureHeight);
glFlush();
glutSwapBuffers();
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
- glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->textureFBO);
+ glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->displayedTexture);
glEnable (GL_TEXTURE_RECTANGLE_ARB);
glBegin (GL_QUADS);
- glTexCoord2i (display->textureFBOWidth, 0);
+ glTexCoord2i (display->displayedTextureWidth, 0);
glVertex2f (1.0f, 1.0f);
glTexCoord2i (0, 0);
glVertex2f (-1.0f, 1.0f);
- glTexCoord2i (0, display->textureFBOHeight);
+ glTexCoord2i (0, display->displayedTextureHeight);
glVertex2f (-1.0f, -1.0f);
- glTexCoord2i (display->textureFBOWidth, display->textureFBOHeight);
+ glTexCoord2i (display->displayedTextureWidth, display->displayedTextureHeight);
glVertex2f (1.0f, -1.0f);
glEnd ();
GLuint rejectedDepthBuffer;
GLuint rejectedTextureFBO;
+ //displayed texture
+ GLuint displayedTexture;
+ GLuint displayedTextureWidth;
+ GLuint displayedTextureHeight;
+
GLuint requestedTexture;
GLuint requestedTexture_u;
GLuint requestedTexture_v;
guint* texture_u, guint* texture_v);
void gst_gl_display_textureChanged (GstGLDisplay* display, GstVideoFormat video_format,
GLuint texture, GLuint texture_u, GLuint texture_v,
- gint width, gint height, gpointer data);
+ gint width, gint height, gpointer data, GLuint* outputTexture);
void gst_gl_display_clearTexture (GstGLDisplay* display, guint texture,
guint texture_u, guint texture_v);
void gst_gl_display_videoChanged (GstGLDisplay* display, GstVideoFormat video_format,
gpointer data);
-gboolean gst_gl_display_postRedisplay (GstGLDisplay* display);
+gboolean gst_gl_display_postRedisplay (GstGLDisplay* display, GLuint texture, gint width, gint height);
void gst_gl_display_requestFBO (GstGLDisplay* display, gint width, gint height,
guint* fbo, guint* depthbuffer, guint* texture);
void gst_gl_display_useFBO (GstGLDisplay* display, gint textureFBOWidth, gint textureFBOheight,