summaryrefslogtreecommitdiff
path: root/gst/multifile/gstsplitmuxsink.c
diff options
context:
space:
mode:
authorJan Schmidt <jan@centricular.com>2019-05-25 22:08:05 +1000
committerJan Schmidt <thaytan@noraisin.net>2019-07-15 11:46:36 +0000
commit436d33b2881fa82d3ba080010652e8adcc951297 (patch)
tree76ddd8916abd4e33d77cf14b0686aad4215d641f /gst/multifile/gstsplitmuxsink.c
parentb5d8484b0b0a40fa945f8ed45f2d7adfbfe9c392 (diff)
downloadgstreamer-plugins-good-436d33b2881fa82d3ba080010652e8adcc951297.tar.gz
splitmuxsink: add the ability to mux auxilliary video streams
The primary video stream is used to select fragment cut points at keyframe boundaries. Auxilliary video streams may be broken up at any packet - so fragments may not start with a keyframe for those streams.
Diffstat (limited to 'gst/multifile/gstsplitmuxsink.c')
-rw-r--r--gst/multifile/gstsplitmuxsink.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/gst/multifile/gstsplitmuxsink.c b/gst/multifile/gstsplitmuxsink.c
index ab9fa00eb..1db6a45f9 100644
--- a/gst/multifile/gstsplitmuxsink.c
+++ b/gst/multifile/gstsplitmuxsink.c
@@ -1,5 +1,5 @@
/* GStreamer Muxer bin that splits output stream by size/time
- * Copyright (C) <2014> Jan Schmidt <jan@centricular.com>
+ * Copyright (C) <2014-2019> Jan Schmidt <jan@centricular.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -146,6 +146,11 @@ GST_STATIC_PAD_TEMPLATE ("video",
GST_PAD_SINK,
GST_PAD_REQUEST,
GST_STATIC_CAPS_ANY);
+static GstStaticPadTemplate video_aux_sink_template =
+GST_STATIC_PAD_TEMPLATE ("video_aux_%u",
+ GST_PAD_SINK,
+ GST_PAD_REQUEST,
+ GST_STATIC_CAPS_ANY);
static GstStaticPadTemplate audio_sink_template =
GST_STATIC_PAD_TEMPLATE ("audio_%u",
GST_PAD_SINK,
@@ -265,6 +270,8 @@ gst_splitmux_sink_class_init (GstSplitMuxSinkClass * klass)
gst_element_class_add_static_pad_template (gstelement_class,
&video_sink_template);
gst_element_class_add_static_pad_template (gstelement_class,
+ &video_aux_sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
&audio_sink_template);
gst_element_class_add_static_pad_template (gstelement_class,
&subtitle_sink_template);
@@ -2580,7 +2587,7 @@ gst_splitmux_sink_request_new_pad (GstElement * element,
GstElement *q;
GstPad *q_sink = NULL, *q_src = NULL;
gchar *gname, *qname;
- gboolean is_video = FALSE;
+ gboolean is_primary_video = FALSE;
MqStreamCtx *ctx;
GST_DEBUG_OBJECT (element, "templ:%s, name:%s", templ->name_template, name);
@@ -2591,8 +2598,10 @@ gst_splitmux_sink_request_new_pad (GstElement * element,
g_signal_emit (splitmux, signals[SIGNAL_MUXER_ADDED], 0, splitmux->muxer);
if (templ->name_template) {
- if (g_str_equal (templ->name_template, "video")) {
- if (splitmux->have_video)
+ if (g_str_equal (templ->name_template, "video") ||
+ g_str_has_prefix (templ->name_template, "video_aux_")) {
+ is_primary_video = g_str_equal (templ->name_template, "video");
+ if (is_primary_video && splitmux->have_video)
goto already_have_video;
/* FIXME: Look for a pad template with matching caps, rather than by name */
@@ -2610,7 +2619,6 @@ gst_splitmux_sink_request_new_pad (GstElement * element,
gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS
(splitmux->muxer), "video");
}
- is_video = TRUE;
name = NULL;
} else {
GST_DEBUG_OBJECT (element, "searching for pad-template with name '%s'",
@@ -2620,7 +2628,7 @@ gst_splitmux_sink_request_new_pad (GstElement * element,
(splitmux->muxer), templ->name_template);
/* Fallback to find sink pad templates named 'audio' (flvmux) */
- if (!mux_template) {
+ if (!mux_template && g_str_has_prefix (templ->name_template, "audio_")) {
GST_DEBUG_OBJECT (element,
"searching for pad-template with name 'audio'");
mux_template =
@@ -2677,7 +2685,7 @@ gst_splitmux_sink_request_new_pad (GstElement * element,
goto fail;
}
- if (is_video)
+ if (is_primary_video)
gname = g_strdup ("video");
else if (name == NULL)
gname = gst_pad_get_name (res);
@@ -2720,7 +2728,7 @@ gst_splitmux_sink_request_new_pad (GstElement * element,
gst_pad_add_probe (q_src,
GST_PAD_PROBE_TYPE_DATA_DOWNSTREAM | GST_PAD_PROBE_TYPE_EVENT_FLUSH,
(GstPadProbeCallback) handle_mq_output, ctx, NULL);
- if (is_video && splitmux->reference_ctx != NULL) {
+ if (is_primary_video && splitmux->reference_ctx != NULL) {
splitmux->reference_ctx->is_reference = FALSE;
splitmux->reference_ctx = NULL;
}
@@ -2745,7 +2753,7 @@ gst_splitmux_sink_request_new_pad (GstElement * element,
g_free (gname);
- if (is_video)
+ if (is_primary_video)
splitmux->have_video = TRUE;
gst_pad_set_active (res, TRUE);