splitmuxsink: Allow time and bytes to reach their respective thresholds
[platform/upstream/gst-plugins-good.git] / gst / multifile / gstsplitmuxsink.c
index bf66a11..98f744f 100644 (file)
@@ -248,7 +248,6 @@ gst_splitmux_sink_init (GstSplitMuxSink * splitmux)
   splitmux->max_files = DEFAULT_MAX_FILES;
 
   GST_OBJECT_FLAG_SET (splitmux, GST_ELEMENT_FLAG_SINK);
-  g_object_set (splitmux, "async-handling", TRUE, NULL);
 }
 
 static void
@@ -776,6 +775,8 @@ static void
 start_next_fragment (GstSplitMuxSink * splitmux)
 {
   /* 1 change to new file */
+  splitmux->switching_fragment = TRUE;
+
   gst_element_set_locked_state (splitmux->muxer, TRUE);
   gst_element_set_locked_state (splitmux->active_sink, TRUE);
   gst_element_set_state (splitmux->muxer, GST_STATE_NULL);
@@ -788,6 +789,8 @@ start_next_fragment (GstSplitMuxSink * splitmux)
   gst_element_set_locked_state (splitmux->muxer, FALSE);
   gst_element_set_locked_state (splitmux->active_sink, FALSE);
 
+  splitmux->switching_fragment = FALSE;
+
   g_list_foreach (splitmux->contexts, (GFunc) restart_context, splitmux);
 
   /* Switch state and go back to processing */
@@ -839,6 +842,20 @@ bus_handler (GstBin * bin, GstMessage * message)
       }
       GST_SPLITMUX_UNLOCK (splitmux);
       break;
+    case GST_MESSAGE_ASYNC_START:
+    case GST_MESSAGE_ASYNC_DONE:
+      /* Ignore state changes from our children while switching */
+      if (splitmux->switching_fragment) {
+        if (GST_MESSAGE_SRC (message) == (GstObject *) splitmux->active_sink ||
+            GST_MESSAGE_SRC (message) == (GstObject *) splitmux->muxer) {
+          GST_LOG_OBJECT (splitmux,
+              "Ignoring state change from child %" GST_PTR_FORMAT
+              " while switching", GST_MESSAGE_SRC (message));
+          gst_message_unref (message);
+          return;
+        }
+      }
+      break;
     default:
       break;
   }
@@ -885,9 +902,9 @@ handle_gathered_gop (GstSplitMuxSink * splitmux)
    * either threshold? */
   if ((splitmux->have_muxed_something &&
           ((splitmux->threshold_bytes > 0 &&
-                  queued_bytes >= splitmux->threshold_bytes) ||
+                  queued_bytes > splitmux->threshold_bytes) ||
               (splitmux->threshold_time > 0 &&
-                  queued_time >= splitmux->threshold_time)))) {
+                  queued_time > splitmux->threshold_time)))) {
 
     splitmux->state = SPLITMUX_STATE_ENDING_FILE;
 
@@ -1122,8 +1139,7 @@ handle_mq_input (GstPad * pad, GstPadProbeInfo * info, MqStreamCtx * ctx)
    * stream */
   if (GST_CLOCK_TIME_IS_VALID (ts)) {
     GstClockTimeDiff running_time =
-        my_segment_to_running_time (&ctx->in_segment,
-        GST_BUFFER_TIMESTAMP (buf));
+        my_segment_to_running_time (&ctx->in_segment, ts);
 
     GST_LOG_OBJECT (pad, "Buffer running TS is %" GST_STIME_FORMAT,
         GST_STIME_ARGS (running_time));
@@ -1233,6 +1249,9 @@ handle_mq_input (GstPad * pad, GstPadProbeInfo * info, MqStreamCtx * ctx)
         GST_SPLITMUX_UNLOCK (splitmux);
         gst_pad_send_event (ctx->sinkpad, event);
         GST_SPLITMUX_LOCK (splitmux);
+        /* state may have changed while we were unlocked. Loop again if so */
+        if (splitmux->state != SPLITMUX_STATE_ENDING_FILE)
+          break;
         /* fallthrough */
       }
       case SPLITMUX_STATE_START_NEXT_FRAGMENT: