mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-10 13:51:20 +00:00
dashsink: use gst_dash_sink_reset
To be able to use the properties properly, the element should be reset by gst_dash_sink_reset during the state change from READY_PAUSED and PAUSED_READY. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7916>
This commit is contained in:
parent
c9dd3fbc8f
commit
1492b282dc
1 changed files with 64 additions and 33 deletions
|
@ -281,6 +281,7 @@ typedef struct _GstDashSinkStream
|
||||||
GstPad *pad;
|
GstPad *pad;
|
||||||
gint buffer_probe;
|
gint buffer_probe;
|
||||||
GstElement *splitmuxsink;
|
GstElement *splitmuxsink;
|
||||||
|
GstElement *muxer;
|
||||||
gint adaptation_set_id;
|
gint adaptation_set_id;
|
||||||
gchar *representation_id;
|
gchar *representation_id;
|
||||||
gchar *current_segment_location;
|
gchar *current_segment_location;
|
||||||
|
@ -654,29 +655,12 @@ on_format_location (GstElement * splitmuxsink, guint fragment_id,
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_dash_sink_add_splitmuxsink (GstDashSink * sink, GstDashSinkStream * stream)
|
gst_dash_sink_add_splitmuxsink (GstDashSink * sink, GstDashSinkStream * stream)
|
||||||
{
|
{
|
||||||
GstElement *mux =
|
|
||||||
gst_element_factory_make (dash_muxer_list[sink->muxer].element_name,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
if (sink->muxer == GST_DASH_SINK_MUXER_MP4) {
|
|
||||||
g_object_set (mux, "fragment-duration", sink->target_duration * GST_MSECOND,
|
|
||||||
NULL);
|
|
||||||
} else if (sink->muxer == GST_DASH_SINK_MUXER_DASHMP4) {
|
|
||||||
g_object_set (mux, "fragment-duration", sink->target_duration * GST_SECOND,
|
|
||||||
NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_return_val_if_fail (mux != NULL, FALSE);
|
|
||||||
|
|
||||||
stream->splitmuxsink = gst_element_factory_make ("splitmuxsink", NULL);
|
stream->splitmuxsink = gst_element_factory_make ("splitmuxsink", NULL);
|
||||||
if (!stream->splitmuxsink) {
|
g_return_val_if_fail (stream->splitmuxsink != NULL, FALSE);
|
||||||
gst_object_unref (mux);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
stream->giostreamsink = gst_element_factory_make ("giostreamsink", NULL);
|
stream->giostreamsink = gst_element_factory_make ("giostreamsink", NULL);
|
||||||
if (!stream->giostreamsink) {
|
if (!stream->giostreamsink) {
|
||||||
gst_object_unref (stream->splitmuxsink);
|
gst_object_unref (stream->splitmuxsink);
|
||||||
gst_object_unref (mux);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -686,20 +670,16 @@ gst_dash_sink_add_splitmuxsink (GstDashSink * sink, GstDashSinkStream * stream)
|
||||||
*/
|
*/
|
||||||
gst_object_ref (stream->splitmuxsink);
|
gst_object_ref (stream->splitmuxsink);
|
||||||
|
|
||||||
if (!sink->use_segment_list)
|
stream->muxer =
|
||||||
stream->current_segment_id = 1;
|
gst_element_factory_make (dash_muxer_list[sink->muxer].element_name,
|
||||||
else
|
NULL);
|
||||||
stream->current_segment_id = 0;
|
|
||||||
stream->next_segment_id = stream->current_segment_id;
|
g_return_val_if_fail (stream->muxer != NULL, FALSE);
|
||||||
|
|
||||||
|
gst_object_ref (stream->muxer);
|
||||||
|
|
||||||
g_object_set (stream->splitmuxsink, "location", NULL,
|
g_object_set (stream->splitmuxsink, "location", NULL,
|
||||||
"max-size-time", ((GstClockTime) sink->target_duration * GST_SECOND),
|
"muxer", stream->muxer, "sink", stream->giostreamsink, NULL);
|
||||||
"send-keyframe-requests", TRUE, "muxer", mux, "sink",
|
|
||||||
stream->giostreamsink, "send-keyframe-requests",
|
|
||||||
sink->send_keyframe_requests, NULL);
|
|
||||||
|
|
||||||
if (sink->muxer == GST_DASH_SINK_MUXER_TS)
|
|
||||||
g_object_set (stream->splitmuxsink, "reset-muxer", FALSE, NULL);
|
|
||||||
|
|
||||||
g_signal_connect (stream->splitmuxsink, "format-location",
|
g_signal_connect (stream->splitmuxsink, "format-location",
|
||||||
G_CALLBACK (on_format_location), stream);
|
G_CALLBACK (on_format_location), stream);
|
||||||
|
@ -734,6 +714,45 @@ gst_dash_sink_init (GstDashSink * sink)
|
||||||
static void
|
static void
|
||||||
gst_dash_sink_reset (GstDashSink * sink)
|
gst_dash_sink_reset (GstDashSink * sink)
|
||||||
{
|
{
|
||||||
|
GList *l;
|
||||||
|
for (l = sink->streams; l != NULL; l = l->next) {
|
||||||
|
GstDashSinkStream *stream = (GstDashSinkStream *) l->data;
|
||||||
|
if (stream->muxer)
|
||||||
|
gst_object_unref (stream->muxer);
|
||||||
|
|
||||||
|
stream->muxer =
|
||||||
|
gst_element_factory_make (dash_muxer_list[sink->muxer].element_name,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
g_return_if_fail (stream->muxer != NULL);
|
||||||
|
|
||||||
|
gst_object_ref (stream->muxer);
|
||||||
|
|
||||||
|
g_object_set (stream->splitmuxsink, "muxer", stream->muxer, NULL);
|
||||||
|
|
||||||
|
g_object_set (stream->splitmuxsink, "max-size-time",
|
||||||
|
((GstClockTime) sink->target_duration * GST_SECOND), NULL);
|
||||||
|
if (sink->muxer == GST_DASH_SINK_MUXER_MP4) {
|
||||||
|
g_object_set (stream->muxer, "fragment-duration",
|
||||||
|
sink->target_duration * GST_MSECOND, NULL);
|
||||||
|
} else if (sink->muxer == GST_DASH_SINK_MUXER_DASHMP4) {
|
||||||
|
g_object_set (stream->muxer, "fragment-duration",
|
||||||
|
sink->target_duration * GST_SECOND, NULL);
|
||||||
|
}
|
||||||
|
if (sink->muxer == GST_DASH_SINK_MUXER_TS)
|
||||||
|
g_object_set (stream->splitmuxsink, "reset-muxer", FALSE, NULL);
|
||||||
|
g_object_set (stream->splitmuxsink, "send-keyframe-requests",
|
||||||
|
sink->send_keyframe_requests, NULL);
|
||||||
|
g_object_set (stream->splitmuxsink, "max-size-time",
|
||||||
|
((GstClockTime) sink->target_duration * GST_SECOND), NULL);
|
||||||
|
|
||||||
|
if (!sink->use_segment_list)
|
||||||
|
stream->current_segment_id = 1;
|
||||||
|
else
|
||||||
|
stream->current_segment_id = 0;
|
||||||
|
stream->next_segment_id = stream->current_segment_id;
|
||||||
|
}
|
||||||
|
|
||||||
sink->index = 0;
|
sink->index = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -857,7 +876,7 @@ gst_dash_sink_generate_mpd_content (GstDashSink * sink,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* MPD updates */
|
/* MPD updates */
|
||||||
if (sink->use_segment_list) {
|
if (stream && sink->use_segment_list) {
|
||||||
GST_INFO_OBJECT (sink, "Add segment URL: %s",
|
GST_INFO_OBJECT (sink, "Add segment URL: %s",
|
||||||
stream->current_segment_location);
|
stream->current_segment_location);
|
||||||
gst_mpd_client_add_segment_url (sink->mpd_client, sink->current_period_id,
|
gst_mpd_client_add_segment_url (sink->mpd_client, sink->current_period_id,
|
||||||
|
@ -1118,7 +1137,9 @@ gst_dash_sink_release_pad (GstElement * element, GstPad * pad)
|
||||||
gst_element_remove_pad (element, pad);
|
gst_element_remove_pad (element, pad);
|
||||||
gst_pad_set_active (pad, FALSE);
|
gst_pad_set_active (pad, FALSE);
|
||||||
|
|
||||||
|
if (stream->muxer) {
|
||||||
|
gst_object_unref (stream->muxer);
|
||||||
|
}
|
||||||
|
|
||||||
if (stream->splitmuxsink) {
|
if (stream->splitmuxsink) {
|
||||||
gst_element_set_locked_state (stream->splitmuxsink, TRUE);
|
gst_element_set_locked_state (stream->splitmuxsink, TRUE);
|
||||||
|
@ -1148,6 +1169,16 @@ gst_dash_sink_change_state (GstElement * element, GstStateChange trans)
|
||||||
if (!g_list_length (sink->streams)) {
|
if (!g_list_length (sink->streams)) {
|
||||||
return GST_STATE_CHANGE_FAILURE;
|
return GST_STATE_CHANGE_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case GST_STATE_CHANGE_READY_TO_PAUSED:{
|
||||||
|
GST_DASHSINK_LOCK (sink);
|
||||||
|
gst_dash_sink_reset (sink);
|
||||||
|
GST_DASHSINK_UNLOCK (sink);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
||||||
|
case GST_STATE_CHANGE_READY_TO_NULL:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue