sctp: Do downward state change logic after chaining up.
authorJan Schmidt <jan@centricular.com>
Fri, 30 Oct 2020 11:52:18 +0000 (22:52 +1100)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Sat, 31 Oct 2020 01:47:06 +0000 (01:47 +0000)
Call the parent state_change function first when changing state
downward, to make sure that the element has stopped before cleaning
it up.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1741>

ext/sctp/gstsctpdec.c
ext/sctp/gstsctpenc.c

index ab242ad..c9f6d08 100644 (file)
@@ -299,8 +299,7 @@ gst_sctp_dec_change_state (GstElement * element, GstStateChange transition)
         ret = GST_STATE_CHANGE_FAILURE;
       break;
     case GST_STATE_CHANGE_PAUSED_TO_READY:
-      sctpdec_cleanup (self);
-      gst_flow_combiner_reset (self->flow_combiner);
+      stop_all_srcpad_tasks (self);
       break;
     default:
       break;
@@ -309,6 +308,15 @@ gst_sctp_dec_change_state (GstElement * element, GstStateChange transition)
   if (ret != GST_STATE_CHANGE_FAILURE)
     ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
 
+  switch (transition) {
+    case GST_STATE_CHANGE_PAUSED_TO_READY:
+      sctpdec_cleanup (self);
+      gst_flow_combiner_reset (self->flow_combiner);
+      break;
+    default:
+      break;
+  }
+
   return ret;
 }
 
@@ -424,7 +432,7 @@ gst_sctp_data_srcpad_loop (GstPad * pad)
     GST_OBJECT_UNLOCK (self);
 
     if (G_UNLIKELY (flow_ret == GST_FLOW_FLUSHING
-            || flow_ret == GST_FLOW_NOT_LINKED)) {
+            || flow_ret == GST_FLOW_NOT_LINKED) || flow_ret == GST_FLOW_EOS) {
       GST_DEBUG_OBJECT (pad, "Push failed on packet source pad. Error: %s",
           gst_flow_get_name (flow_ret));
     } else if (G_UNLIKELY (flow_ret != GST_FLOW_OK)) {
@@ -705,7 +713,6 @@ sctpdec_cleanup (GstSctpDec * self)
         NULL, NULL);
     g_signal_handler_disconnect (self->sctp_association,
         self->signal_handler_stream_reset);
-    stop_all_srcpad_tasks (self);
     gst_sctp_association_force_close (self->sctp_association);
     g_object_unref (self->sctp_association);
     self->sctp_association = NULL;
index ec0767d..41590b9 100644 (file)
@@ -346,7 +346,7 @@ gst_sctp_enc_change_state (GstElement * element, GstStateChange transition)
     case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
       break;
     case GST_STATE_CHANGE_PAUSED_TO_READY:
-      sctpenc_cleanup (self);
+      stop_srcpad_task (self->src_pad, self);
       self->src_ret = GST_FLOW_FLUSHING;
       break;
     case GST_STATE_CHANGE_READY_TO_NULL:
@@ -368,6 +368,7 @@ gst_sctp_enc_change_state (GstElement * element, GstStateChange transition)
     case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
       break;
     case GST_STATE_CHANGE_PAUSED_TO_READY:
+      sctpenc_cleanup (self);
       break;
     case GST_STATE_CHANGE_READY_TO_NULL:
       break;