https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4091 --- gst-plugins-good/gst/flv/gstflvmux.c +++ gst-plugins-good/gst/flv/gstflvmux.c @@ -2001,16 +2001,12 @@ break; } + if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_DTS_OR_PTS (buffer))) { + t = gst_flv_mux_segment_to_running_time (&apad->segment, + GST_BUFFER_DTS_OR_PTS (buffer)); + } - t = gst_flv_mux_segment_to_running_time (&apad->segment, - GST_BUFFER_DTS_OR_PTS (buffer)); + if (!GST_CLOCK_TIME_IS_VALID (best_ts) || - if (!GST_CLOCK_TIME_IS_VALID (t)) { - GST_WARNING_OBJECT (apad, "Buffer has no timestamp: %" GST_PTR_FORMAT, - buffer); - gst_object_replace ((GstObject **) & best, GST_OBJECT (apad)); - best_ts = GST_CLOCK_TIME_NONE; - done = TRUE; - } else if (!GST_CLOCK_TIME_IS_VALID (best_ts) || (GST_CLOCK_TIME_IS_VALID (t) && t < best_ts)) { gst_object_replace ((GstObject **) & best, GST_OBJECT (apad)); best_ts = t; @@ -2234,20 +2230,21 @@ gst_flv_mux_get_next_time (GstAggregator * aggregator) { GstFlvMux *mux = GST_FLV_MUX (aggregator); + GstAggregatorPad *agg_audio_pad = GST_AGGREGATOR_PAD_CAST (mux->audio_pad); + GstAggregatorPad *agg_video_pad = GST_AGGREGATOR_PAD_CAST (mux->video_pad); - GstFlvMuxPad *best = NULL; - GstClockTime best_time = GST_CLOCK_TIME_NONE; GST_OBJECT_LOCK (aggregator); if (mux->state == GST_FLV_MUX_STATE_HEADER && ((mux->audio_pad && mux->audio_pad->codec == G_MAXUINT) || (mux->video_pad && mux->video_pad->codec == G_MAXUINT))) goto wait_for_data; + + if (!((agg_audio_pad && gst_aggregator_pad_has_buffer (agg_audio_pad)) || + (agg_video_pad && gst_aggregator_pad_has_buffer (agg_video_pad)))) + goto wait_for_data; GST_OBJECT_UNLOCK (aggregator); + return gst_aggregator_simple_get_next_time (aggregator); - best = gst_flv_mux_find_best_pad (aggregator, &best_time, TRUE); - gst_clear_object (&best); - - return best_time; wait_for_data: GST_OBJECT_UNLOCK (aggregator);