From f672116c7243a7c3d008b93b686d1e35ddc5b800 Mon Sep 17 00:00:00 2001 From: Jan Schmidt Date: Tue, 17 Jul 2018 00:03:19 +1000 Subject: [PATCH] splitmux: Improve handling of repeated timestamps When handling input with timestamps that repeat, sometimes splitmuxsink would get confused and ignore a keyframe. The logic in question is a holdover from before the cmd queue moved the file cutting to the multiqueue output side and made it deterministic, so it's no longer needed on the input here. https://bugzilla.gnome.org/show_bug.cgi?id=796773 --- gst/multifile/gstsplitmuxsink.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/gst/multifile/gstsplitmuxsink.c b/gst/multifile/gstsplitmuxsink.c index 5ccc13cff0..9ea3d20a0c 100644 --- a/gst/multifile/gstsplitmuxsink.c +++ b/gst/multifile/gstsplitmuxsink.c @@ -2277,14 +2277,19 @@ handle_mq_input (GstPad * pad, GstPadProbeInfo * info, MqStreamCtx * ctx) switch (splitmux->input_state) { case SPLITMUX_INPUT_STATE_COLLECTING_GOP_START: if (ctx->is_reference) { - /* If a keyframe, we have a complete GOP */ - if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT) || - !GST_CLOCK_STIME_IS_VALID (ctx->in_running_time) || - splitmux->max_in_running_time >= ctx->in_running_time) { - /* Pass this buffer through */ - loop_again = FALSE; + /* This is the reference context. If it's a keyframe, + * it marks the start of a new GOP and we should wait in + * check_completed_gop before continuing, but either way + * (keyframe or no, we'll pass this buffer through after + * so set loop_again to FALSE */ + loop_again = FALSE; + + if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT)) { /* Allow other input pads to catch up to here too */ splitmux->max_in_running_time = ctx->in_running_time; + GST_LOG_OBJECT (splitmux, + "Max in running time now %" GST_TIME_FORMAT, + GST_TIME_ARGS (splitmux->max_in_running_time)); GST_SPLITMUX_BROADCAST_INPUT (splitmux); break; } @@ -2294,6 +2299,8 @@ handle_mq_input (GstPad * pad, GstPadProbeInfo * info, MqStreamCtx * ctx) keyframe = TRUE; splitmux->input_state = SPLITMUX_INPUT_STATE_WAITING_GOP_COLLECT; splitmux->max_in_running_time = ctx->in_running_time; + GST_LOG_OBJECT (splitmux, "Max in running time now %" GST_TIME_FORMAT, + GST_TIME_ARGS (splitmux->max_in_running_time)); /* Wake up other input pads to collect this GOP */ GST_SPLITMUX_BROADCAST_INPUT (splitmux); check_completed_gop (splitmux, ctx);