From 8bb06eec5cd6389b350f75178b192fc5a53a3feb Mon Sep 17 00:00:00 2001 From: Thomas Vander Stichele Date: Tue, 4 May 2004 14:17:25 +0000 Subject: [PATCH] sys/: clean up debugging caps also recreate xvimage when format has changed 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 | 9 +++++++++ sys/ximage/ximagesink.c | 11 +++-------- sys/xvimage/xvimagesink.c | 39 ++++++++++++++++++++++++--------------- 3 files changed, 36 insertions(+), 23 deletions(-) diff --git a/ChangeLog b/ChangeLog index cd3f310..e582663 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2004-05-04 Thomas Vander Stichele + + * 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 * ext/libvisual/Makefile.am: diff --git a/sys/ximage/ximagesink.c b/sys/ximage/ximagesink.c index 96b0de6..70b3a34 100644 --- a/sys/ximage/ximagesink.c +++ b/sys/ximage/ximagesink.c @@ -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", diff --git a/sys/xvimage/xvimagesink.c b/sys/xvimage/xvimagesink.c index e44e94b..67a1cfb 100644 --- a/sys/xvimage/xvimagesink.c +++ b/sys/xvimage/xvimagesink.c @@ -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)); -- 2.7.4