From 6f04e6e2f0601cc5a4e7fa2a079dee8c465fb868 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Sat, 14 May 2005 05:52:14 +0000 Subject: sys/glsink/glimagesink.c: Fix resizing issues. Works well in totem. Original commit message from CVS: * sys/glsink/glimagesink.c: Fix resizing issues. Works well in totem. --- ChangeLog | 5 ++++ sys/glsink/glimagesink.c | 64 +++++++++++++++++++++++++++++++++--------------- 2 files changed, 49 insertions(+), 20 deletions(-) diff --git a/ChangeLog b/ChangeLog index b871b092..ef6742a3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2005-05-13 David Schleef + + * sys/glsink/glimagesink.c: Fix resizing issues. Works well + in totem. + 2005-05-14 Benjamin Otte * gst/realmedia/rmdemux.c: (plugin_init): diff --git a/sys/glsink/glimagesink.c b/sys/glsink/glimagesink.c index e7d847ad..ee4717be 100644 --- a/sys/glsink/glimagesink.c +++ b/sys/glsink/glimagesink.c @@ -37,7 +37,8 @@ GST_DEBUG_CATEGORY_STATIC (gst_debug_glimagesink); #define GST_CAT_DEFAULT gst_debug_glimagesink -static void gst_glimagesink_set_window_size (GstGLImageSink * glimagesink); +static void gst_glimagesink_set_window_size (GstGLImageSink * glimagesink, + int width, int height); static GstElementDetails gst_glimagesink_details = @@ -90,8 +91,19 @@ gst_glimagesink_fixate (GstPad * pad, const GstCaps * caps) GST_DEBUG ("Linking the sink"); - if (gst_caps_get_size (caps) > 1) + if (gst_caps_get_size (caps) > 1) { + int i; + + for (i = 0; i < gst_caps_get_size (caps); i++) { + structure = gst_caps_get_structure (caps, i); + if (strcmp (gst_structure_get_name (structure), "video/x-raw-yuv") == 0) { + newcaps = gst_caps_new_empty (); + gst_caps_append_structure (newcaps, gst_structure_copy (structure)); + return newcaps; + } + } return NULL; + } newcaps = gst_caps_copy (caps); structure = gst_caps_get_structure (newcaps, 0); @@ -142,8 +154,10 @@ gst_glimagesink_getcaps (GstPad * pad) caps = gst_caps_from_string (GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_BGRx); #ifdef ENABLE_YUV if (glimagesink->have_yuv) { - gst_caps_append (caps, - gst_caps_from_string (GST_VIDEO_CAPS_YUV ("{ UYVY, YUY2 }"))); + GstCaps *ycaps = + gst_caps_from_string (GST_VIDEO_CAPS_YUV ("{ UYVY, YUY2 }")); + gst_caps_append (ycaps, caps); + caps = ycaps; } #endif @@ -182,6 +196,7 @@ gst_glimagesink_sink_link (GstPad * pad, const GstCaps * caps) if (strcmp (gst_structure_get_name (structure), "video/x-raw-rgb") == 0) { int red_mask; + GST_DEBUG ("using RGB"); glimagesink->use_rgb = TRUE; gst_structure_get_int (structure, "red_mask", &red_mask); @@ -193,6 +208,7 @@ gst_glimagesink_sink_link (GstPad * pad, const GstCaps * caps) } else { unsigned int fourcc; + GST_DEBUG ("using YUV"); glimagesink->use_rgb = FALSE; gst_structure_get_fourcc (structure, "format", &fourcc); @@ -203,7 +219,8 @@ gst_glimagesink_sink_link (GstPad * pad, const GstCaps * caps) } } - gst_glimagesink_set_window_size (glimagesink); + gst_glimagesink_set_window_size (glimagesink, + GST_VIDEOSINK_WIDTH (glimagesink), GST_VIDEOSINK_HEIGHT (glimagesink)); gst_x_overlay_got_desired_size (GST_X_OVERLAY (glimagesink), GST_VIDEOSINK_WIDTH (glimagesink), GST_VIDEOSINK_HEIGHT (glimagesink)); @@ -258,18 +275,19 @@ gst_glimagesink_init_display (GstGLImageSink * glimagesink) attr.colormap = XCreateColormap (glimagesink->display, root, visinfo->visual, AllocNone); attr.event_mask = StructureNotifyMask | ExposureMask; + attr.override_redirect = True; - mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; + //mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; + mask = CWBackPixel | CWBorderPixel | CWColormap | CWOverrideRedirect; glimagesink->window = XCreateWindow (glimagesink->display, root, 0, 0, GST_VIDEOSINK_WIDTH (glimagesink), GST_VIDEOSINK_HEIGHT (glimagesink), 0, visinfo->depth, InputOutput, visinfo->visual, mask, &attr); - XMapWindow (glimagesink->display, glimagesink->window); + //XMapWindow (glimagesink->display, glimagesink->window); XFree (visinfo); - glXMakeCurrent (glimagesink->display, 0, NULL); glXMakeCurrent (glimagesink->display, glimagesink->window, glimagesink->context); @@ -290,17 +308,16 @@ gst_glimagesink_init_display (GstGLImageSink * glimagesink) } static void -gst_glimagesink_set_window_size (GstGLImageSink * glimagesink) +gst_glimagesink_set_window_size (GstGLImageSink * glimagesink, + int width, int height) { - GST_ERROR ("resizing to %d x %d", + GST_DEBUG ("resizing to %d x %d", GST_VIDEOSINK_WIDTH (glimagesink), GST_VIDEOSINK_HEIGHT (glimagesink)); if (glimagesink->display) { - XResizeWindow (glimagesink->display, glimagesink->window, - GST_VIDEOSINK_WIDTH (glimagesink), GST_VIDEOSINK_HEIGHT (glimagesink)); - glXMakeCurrent (glimagesink->display, None, NULL); - glXMakeCurrent (glimagesink->display, glimagesink->window, - glimagesink->context); + XResizeWindow (glimagesink->display, glimagesink->window, width, height); + XSync (glimagesink->display, False); + glViewport (0, 0, width, height); } } @@ -354,6 +371,7 @@ gst_glimagesink_chain (GstPad * pad, GstData * data) GstBuffer *buf = GST_BUFFER (data); GstGLImageSink *glimagesink; int texture_size; + XWindowAttributes attr; //GST_DEBUG("CHAIN CALL"); @@ -373,6 +391,12 @@ gst_glimagesink_chain (GstPad * pad, GstData * data) glimagesink->time = GST_BUFFER_TIMESTAMP (buf); } + if (glimagesink->parent_window) { + XGetWindowAttributes (glimagesink->display, glimagesink->parent_window, + &attr); + gst_glimagesink_set_window_size (glimagesink, attr.width, attr.height); + } + GST_DEBUG ("clock wait: %" GST_TIME_FORMAT, GST_TIME_ARGS (glimagesink->time)); @@ -515,8 +539,9 @@ static void gst_glimagesink_set_xwindow_id (GstXOverlay * overlay, XID xwindow_id) { GstGLImageSink *glimagesink = GST_GLIMAGESINK (overlay); + int ret; - GST_ERROR ("set_xwindow_id %ld", xwindow_id); + GST_DEBUG ("set_xwindow_id %ld", xwindow_id); g_return_if_fail (GST_IS_GLIMAGESINK (glimagesink)); @@ -530,11 +555,10 @@ gst_glimagesink_set_xwindow_id (GstXOverlay * overlay, XID xwindow_id) glimagesink->parent_window = xwindow_id; - GST_ERROR ("reparenting window"); - XSync (glimagesink->display, FALSE); - XReparentWindow (glimagesink->display, glimagesink->window, xwindow_id, 0, 0); + XSync (glimagesink->display, False); + ret = XReparentWindow (glimagesink->display, glimagesink->window, + xwindow_id, 0, 0); XMapWindow (glimagesink->display, glimagesink->window); - } static void -- cgit v1.2.1