mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-20 04:56:24 +00:00
Add unlink function to properly handle unreffing bufferpools.
Original commit message from CVS: Add unlink function to properly handle unreffing bufferpools.
This commit is contained in:
parent
a7307dbb82
commit
98c89f610e
2 changed files with 29 additions and 24 deletions
|
@ -5,7 +5,7 @@ libgstvideotestsrc_la_SOURCES = \
|
||||||
gstvideotestsrc.c \
|
gstvideotestsrc.c \
|
||||||
videotestsrc.c
|
videotestsrc.c
|
||||||
|
|
||||||
libgstvideotestsrc_la_CFLAGS = -O2 $(FOMIT_FRAME_POINTER) $(GST_OPT_CFLAGS) $(GST_FUNROLL_CFLAGS) $(GST_CFLAGS)
|
libgstvideotestsrc_la_CFLAGS = $(GST_CFLAGS)
|
||||||
libgstvideotestsrc_la_LIBADD =
|
libgstvideotestsrc_la_LIBADD =
|
||||||
libgstvideotestsrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
libgstvideotestsrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
||||||
|
|
||||||
|
|
|
@ -73,8 +73,6 @@ static void gst_videotestsrc_get_property (GObject * object, guint prop_id, GVal
|
||||||
|
|
||||||
static GstBuffer *gst_videotestsrc_get (GstPad * pad);
|
static GstBuffer *gst_videotestsrc_get (GstPad * pad);
|
||||||
|
|
||||||
static void gst_videotestsrc_reset (GstVideotestsrc *videotestsrc);
|
|
||||||
|
|
||||||
static GstElementClass *parent_class = NULL;
|
static GstElementClass *parent_class = NULL;
|
||||||
|
|
||||||
static GstCaps * gst_videotestsrc_get_capslist (void);
|
static GstCaps * gst_videotestsrc_get_capslist (void);
|
||||||
|
@ -182,20 +180,16 @@ gst_videotestsrc_set_clock (GstElement *element, GstClock *clock)
|
||||||
|
|
||||||
v = GST_VIDEOTESTSRC (element);
|
v = GST_VIDEOTESTSRC (element);
|
||||||
|
|
||||||
#if GST_VERSION_MINOR > 6
|
|
||||||
gst_object_replace ((GstObject **)&v->clock, (GstObject *)clock);
|
gst_object_replace ((GstObject **)&v->clock, (GstObject *)clock);
|
||||||
#else
|
|
||||||
gst_object_swap ((GstObject **)&v->clock, (GstObject *)clock);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstPadLinkReturn
|
static GstPadLinkReturn
|
||||||
gst_videotestsrc_srcconnect (GstPad * pad, GstCaps * caps)
|
gst_videotestsrc_src_link (GstPad * pad, GstCaps * caps)
|
||||||
{
|
{
|
||||||
GstVideotestsrc *videotestsrc;
|
GstVideotestsrc *videotestsrc;
|
||||||
GstCaps *caps1;
|
GstCaps *caps1;
|
||||||
|
|
||||||
GST_DEBUG ("gst_videotestsrc_srcconnect");
|
GST_DEBUG ("gst_videotestsrc_src_link");
|
||||||
videotestsrc = GST_VIDEOTESTSRC (gst_pad_get_parent (pad));
|
videotestsrc = GST_VIDEOTESTSRC (gst_pad_get_parent (pad));
|
||||||
|
|
||||||
for ( ; caps != NULL; caps = caps->next) {
|
for ( ; caps != NULL; caps = caps->next) {
|
||||||
|
@ -253,26 +247,44 @@ gst_videotestsrc_srcconnect (GstPad * pad, GstCaps * caps)
|
||||||
|
|
||||||
GST_DEBUG ("size %d x %d", videotestsrc->width, videotestsrc->height);
|
GST_DEBUG ("size %d x %d", videotestsrc->width, videotestsrc->height);
|
||||||
|
|
||||||
|
videotestsrc->pool = gst_pad_get_bufferpool (videotestsrc->srcpad);
|
||||||
|
|
||||||
return GST_PAD_LINK_DONE;
|
return GST_PAD_LINK_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_videotestsrc_src_unlink (GstPad * pad)
|
||||||
|
{
|
||||||
|
GstVideotestsrc *videotestsrc;
|
||||||
|
|
||||||
|
videotestsrc = GST_VIDEOTESTSRC (gst_pad_get_parent (pad));
|
||||||
|
|
||||||
|
if (videotestsrc->pool) {
|
||||||
|
gst_buffer_pool_unref (videotestsrc->pool);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static GstElementStateReturn
|
static GstElementStateReturn
|
||||||
gst_videotestsrc_change_state (GstElement * element)
|
gst_videotestsrc_change_state (GstElement * element)
|
||||||
{
|
{
|
||||||
GstVideotestsrc *v;
|
GstVideotestsrc *videotestsrc;
|
||||||
|
|
||||||
v = GST_VIDEOTESTSRC (element);
|
videotestsrc = GST_VIDEOTESTSRC (element);
|
||||||
|
|
||||||
switch (GST_STATE_TRANSITION (element)) {
|
switch (GST_STATE_TRANSITION (element)) {
|
||||||
|
case GST_STATE_NULL_TO_READY:
|
||||||
|
break;
|
||||||
|
case GST_STATE_READY_TO_PAUSED:
|
||||||
|
break;
|
||||||
case GST_STATE_PAUSED_TO_PLAYING:
|
case GST_STATE_PAUSED_TO_PLAYING:
|
||||||
v->pool = gst_pad_get_bufferpool (v->srcpad);
|
|
||||||
break;
|
break;
|
||||||
case GST_STATE_PLAYING_TO_PAUSED:
|
case GST_STATE_PLAYING_TO_PAUSED:
|
||||||
gst_buffer_pool_unref(v->pool);
|
break;
|
||||||
v->pool = NULL;
|
case GST_STATE_PAUSED_TO_READY:
|
||||||
|
videotestsrc->timestamp_offset = 0;
|
||||||
|
videotestsrc->n_frames = 0;
|
||||||
break;
|
break;
|
||||||
case GST_STATE_READY_TO_NULL:
|
case GST_STATE_READY_TO_NULL:
|
||||||
gst_videotestsrc_reset (v);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -380,11 +392,11 @@ gst_videotestsrc_init (GstVideotestsrc * videotestsrc)
|
||||||
gst_pad_set_getcaps_function (videotestsrc->srcpad, gst_videotestsrc_getcaps);
|
gst_pad_set_getcaps_function (videotestsrc->srcpad, gst_videotestsrc_getcaps);
|
||||||
gst_element_add_pad (GST_ELEMENT (videotestsrc), videotestsrc->srcpad);
|
gst_element_add_pad (GST_ELEMENT (videotestsrc), videotestsrc->srcpad);
|
||||||
gst_pad_set_get_function (videotestsrc->srcpad, gst_videotestsrc_get);
|
gst_pad_set_get_function (videotestsrc->srcpad, gst_videotestsrc_get);
|
||||||
gst_pad_set_link_function (videotestsrc->srcpad, gst_videotestsrc_srcconnect);
|
gst_pad_set_link_function (videotestsrc->srcpad, gst_videotestsrc_src_link);
|
||||||
|
gst_pad_set_unlink_function (videotestsrc->srcpad, gst_videotestsrc_src_unlink);
|
||||||
|
|
||||||
videotestsrc->pool = NULL;
|
videotestsrc->pool = NULL;
|
||||||
gst_videotestsrc_set_pattern(videotestsrc, GST_VIDEOTESTSRC_SMPTE);
|
gst_videotestsrc_set_pattern(videotestsrc, GST_VIDEOTESTSRC_SMPTE);
|
||||||
gst_videotestsrc_reset (videotestsrc);
|
|
||||||
|
|
||||||
videotestsrc->sync = TRUE;
|
videotestsrc->sync = TRUE;
|
||||||
videotestsrc->default_width = 320;
|
videotestsrc->default_width = 320;
|
||||||
|
@ -392,13 +404,6 @@ gst_videotestsrc_init (GstVideotestsrc * videotestsrc)
|
||||||
videotestsrc->default_rate = 30.;
|
videotestsrc->default_rate = 30.;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
gst_videotestsrc_reset (GstVideotestsrc *videotestsrc)
|
|
||||||
{
|
|
||||||
videotestsrc->timestamp_offset = 0;
|
|
||||||
videotestsrc->n_frames = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static GstBuffer *
|
static GstBuffer *
|
||||||
gst_videotestsrc_get (GstPad * pad)
|
gst_videotestsrc_get (GstPad * pad)
|
||||||
|
|
Loading…
Reference in a new issue