streamsynchronizer: Split up event handler code

No changes to behaviour, just split up the big parts into dedicated function for
readability

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6825>
This commit is contained in:
Edward Hervey 2024-05-10 10:10:59 +02:00 committed by GStreamer Marge Bot
parent a3a3264f02
commit afc1eadfdc

View File

@ -361,20 +361,10 @@ gst_stream_synchronizer_wait (GstStreamSynchronizer * self, GstPad * pad)
return TRUE; return TRUE;
} }
/* sinkpad functions */ static void
static gboolean gst_stream_synchronizer_handle_stream_start (GstStreamSynchronizer * self,
gst_stream_synchronizer_sink_event (GstPad * pad, GstObject * parent, GstPad * pad, GstEvent * event)
GstEvent * event)
{ {
GstStreamSynchronizer *self = GST_STREAM_SYNCHRONIZER (parent);
gboolean ret = FALSE;
GST_LOG_OBJECT (pad, "Handling event %s: %" GST_PTR_FORMAT,
GST_EVENT_TYPE_NAME (event), event);
switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_STREAM_START:
{
GstSyncStream *stream, *ostream; GstSyncStream *stream, *ostream;
guint32 seqnum = gst_event_get_seqnum (event); guint32 seqnum = gst_event_get_seqnum (event);
guint group_id; guint group_id;
@ -422,14 +412,14 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstObject * parent,
stream->wait = FALSE; stream->wait = FALSE;
gst_syncstream_unref (stream); gst_syncstream_unref (stream);
GST_STREAM_SYNCHRONIZER_UNLOCK (self); GST_STREAM_SYNCHRONIZER_UNLOCK (self);
break; return;
} }
} else if (group_id == self->group_id) { } else if (group_id == self->group_id) {
GST_DEBUG_OBJECT (pad, "Stream %d belongs to running group %d, " GST_DEBUG_OBJECT (pad, "Stream %d belongs to running group %d, "
"no waiting", stream->stream_number, group_id); "no waiting", stream->stream_number, group_id);
gst_syncstream_unref (stream); gst_syncstream_unref (stream);
GST_STREAM_SYNCHRONIZER_UNLOCK (self); GST_STREAM_SYNCHRONIZER_UNLOCK (self);
break; return;
} }
GST_DEBUG_OBJECT (pad, "Stream %d changed", stream->stream_number); GST_DEBUG_OBJECT (pad, "Stream %d changed", stream->stream_number);
@ -451,8 +441,7 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstObject * parent,
if (have_group_id) if (have_group_id)
GST_DEBUG_OBJECT (self, GST_DEBUG_OBJECT (self,
"All streams have changed to group id %u -- unblocking", "All streams have changed to group id %u -- unblocking", group_id);
group_id);
else else
GST_DEBUG_OBJECT (self, "All streams have changed -- unblocking"); GST_DEBUG_OBJECT (self, "All streams have changed -- unblocking");
@ -512,13 +501,18 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstObject * parent,
gst_syncstream_unref (stream); gst_syncstream_unref (stream);
GST_STREAM_SYNCHRONIZER_UNLOCK (self); GST_STREAM_SYNCHRONIZER_UNLOCK (self);
break;
} }
case GST_EVENT_SEGMENT:{
/* Returns FALSE if the event was handled and shouldn't be propagated */
static gboolean
gst_stream_synchronizer_handle_segment (GstStreamSynchronizer * self,
GstPad * pad, GstEvent ** event)
{
GstSyncStream *stream; GstSyncStream *stream;
GstSegment segment; GstSegment segment;
gst_event_copy_segment (event, &segment); gst_event_copy_segment (*event, &segment);
GST_STREAM_SYNCHRONIZER_LOCK (self); GST_STREAM_SYNCHRONIZER_LOCK (self);
@ -526,8 +520,8 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstObject * parent,
if (self->shutdown) { if (self->shutdown) {
GST_STREAM_SYNCHRONIZER_UNLOCK (self); GST_STREAM_SYNCHRONIZER_UNLOCK (self);
gst_event_unref (event); gst_event_unref (*event);
goto done; return FALSE;
} }
stream = gst_streamsync_pad_get_stream (pad); stream = gst_streamsync_pad_get_stream (pad);
@ -543,7 +537,7 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstObject * parent,
gst_segment_copy_into (&segment, &stream->segment); gst_segment_copy_into (&segment, &stream->segment);
GST_DEBUG_OBJECT (pad, "Segment now is: %" GST_SEGMENT_FORMAT, GST_DEBUG_OBJECT (pad, "Segment now is: %" GST_SEGMENT_FORMAT,
&stream->segment); &stream->segment);
stream->segment_seqnum = gst_event_get_seqnum (event); stream->segment_seqnum = gst_event_get_seqnum (*event);
GST_DEBUG_OBJECT (pad, "Stream start running time: %" GST_TIME_FORMAT, GST_DEBUG_OBJECT (pad, "Stream start running time: %" GST_TIME_FORMAT,
GST_TIME_ARGS (stream->segment.base)); GST_TIME_ARGS (stream->segment.base));
@ -552,8 +546,8 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstObject * parent,
tmpev = gst_event_new_segment (&stream->segment); tmpev = gst_event_new_segment (&stream->segment);
gst_event_set_seqnum (tmpev, stream->segment_seqnum); gst_event_set_seqnum (tmpev, stream->segment_seqnum);
gst_event_unref (event); gst_event_unref (*event);
event = tmpev; *event = tmpev;
} }
} else if (stream) { } else if (stream) {
GST_WARNING_OBJECT (pad, "Non-TIME segment: %s", GST_WARNING_OBJECT (pad, "Non-TIME segment: %s",
@ -562,22 +556,14 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstObject * parent,
} }
gst_syncstream_unref (stream); gst_syncstream_unref (stream);
GST_STREAM_SYNCHRONIZER_UNLOCK (self); GST_STREAM_SYNCHRONIZER_UNLOCK (self);
break;
}
case GST_EVENT_FLUSH_START:{
GstSyncStream *stream;
GST_STREAM_SYNCHRONIZER_LOCK (self); return TRUE;
stream = gst_streamsync_pad_get_stream (pad); }
self->eos = FALSE;
GST_DEBUG_OBJECT (pad, "Flushing streams"); static void
stream->flushing = TRUE; gst_stream_synchronizer_handle_flush_stop (GstStreamSynchronizer * self,
g_cond_broadcast (&stream->stream_finish_cond); GstPad * pad, GstEvent * event)
gst_syncstream_unref (stream); {
GST_STREAM_SYNCHRONIZER_UNLOCK (self);
break;
}
case GST_EVENT_FLUSH_STOP:{
GstSyncStream *stream; GstSyncStream *stream;
GList *l; GList *l;
GstClockTime new_group_start_time = 0; GstClockTime new_group_start_time = 0;
@ -619,8 +605,7 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstObject * parent,
gst_segment_to_running_time (&ostream->segment, gst_segment_to_running_time (&ostream->segment,
GST_FORMAT_TIME, ostream->segment.stop); GST_FORMAT_TIME, ostream->segment.stop);
new_group_start_time = new_group_start_time = MAX (new_group_start_time, start_running_time);
MAX (new_group_start_time, start_running_time);
} }
} }
@ -633,27 +618,14 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstObject * parent,
gst_syncstream_unref (stream); gst_syncstream_unref (stream);
GST_STREAM_SYNCHRONIZER_UNLOCK (self); GST_STREAM_SYNCHRONIZER_UNLOCK (self);
break;
}
/* unblocking EOS wait when track switch. */
case GST_EVENT_CUSTOM_DOWNSTREAM_OOB:{
if (gst_event_has_name (event, "playsink-custom-video-flush")
|| gst_event_has_name (event, "playsink-custom-audio-flush")
|| gst_event_has_name (event, "playsink-custom-subtitle-flush")) {
GstSyncStream *stream;
GST_STREAM_SYNCHRONIZER_LOCK (self); }
stream = gst_streamsync_pad_get_stream (pad);
stream->is_eos = FALSE; static gboolean
stream->eos_sent = FALSE; gst_stream_synchronizer_handle_eos (GstStreamSynchronizer * self, GstPad * pad,
stream->wait = FALSE; GstEvent * event)
g_cond_broadcast (&stream->stream_finish_cond); {
gst_syncstream_unref (stream); gboolean ret = FALSE;
GST_STREAM_SYNCHRONIZER_UNLOCK (self);
}
break;
}
case GST_EVENT_EOS:{
GstSyncStream *stream; GstSyncStream *stream;
GList *l; GList *l;
gboolean all_eos = TRUE; gboolean all_eos = TRUE;
@ -749,6 +721,69 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstObject * parent,
gst_event_unref (event); gst_event_unref (event);
gst_syncstream_unref (stream); gst_syncstream_unref (stream);
GST_STREAM_SYNCHRONIZER_UNLOCK (self); GST_STREAM_SYNCHRONIZER_UNLOCK (self);
return ret;
}
/* sinkpad functions */
static gboolean
gst_stream_synchronizer_sink_event (GstPad * pad, GstObject * parent,
GstEvent * event)
{
GstStreamSynchronizer *self = GST_STREAM_SYNCHRONIZER (parent);
gboolean ret = FALSE;
GST_LOG_OBJECT (pad, "Handling event %s: %" GST_PTR_FORMAT,
GST_EVENT_TYPE_NAME (event), event);
switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_STREAM_START:
{
gst_stream_synchronizer_handle_stream_start (self, pad, event);
break;
}
case GST_EVENT_SEGMENT:{
if (!gst_stream_synchronizer_handle_segment (self, pad, &event))
goto done;
break;
}
case GST_EVENT_FLUSH_START:{
GstSyncStream *stream;
GST_STREAM_SYNCHRONIZER_LOCK (self);
stream = gst_streamsync_pad_get_stream (pad);
self->eos = FALSE;
GST_DEBUG_OBJECT (pad, "Flushing streams");
stream->flushing = TRUE;
g_cond_broadcast (&stream->stream_finish_cond);
gst_syncstream_unref (stream);
GST_STREAM_SYNCHRONIZER_UNLOCK (self);
break;
}
case GST_EVENT_FLUSH_STOP:{
gst_stream_synchronizer_handle_flush_stop (self, pad, event);
break;
}
/* unblocking EOS wait when track switch. */
case GST_EVENT_CUSTOM_DOWNSTREAM_OOB:{
if (gst_event_has_name (event, "playsink-custom-video-flush")
|| gst_event_has_name (event, "playsink-custom-audio-flush")
|| gst_event_has_name (event, "playsink-custom-subtitle-flush")) {
GstSyncStream *stream;
GST_STREAM_SYNCHRONIZER_LOCK (self);
stream = gst_streamsync_pad_get_stream (pad);
stream->is_eos = FALSE;
stream->eos_sent = FALSE;
stream->wait = FALSE;
g_cond_broadcast (&stream->stream_finish_cond);
gst_syncstream_unref (stream);
GST_STREAM_SYNCHRONIZER_UNLOCK (self);
}
break;
}
case GST_EVENT_EOS:{
ret = gst_stream_synchronizer_handle_eos (self, pad, event);
goto done; goto done;
} }
default: default: