diff options
author | Thomas Vander Stichele <thomas@apestaart.org> | 2002-07-12 21:15:31 +0000 |
---|---|---|
committer | Thomas Vander Stichele <thomas@apestaart.org> | 2002-07-12 21:15:31 +0000 |
commit | d70bc4c9455c2d1dcb7f6f5a404b74d2dd2053af (patch) | |
tree | 2b966a3281a0424a6c40ec0dfe7857994e7925d8 /gst/cutter/gstcutter.c | |
parent | c70e69c051df1a37cfef94c0f21b93249500e403 (diff) |
fixes
Original commit message from CVS:
fixes
Diffstat (limited to 'gst/cutter/gstcutter.c')
-rw-r--r-- | gst/cutter/gstcutter.c | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/gst/cutter/gstcutter.c b/gst/cutter/gstcutter.c index 7b336c98..0e4c6e89 100644 --- a/gst/cutter/gstcutter.c +++ b/gst/cutter/gstcutter.c @@ -107,6 +107,27 @@ gst_cutter_get_type(void) { return cutter_type; } +static GstPadConnectReturn +gst_cutter_connect (GstPad *pad, GstCaps *caps) +{ + GstCutter *filter; + GstPad *otherpad; + + filter = GST_CUTTER (gst_pad_get_parent (pad)); + g_return_val_if_fail (filter != NULL, GST_PAD_CONNECT_REFUSED); + g_return_val_if_fail (GST_IS_CUTTER (filter), GST_PAD_CONNECT_REFUSED); + otherpad = (pad == filter->srcpad ? filter->sinkpad : filter->srcpad); + + if (GST_CAPS_IS_FIXED (caps)) + { + if (!gst_pad_try_set_caps (otherpad, caps)) + return GST_PAD_CONNECT_REFUSED; + + return GST_PAD_CONNECT_OK; + } + return GST_PAD_CONNECT_DELAYED; +} + static void gst_cutter_class_init (GstCutterClass *klass) { @@ -162,8 +183,10 @@ gst_cutter_init (GstCutter *filter) gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); gst_pad_set_chain_function (filter->sinkpad, gst_cutter_chain); + gst_pad_set_connect_function (filter->sinkpad, gst_cutter_connect); filter->srcpad = gst_pad_new ("src", GST_PAD_SRC); gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); + gst_pad_set_connect_function (filter->srcpad, gst_cutter_connect); } static void @@ -174,7 +197,7 @@ gst_cutter_chain (GstPad *pad, GstBuffer *buf) double RMS = 0.0; /* RMS of signal in buffer */ double ms = 0.0; /* mean square value of buffer */ static gboolean silent_prev = FALSE; /* previous value of silent */ - GstBuffer* prebuf; /* pointer to a prebuffer element */ + GstBuffer *prebuf; /* pointer to a prebuffer element */ g_return_if_fail (pad != NULL); g_return_if_fail (GST_IS_PAD (pad)); @@ -184,8 +207,10 @@ gst_cutter_chain (GstPad *pad, GstBuffer *buf) g_return_if_fail (filter != NULL); g_return_if_fail (GST_IS_CUTTER (filter)); - g_return_if_fail (gst_audio_is_buffer_framed (pad, buf) == TRUE); - + /* FIXME: this doesn't seem to be working well anymore */ + if (gst_audio_is_buffer_framed (pad, buf) == FALSE) + g_warning ("cutter: audio buffer is not framed !\n"); + if (!filter->have_caps) gst_cutter_get_caps (pad, filter); in_data = (gint16 *) GST_BUFFER_DATA (buf); @@ -214,7 +239,9 @@ gst_cutter_chain (GstPad *pad, GstBuffer *buf) /* if RMS below threshold, add buffer length to silent run length count * if not, reset */ - /*g_print ("DEBUG: cutter: ms %f, RMS %f\n", ms, RMS); */ + GST_DEBUG (GST_CAT_PLUGIN_INFO, + "DEBUG: cutter: ms %f, RMS %f, audio length %f\n", + ms, RMS, gst_audio_length (filter->srcpad, buf)); if (RMS < filter->threshold_level) filter->silent_run_length += gst_audio_length (filter->srcpad, buf); else @@ -257,14 +284,19 @@ gst_cutter_chain (GstPad *pad, GstBuffer *buf) /* now check if we have to add the new buffer to the cache or to the pad */ if (filter->silent) { + /* we ref it before putting it in the pre_buffer */ + gst_buffer_ref (buf); filter->pre_buffer = g_list_append (filter->pre_buffer, buf); filter->pre_run_length += gst_audio_length (filter->srcpad, buf); while (filter->pre_run_length > filter->pre_length) { prebuf = (g_list_first (filter->pre_buffer))->data; + g_assert (GST_IS_BUFFER (prebuf)); filter->pre_buffer = g_list_remove (filter->pre_buffer, prebuf); - gst_pad_push (filter->srcpad, prebuf); filter->pre_run_length -= gst_audio_length (filter->srcpad, prebuf); + gst_pad_push (filter->srcpad, prebuf); + /* we unref it after getting it out of the pre_buffer */ + gst_buffer_unref (prebuf); } } else @@ -387,6 +419,7 @@ gst_cutter_get_caps (GstPad *pad, GstCutter* filter) caps = GST_PAD_CAPS (pad); /* FIXME : Please change this to a better warning method ! */ + g_assert (caps != NULL); if (caps == NULL) printf ("WARNING: cutter: get_caps: Could not get caps of pad !\n"); gst_caps_get_int (caps, "width", &filter->width); |