splitmuxsink: added a "split now" action signal
Now, the video file can be split at an arbitrary time chosen by the user.
https://bugzilla.gnome.org/show_bug.cgi?id=787922
diff --git a/gst/multifile/gstsplitmuxsink.c b/gst/multifile/gstsplitmuxsink.c
index 7e65d6b..20bded2 100644
--- a/gst/multifile/gstsplitmuxsink.c
+++ b/gst/multifile/gstsplitmuxsink.c
@@ -69,6 +69,8 @@
#define GST_SPLITMUX_WAIT_OUTPUT(s) g_cond_wait (&(s)->output_cond, &(s)->lock)
#define GST_SPLITMUX_BROADCAST_OUTPUT(s) g_cond_broadcast (&(s)->output_cond)
+static void split_now (GstSplitMuxSink * splitmux);
+
enum
{
PROP_0,
@@ -99,6 +101,7 @@
{
SIGNAL_FORMAT_LOCATION,
SIGNAL_FORMAT_LOCATION_FULL,
+ SIGNAL_SPLIT_NOW,
SIGNAL_LAST
};
@@ -305,6 +308,23 @@
g_signal_new ("format-location-full", G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_STRING, 2, G_TYPE_UINT,
GST_TYPE_SAMPLE);
+
+ /**
+ * GstSplitMuxSink::split-now:
+ * @splitmux: the #GstSplitMuxSink
+ *
+ * When called by the user, this action signal splits the video file (and begins a new one) immediately.
+ *
+ *
+ * Since: 1.14
+ */
+
+ signals[SIGNAL_SPLIT_NOW] =
+ g_signal_new ("split-now", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstSplitMuxSinkClass,
+ split_now), NULL, NULL, NULL, G_TYPE_NONE, 0);
+
+ klass->split_now = split_now;
}
static void
@@ -327,6 +347,7 @@
splitmux->threshold_timecode_str = NULL;
GST_OBJECT_FLAG_SET (splitmux, GST_ELEMENT_FLAG_SINK);
+ splitmux->split_now = FALSE;
}
static void
@@ -1262,6 +1283,10 @@
if (splitmux->fragment_total_bytes <= 0)
return FALSE;
+ /* User told us to split now */
+ if (g_atomic_int_get (&(splitmux->split_now)) == TRUE)
+ return TRUE;
+
if (thresh_bytes > 0 && queued_bytes >= thresh_bytes)
return TRUE; /* Would overrun byte limit */
@@ -1358,6 +1383,7 @@
/* Check for overrun - have we output at least one byte and overrun
* either threshold? */
if (need_new_fragment (splitmux, queued_time, queued_gop_time, queued_bytes)) {
+ g_atomic_int_set (&(splitmux->split_now), FALSE);
/* Tell the output side to start a new fragment */
GST_INFO_OBJECT (splitmux,
"This GOP (dur %" GST_STIME_FORMAT
@@ -2354,6 +2380,7 @@
break;
}
case GST_STATE_CHANGE_PAUSED_TO_READY:
+ g_atomic_int_set (&(splitmux->split_now), FALSE);
case GST_STATE_CHANGE_READY_TO_NULL:
GST_SPLITMUX_LOCK (splitmux);
splitmux->output_state = SPLITMUX_OUTPUT_STATE_STOPPED;
@@ -2432,3 +2459,9 @@
splitmux->fragment_id = 0;
}
}
+
+static void
+split_now (GstSplitMuxSink * splitmux)
+{
+ g_atomic_int_set (&(splitmux->split_now), TRUE);
+}
diff --git a/gst/multifile/gstsplitmuxsink.h b/gst/multifile/gstsplitmuxsink.h
index 01cd4b9..aab9065 100644
--- a/gst/multifile/gstsplitmuxsink.h
+++ b/gst/multifile/gstsplitmuxsink.h
@@ -168,11 +168,16 @@
gboolean use_robust_muxing;
gboolean muxer_has_reserved_props;
+
+ gboolean split_now;
};
struct _GstSplitMuxSinkClass
{
GstBinClass parent_class;
+
+ /* actions */
+ void (*split_now) (GstSplitMuxSink * splitmux);
};
G_END_DECLS