From d7a9a844f6b0b42fe6a8976eded97c288019fa49 Mon Sep 17 00:00:00 2001 From: Jan Schmidt Date: Wed, 9 Dec 2020 00:40:52 +1100 Subject: [PATCH] splitmuxsink: Fix for 'reference bytes muxed' check. https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/798 introduced a check in the need-new-fragment logic to avoid starting a new fragment unless there has been some data on the reference stream, but the check is done against the number of bytes that have been received on the input, not the number that were released for output into the current fragment. Fix the check to remember and test against bytes that have been sent for output. This also fixes a problem where starting a new fragment fails to request a new filename from the format-location signal. Part-of: --- gst/multifile/gstsplitmuxsink.c | 27 ++++++++++++++++++++------- gst/multifile/gstsplitmuxsink.h | 3 +++ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/gst/multifile/gstsplitmuxsink.c b/gst/multifile/gstsplitmuxsink.c index ff0b5f9dd0..b6d7f18156 100644 --- a/gst/multifile/gstsplitmuxsink.c +++ b/gst/multifile/gstsplitmuxsink.c @@ -1321,8 +1321,13 @@ complete_or_wait_on_out (GstSplitMuxSink * splitmux, MqStreamCtx * ctx) grow_blocked_queues (splitmux); if (cmd->start_new_fragment) { - GST_DEBUG_OBJECT (splitmux, "Got cmd to start new fragment"); - splitmux->output_state = SPLITMUX_OUTPUT_STATE_ENDING_FILE; + if (splitmux->muxed_out_bytes > 0) { + GST_DEBUG_OBJECT (splitmux, "Got cmd to start new fragment"); + splitmux->output_state = SPLITMUX_OUTPUT_STATE_ENDING_FILE; + } else { + GST_DEBUG_OBJECT (splitmux, + "Got cmd to start new fragment, but fragment is empty - ignoring."); + } } else { GST_DEBUG_OBJECT (splitmux, "Got new output cmd for time %" GST_STIME_FORMAT, @@ -2019,9 +2024,7 @@ start_next_fragment (GstSplitMuxSink * splitmux, MqStreamCtx * ctx) } GST_SPLITMUX_LOCK (splitmux); - if (splitmux->muxed_out_bytes > 0 - || splitmux->fragment_id == splitmux->start_index) - set_next_filename (splitmux, ctx); + set_next_filename (splitmux, ctx); splitmux->muxed_out_bytes = 0; GST_SPLITMUX_UNLOCK (splitmux); @@ -2210,8 +2213,11 @@ need_new_fragment (GstSplitMuxSink * splitmux, /* Have we muxed at least one thing from the reference * stream into the file? If not, no other streams can have * either */ - if (splitmux->fragment_reference_bytes <= 0) + if (splitmux->fragment_reference_bytes <= 0) { + GST_TRACE_OBJECT (splitmux, + "Not ready to split - nothing muxed on the reference stream"); return FALSE; + } /* User told us to split now */ if (g_atomic_int_get (&(splitmux->do_split_next_gop)) == TRUE) { @@ -2234,6 +2240,10 @@ need_new_fragment (GstSplitMuxSink * splitmux, gst_queue_array_pop_head_struct (splitmux->times_to_split); ptr_to_time = gst_queue_array_peek_head_struct (splitmux->times_to_split); } + GST_TRACE_OBJECT (splitmux, + "GOP start time %" GST_STIME_FORMAT " is after requested split point %" + GST_STIME_FORMAT, GST_STIME_ARGS (splitmux->gop_start_time), + GST_STIME_ARGS (time_to_split)); GST_OBJECT_UNLOCK (splitmux); return TRUE; } @@ -2421,6 +2431,7 @@ handle_gathered_gop (GstSplitMuxSink * splitmux) /* Now either way - either there was no overflow, or we requested a new fragment: release this GOP */ splitmux->fragment_total_bytes += splitmux->gop_total_bytes; + splitmux->fragment_reference_bytes += splitmux->gop_reference_bytes; if (splitmux->gop_total_bytes > 0) { GST_LOG_OBJECT (splitmux, @@ -2440,6 +2451,7 @@ handle_gathered_gop (GstSplitMuxSink * splitmux) } splitmux->gop_total_bytes = 0; + splitmux->gop_reference_bytes = 0; return; error_gop_duration: @@ -2844,7 +2856,7 @@ handle_mq_input (GstPad * pad, GstPadProbeInfo * info, MqStreamCtx * ctx) /* Update total input byte counter for overflow detect */ splitmux->gop_total_bytes += buf_info->buf_size; if (ctx->is_reference) { - splitmux->fragment_reference_bytes += buf_info->buf_size; + splitmux->gop_reference_bytes += buf_info->buf_size; } /* Now add this buffer to the queue just before returning */ @@ -3542,6 +3554,7 @@ gst_splitmux_sink_reset (GstSplitMuxSink * splitmux) splitmux->fragment_total_bytes = 0; splitmux->fragment_reference_bytes = 0; splitmux->gop_total_bytes = 0; + splitmux->gop_reference_bytes = 0; splitmux->muxed_out_bytes = 0; splitmux->ready_for_output = FALSE; diff --git a/gst/multifile/gstsplitmuxsink.h b/gst/multifile/gstsplitmuxsink.h index f00d884bf0..14e4803b9c 100644 --- a/gst/multifile/gstsplitmuxsink.h +++ b/gst/multifile/gstsplitmuxsink.h @@ -156,6 +156,9 @@ struct _GstSplitMuxSink /* Number of bytes we've collected into * the GOP that's being collected */ guint64 gop_total_bytes; + /* Number of bytes from the reference context + * that we've collected into the current GOP */ + guint64 gop_reference_bytes; /* Start time of the current fragment */ GstClockTimeDiff fragment_start_time; /* Start time of the current GOP */