summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Schmidt <jan@centricular.com>2020-12-09 00:40:52 +1100
committerTim-Philipp Müller <tim@centricular.com>2020-12-14 09:57:15 +0000
commite09ac3d881c2a16f0ac9fa6dc82c79f1da611a3f (patch)
treeec98d8aa5af1bcb1fae089cbdd804a6043754a7a
parent9d46df77ed064244590478021c6b1d118eeddbd1 (diff)
downloadgstreamer-plugins-good-e09ac3d881c2a16f0ac9fa6dc82c79f1da611a3f.tar.gz
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: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/840>
-rw-r--r--gst/multifile/gstsplitmuxsink.c27
-rw-r--r--gst/multifile/gstsplitmuxsink.h3
2 files changed, 23 insertions, 7 deletions
diff --git a/gst/multifile/gstsplitmuxsink.c b/gst/multifile/gstsplitmuxsink.c
index ff0b5f9dd..b6d7f1815 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 f00d884bf..14e4803b9 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 */