diff options
author | Jan Schmidt <jan@centricular.com> | 2019-05-25 22:08:05 +1000 |
---|---|---|
committer | Jan Schmidt <thaytan@noraisin.net> | 2019-07-15 11:46:36 +0000 |
commit | 436d33b2881fa82d3ba080010652e8adcc951297 (patch) | |
tree | 76ddd8916abd4e33d77cf14b0686aad4215d641f /gst/multifile/gstsplitmuxsink.c | |
parent | b5d8484b0b0a40fa945f8ed45f2d7adfbfe9c392 (diff) | |
download | gstreamer-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.c | 26 |
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); |