summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
authorNicola Murino <nicola.murino@gmail.com>2018-12-14 17:09:01 +0100
committerNicola Murino <nicola.murino@gmail.com>2018-12-14 18:43:49 +0100
commit824e07927356c1bf6a315ba8fea5b2573face9ed (patch)
tree027ed4bb54e879fc950ab9b750eede8c172f7673 /gst
parentf7880c027218cd2471fa4215465cc102cb2ba64f (diff)
downloadgstreamer-plugins-bad-824e07927356c1bf6a315ba8fea5b2573face9ed.tar.gz
removesilence: reset filter on start and on segment events
Diffstat (limited to 'gst')
-rw-r--r--gst/removesilence/gstremovesilence.c51
-rw-r--r--gst/removesilence/gstremovesilence.h7
2 files changed, 50 insertions, 8 deletions
diff --git a/gst/removesilence/gstremovesilence.c b/gst/removesilence/gstremovesilence.c
index 42743604b..a932f6111 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 3f02718b8..f7faf1014 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 {