sys/: clean up debugging caps also recreate xvimage when format has changed
authorThomas Vander Stichele <thomas@apestaart.org>
Tue, 4 May 2004 14:17:25 +0000 (14:17 +0000)
committerThomas Vander Stichele <thomas@apestaart.org>
Tue, 4 May 2004 14:17:25 +0000 (14:17 +0000)
Original commit message from CVS:
* sys/ximage/ximagesink.c: (gst_ximagesink_sink_link),
(plugin_init):
* sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get),
(gst_xvimagesink_sink_link):
clean up debugging caps
also recreate xvimage when format has changed

ChangeLog
sys/ximage/ximagesink.c
sys/xvimage/xvimagesink.c

index cd3f310..e582663 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2004-05-04  Thomas Vander Stichele  <thomas at apestaart dot org>
+
+       * sys/ximage/ximagesink.c: (gst_ximagesink_sink_link),
+       (plugin_init):
+       * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get),
+       (gst_xvimagesink_sink_link):
+        clean up debugging caps
+        also recreate xvimage when format has changed
+
 2004-05-04  Benjamin Otte  <otte@gnome.org>
 
        * ext/libvisual/Makefile.am:
index 96b0de6..70b3a34 100644 (file)
@@ -746,7 +746,6 @@ static GstPadLinkReturn
 gst_ximagesink_sink_link (GstPad * pad, const GstCaps * caps)
 {
   GstXImageSink *ximagesink;
-  char *caps_str1, *caps_str2;
   gboolean ret;
   GstStructure *structure;
 
@@ -755,13 +754,9 @@ gst_ximagesink_sink_link (GstPad * pad, const GstCaps * caps)
   if (!ximagesink->xcontext)
     return GST_PAD_LINK_DELAYED;
 
-  caps_str1 = gst_caps_to_string (ximagesink->xcontext->caps);
-  caps_str2 = gst_caps_to_string (caps);
-
-  GST_DEBUG ("sinkconnect %s with %s", caps_str1, caps_str2);
-
-  g_free (caps_str1);
-  g_free (caps_str2);
+  GST_DEBUG_OBJECT (xvimagesink,
+      "sinkconnect possible caps %" GST_PTR_FORMAT " with given caps %"
+      GST_PTR_FORMAT, xvimagesink->xcontext->caps, caps);
 
   structure = gst_caps_get_structure (caps, 0);
   ret = gst_structure_get_int (structure, "width",
index e44e94b..67a1cfb 100644 (file)
@@ -723,6 +723,7 @@ gst_xvimagesink_xcontext_get (GstXvImageSink * xvimagesink)
   g_return_val_if_fail (GST_IS_XVIMAGESINK (xvimagesink), NULL);
 
   xcontext = g_new0 (GstXContext, 1);
+  xcontext->im_format = 0;
 
   g_mutex_lock (xvimagesink->x_lock);
 
@@ -1004,19 +1005,15 @@ static GstPadLinkReturn
 gst_xvimagesink_sink_link (GstPad * pad, const GstCaps * caps)
 {
   GstXvImageSink *xvimagesink;
-  char *caps_str1, *caps_str2;
   GstStructure *structure;
+  gint im_format = 0;
   gboolean ret;
 
   xvimagesink = GST_XVIMAGESINK (gst_pad_get_parent (pad));
 
-  caps_str1 = gst_caps_to_string (xvimagesink->xcontext->caps);
-  caps_str2 = gst_caps_to_string (caps);
-
-  GST_DEBUG ("sinkconnect %s with %s", caps_str1, caps_str2);
-
-  g_free (caps_str1);
-  g_free (caps_str2);
+  GST_DEBUG_OBJECT (xvimagesink,
+      "sinkconnect possible caps %" GST_PTR_FORMAT " with given caps %"
+      GST_PTR_FORMAT, xvimagesink->xcontext->caps, caps);
 
   structure = gst_caps_get_structure (caps, 0);
   ret = gst_structure_get_int (structure, "width",
@@ -1028,14 +1025,12 @@ gst_xvimagesink_sink_link (GstPad * pad, const GstCaps * caps)
   if (!ret)
     return GST_PAD_LINK_REFUSED;
 
-  xvimagesink->xcontext->im_format = 0;
-  if (!gst_structure_get_fourcc (structure, "format",
-          &xvimagesink->xcontext->im_format)) {
-    xvimagesink->xcontext->im_format =
+  if (!gst_structure_get_fourcc (structure, "format", &im_format)) {
+    im_format =
         gst_xvimagesink_get_fourcc_from_caps (xvimagesink,
         gst_caps_copy (caps));
   }
-  if (xvimagesink->xcontext->im_format == 0) {
+  if (im_format == 0) {
     return GST_PAD_LINK_REFUSED;
   }
 
@@ -1056,14 +1051,28 @@ gst_xvimagesink_sink_link (GstPad * pad, const GstCaps * caps)
           GST_VIDEOSINK_HEIGHT (xvimagesink));
   }
 
-  if ((xvimagesink->xvimage) && ((GST_VIDEOSINK_WIDTH (xvimagesink) != xvimagesink->xvimage->width) || (GST_VIDEOSINK_HEIGHT (xvimagesink) != xvimagesink->xvimage->height))) { /* We renew our xvimage only if size changed */
+  /* We renew our xvimage only if size or format changed */
+  if ((xvimagesink->xvimage) &&
+      ((xvimagesink->xcontext->im_format != im_format) ||
+          (GST_VIDEOSINK_WIDTH (xvimagesink) != xvimagesink->xvimage->width) ||
+          (GST_VIDEOSINK_HEIGHT (xvimagesink) !=
+              xvimagesink->xvimage->height))) {
+    GST_DEBUG_OBJECT (xvimagesink,
+        "old format " GST_FOURCC_FORMAT ", new format " GST_FOURCC_FORMAT,
+        GST_FOURCC_ARGS (xvimagesink->xcontext->im_format),
+        GST_FOURCC_ARGS (im_format));
+    GST_DEBUG_OBJECT (xvimagesink, "renewing xvimage");
     gst_xvimagesink_xvimage_destroy (xvimagesink, xvimagesink->xvimage);
 
+    xvimagesink->xcontext->im_format = im_format;
     xvimagesink->xvimage = gst_xvimagesink_xvimage_new (xvimagesink,
         GST_VIDEOSINK_WIDTH (xvimagesink), GST_VIDEOSINK_HEIGHT (xvimagesink));
-  } else if (!xvimagesink->xvimage)     /* If no xvimage, creating one */
+  } else if (!xvimagesink->xvimage) {
+    /* If no xvimage, creating one */
+    xvimagesink->xcontext->im_format = im_format;
     xvimagesink->xvimage = gst_xvimagesink_xvimage_new (xvimagesink,
         GST_VIDEOSINK_WIDTH (xvimagesink), GST_VIDEOSINK_HEIGHT (xvimagesink));
+  }
 
   gst_x_overlay_got_desired_size (GST_X_OVERLAY (xvimagesink),
       GST_VIDEOSINK_WIDTH (xvimagesink), GST_VIDEOSINK_HEIGHT (xvimagesink));