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:
parent
a3a3264f02
commit
afc1eadfdc
@ -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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user