From ff7304769f2f5f6548cbbda3894b6d3c41e063fd Mon Sep 17 00:00:00 2001 From: Julien Moutte Date: Mon, 28 Nov 2005 22:13:33 +0000 Subject: [PATCH] sys/: Fixed a tricky bug. When caps renegotiation happens (only visible on ximagesink but bug is in xv too) set_caps ... Original commit message from CVS: 2005-11-28 Julien MOUTTE * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_put), (gst_ximagesink_setcaps): * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_put), (gst_xvimagesink_setcaps): Fixed a tricky bug. When caps renegotiation happens (only visible on ximagesink but bug is in xv too) set_caps was destroying the internal x[v]image used to memcpy non locally alloced buffers so that it got renewed on next _chain. The issue is that _expose will try to put that image as it reffed it in _put. Using gst_buffer_unref instead of destroy fixes it ! --- ChangeLog | 12 ++++++++++++ common | 2 +- sys/ximage/ximagesink.c | 5 ++++- sys/xvimage/xvimagesink.c | 3 ++- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 473f6b6..4cf992c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2005-11-28 Julien MOUTTE + + * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_put), + (gst_ximagesink_setcaps): + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_put), + (gst_xvimagesink_setcaps): Fixed a tricky bug. When caps renegotiation + happens (only visible on ximagesink but bug is in xv too) set_caps was + destroying the internal x[v]image used to memcpy non locally alloced + buffers so that it got renewed on next _chain. The issue is that + _expose will try to put that image as it reffed it in _put. + Using gst_buffer_unref instead of destroy fixes it ! + 2005-11-28 Edward Hervey * gst/playback/gstdecodebin.c: (gst_decode_bin_init), diff --git a/common b/common index b0b08bc..f31468e 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit b0b08bcd66ca385364b6f90663585b09693aec67 +Subproject commit f31468e933b5b980398cf636a37abf16ca46c4a0 diff --git a/sys/ximage/ximagesink.c b/sys/ximage/ximagesink.c index 91a7200..0981f8d 100644 --- a/sys/ximage/ximagesink.c +++ b/sys/ximage/ximagesink.c @@ -574,6 +574,7 @@ gst_ximagesink_ximage_put (GstXImageSink * ximagesink, GstXImageBuffer * ximage) GST_DEBUG_OBJECT (ximagesink, "unreffing %p", ximagesink->cur_image); gst_buffer_unref (ximagesink->cur_image); } + GST_DEBUG_OBJECT (ximagesink, "reffing %p as our current image", ximage); ximagesink->cur_image = GST_XIMAGE_BUFFER (gst_buffer_ref (ximage)); } @@ -1249,7 +1250,9 @@ gst_ximagesink_setcaps (GstBaseSink * bsink, GstCaps * caps) if ((ximagesink->ximage) && ((GST_VIDEO_SINK_WIDTH (ximagesink) != ximagesink->ximage->width) || (GST_VIDEO_SINK_HEIGHT (ximagesink) != ximagesink->ximage->height))) { - gst_ximagesink_ximage_destroy (ximagesink, ximagesink->ximage); + GST_DEBUG_OBJECT (ximagesink, "our image is not usable anymore, unref %p", + ximagesink->ximage); + gst_buffer_unref (GST_BUFFER (ximagesink->ximage)); ximagesink->ximage = NULL; } diff --git a/sys/xvimage/xvimagesink.c b/sys/xvimage/xvimagesink.c index 0d00da4..92ab68c 100644 --- a/sys/xvimage/xvimagesink.c +++ b/sys/xvimage/xvimagesink.c @@ -598,6 +598,7 @@ gst_xvimagesink_xvimage_put (GstXvImageSink * xvimagesink, GST_DEBUG_OBJECT (xvimagesink, "unreffing %p", xvimagesink->cur_image); gst_buffer_unref (xvimagesink->cur_image); } + GST_DEBUG_OBJECT (xvimagesink, "reffing %p as our current image", xvimage); xvimagesink->cur_image = GST_XVIMAGE_BUFFER (gst_buffer_ref (xvimage)); } @@ -1641,7 +1642,7 @@ gst_xvimagesink_setcaps (GstBaseSink * bsink, GstCaps * caps) GST_FOURCC_ARGS (xvimagesink->xcontext->im_format), GST_FOURCC_ARGS (im_format)); GST_DEBUG_OBJECT (xvimagesink, "renewing xvimage"); - gst_xvimage_buffer_free (xvimagesink->xvimage); + gst_buffer_unref (GST_BUFFER (xvimagesink->xvimage)); xvimagesink->xvimage = NULL; } -- 2.7.4