From 3b32f53d7b647fceef94d520395925f190cb5b1c Mon Sep 17 00:00:00 2001 From: Jordan Yelloz Date: Tue, 18 Feb 2025 13:08:37 -0700 Subject: [PATCH] gstmediasourcetrackbuffer: Added method to wait until any new data The source buffer currently has a thread for each track that feeds the track with all data in the track buffer until EOS is reached. Each pass over the track buffer currently waits for the EOS to appear when it's done iterating the track buffer which is too restrictive. When the source buffer reaches the end of the track buffer, it should wait for any new data to be processed -- not just an EOS -- then check for cancellation if the deadline expires without new data. Part-of: --- .../gst/mse/gstmediasourcetrackbuffer-private.h | 2 +- .../gst-libs/gst/mse/gstmediasourcetrackbuffer.c | 11 ++++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/mse/gstmediasourcetrackbuffer-private.h b/subprojects/gst-plugins-bad/gst-libs/gst/mse/gstmediasourcetrackbuffer-private.h index 0d59ea97e1..a6beb1a0e4 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/mse/gstmediasourcetrackbuffer-private.h +++ b/subprojects/gst-plugins-bad/gst-libs/gst/mse/gstmediasourcetrackbuffer-private.h @@ -78,7 +78,7 @@ gboolean gst_media_source_track_buffer_is_eos ( GstMediaSourceTrackBuffer * self); GST_MSE_PRIVATE -gboolean gst_media_source_track_buffer_await_eos_until ( +void gst_media_source_track_buffer_await_new_data_until ( GstMediaSourceTrackBuffer * self, gint64 deadline); GST_MSE_PRIVATE diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/mse/gstmediasourcetrackbuffer.c b/subprojects/gst-plugins-bad/gst-libs/gst/mse/gstmediasourcetrackbuffer.c index 1ffdf1a64c..1ed9f3944a 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/mse/gstmediasourcetrackbuffer.c +++ b/subprojects/gst-plugins-bad/gst-libs/gst/mse/gstmediasourcetrackbuffer.c @@ -188,16 +188,13 @@ gst_media_source_track_buffer_is_eos (GstMediaSourceTrackBuffer * self) return is_eos (self); } -gboolean -gst_media_source_track_buffer_await_eos_until (GstMediaSourceTrackBuffer * self, - gint64 deadline) +void +gst_media_source_track_buffer_await_new_data_until (GstMediaSourceTrackBuffer * + self, gint64 deadline) { NEW_DATA_LOCK (self); - while (!is_eos (self) && NEW_DATA_WAIT_UNTIL (self, deadline)) { - /* wait */ - } + NEW_DATA_WAIT_UNTIL (self, deadline); NEW_DATA_UNLOCK (self); - return is_eos (self); } gint