From: Nicola Murino Date: Fri, 14 Dec 2018 16:09:01 +0000 (+0100) Subject: removesilence: reset filter on start and on segment events X-Git-Tag: 1.16.2~409 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=824e07927356c1bf6a315ba8fea5b2573face9ed;p=platform%2Fupstream%2Fgst-plugins-bad.git removesilence: reset filter on start and on segment events --- diff --git a/gst/removesilence/gstremovesilence.c b/gst/removesilence/gstremovesilence.c index 4274360..a932f61 100644 --- a/gst/removesilence/gstremovesilence.c +++ b/gst/removesilence/gstremovesilence.c @@ -110,6 +110,9 @@ static void gst_remove_silence_set_property (GObject * object, guint prop_id, static void gst_remove_silence_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); +static gboolean gst_remove_silence_start (GstBaseTransform * trans); +static gboolean gst_remove_silence_sink_event (GstBaseTransform * trans, + GstEvent * event); static GstFlowReturn gst_remove_silence_transform_ip (GstBaseTransform * base, GstBuffer * buf); static void gst_remove_silence_finalize (GObject * obj); @@ -122,9 +125,11 @@ gst_remove_silence_class_init (GstRemoveSilenceClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; + GstBaseTransformClass *base_transform_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; + base_transform_class = GST_BASE_TRANSFORM_CLASS (klass); gobject_class->finalize = gst_remove_silence_finalize; gobject_class->set_property = gst_remove_silence_set_property; @@ -183,10 +188,22 @@ gst_remove_silence_class_init (GstRemoveSilenceClass * klass) gst_element_class_add_static_pad_template (gstelement_class, &src_template); gst_element_class_add_static_pad_template (gstelement_class, &sink_template); - GST_BASE_TRANSFORM_CLASS (klass)->transform_ip = + base_transform_class->start = GST_DEBUG_FUNCPTR (gst_remove_silence_start); + base_transform_class->sink_event = + GST_DEBUG_FUNCPTR (gst_remove_silence_sink_event); + base_transform_class->transform_ip = GST_DEBUG_FUNCPTR (gst_remove_silence_transform_ip); } +static void +gst_remove_silence_reset (GstRemoveSilence * filter) +{ + filter->ts_offset = 0; + filter->silence_detected = FALSE; + filter->consecutive_silence_buffers = 0; + filter->consecutive_silence_time = 0; +} + /* initialize the new element * instantiate pads and add them to element * set pad calback functions @@ -198,13 +215,11 @@ gst_remove_silence_init (GstRemoveSilence * filter) filter->vad = vad_new (DEFAULT_VAD_HYSTERESIS, DEFAULT_VAD_THRESHOLD); filter->remove = FALSE; filter->squash = FALSE; - filter->ts_offset = 0; - filter->silence_detected = FALSE; filter->silent = TRUE; - filter->consecutive_silence_buffers = 0; filter->minimum_silence_buffers = MINIMUM_SILENCE_BUFFERS_DEF; filter->minimum_silence_time = MINIMUM_SILENCE_TIME_DEF; - filter->consecutive_silence_time = 0; + + gst_remove_silence_reset (filter); if (!filter->vad) { GST_DEBUG ("Error initializing VAD !!"); @@ -212,6 +227,32 @@ gst_remove_silence_init (GstRemoveSilence * filter) } } +static gboolean +gst_remove_silence_start (GstBaseTransform * trans) +{ + GstRemoveSilence *filter = GST_REMOVE_SILENCE (trans); + + GST_INFO ("reset filter on start"); + gst_remove_silence_reset (filter); + + return TRUE; +} + +static gboolean +gst_remove_silence_sink_event (GstBaseTransform * trans, GstEvent * event) +{ + GstRemoveSilence *filter = GST_REMOVE_SILENCE (trans); + + if (event->type == GST_EVENT_SEGMENT) { + GST_INFO ("reset filter on segment event"); + gst_remove_silence_reset (filter); + } + + return + GST_BASE_TRANSFORM_CLASS (gst_remove_silence_parent_class)->sink_event + (trans, event); +} + static void gst_remove_silence_finalize (GObject * obj) { diff --git a/gst/removesilence/gstremovesilence.h b/gst/removesilence/gstremovesilence.h index 3f02718..f7faf10 100644 --- a/gst/removesilence/gstremovesilence.h +++ b/gst/removesilence/gstremovesilence.h @@ -45,13 +45,14 @@ typedef struct _GstRemoveSilence { VADFilter* vad; gboolean remove; gboolean squash; + gboolean silent; + guint16 minimum_silence_buffers; + guint64 minimum_silence_time; + /* filter params protected by STREAM_LOCK */ guint64 ts_offset; gboolean silence_detected; - gboolean silent; guint64 consecutive_silence_buffers; - guint16 minimum_silence_buffers; guint64 consecutive_silence_time; - guint64 minimum_silence_time; } GstRemoveSilence; typedef struct _GstRemoveSilenceClass {