aggregator: implement start-time-selection=now

This is actually the only correct mode when live, let's at least expose
an option for it.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9394>
This commit is contained in:
Mathieu Duponchelle 2025-07-14 20:05:34 +02:00 committed by Sebastian Dröge
parent e94830c79d
commit 75590bfeac
3 changed files with 27 additions and 4 deletions

View File

@ -2616,6 +2616,9 @@ the first buffer that is received.</doc>
<doc xml:space="preserve" filename="../subprojects/gstreamer/libs/gst/base/gstaggregator.h">Start at the running time
selected by the `start-time` property.</doc>
</member>
<member name="now" value="3" c:identifier="GST_AGGREGATOR_START_TIME_SELECTION_NOW" version="1.28" glib:nick="now" glib:name="GST_AGGREGATOR_START_TIME_SELECTION_NOW">
<doc xml:space="preserve" filename="../subprojects/gstreamer/libs/gst/base/gstaggregator.h">Start at the current running time when reaching %GST_STATE_PLAYING.</doc>
</member>
</enumeration>
<function-macro name="BASE_DEPRECATED_FOR" c:identifier="GST_BASE_DEPRECATED_FOR" introspectable="0">
<source-position filename="../subprojects/gstreamer/libs/gst/base/base-prelude.h"/>

View File

@ -125,6 +125,8 @@ gst_aggregator_start_time_selection_get_type (void)
"GST_AGGREGATOR_START_TIME_SELECTION_FIRST", "first"},
{GST_AGGREGATOR_START_TIME_SELECTION_SET,
"GST_AGGREGATOR_START_TIME_SELECTION_SET", "set"},
{GST_AGGREGATOR_START_TIME_SELECTION_NOW,
"GST_AGGREGATOR_START_TIME_SELECTION_NOW", "now"},
{0, NULL, NULL}
};
GType new_type =
@ -886,9 +888,12 @@ gst_aggregator_wait_and_check (GstAggregator * self, gboolean * timeout)
return FALSE;
}
if (self->priv->force_live && self->priv->first_buffer
&& self->priv->start_time_selection ==
GST_AGGREGATOR_START_TIME_SELECTION_FIRST) {
if ((self->priv->force_live && self->priv->first_buffer
&& self->priv->start_time_selection ==
GST_AGGREGATOR_START_TIME_SELECTION_FIRST) ||
(self->priv->start_time_selection ==
GST_AGGREGATOR_START_TIME_SELECTION_NOW
&& self->priv->first_buffer)) {
GstClockTime start_time;
GstAggregatorPad *srcpad = GST_AGGREGATOR_PAD (self->srcpad);
start_time = gst_element_get_current_running_time (GST_ELEMENT (self));
@ -905,6 +910,7 @@ gst_aggregator_wait_and_check (GstAggregator * self, gboolean * timeout)
}
}
start = gst_aggregator_get_next_time (self);
/* If we're not live, or if we use the running time
@ -3423,6 +3429,9 @@ gst_aggregator_pad_chain_internal (GstAggregator * self,
if (start_time == -1)
start_time = 0;
break;
case GST_AGGREGATOR_START_TIME_SELECTION_NOW:
start_time = gst_element_get_current_running_time (GST_ELEMENT (self));
break;
}
if (start_time != -1) {

View File

@ -452,6 +452,8 @@ void gst_aggregator_set_force_live (GstAggregator *self,
* the first buffer that is received.
* @GST_AGGREGATOR_START_TIME_SELECTION_SET: Start at the running time
* selected by the `start-time` property.
* @GST_AGGREGATOR_START_TIME_SELECTION_NOW: Start at the current running time
* when reaching %GST_STATE_PLAYING.
*
* Since: 1.18
*/
@ -459,7 +461,16 @@ typedef enum
{
GST_AGGREGATOR_START_TIME_SELECTION_ZERO,
GST_AGGREGATOR_START_TIME_SELECTION_FIRST,
GST_AGGREGATOR_START_TIME_SELECTION_SET
GST_AGGREGATOR_START_TIME_SELECTION_SET,
/**
* GST_AGGREGATOR_START_TIME_SELECTION_NOW:
*
* Start at the current running time when reaching %GST_STATE_PLAYING.
*
* Since: 1.28
*/
GST_AGGREGATOR_START_TIME_SELECTION_NOW,
} GstAggregatorStartTimeSelection;
GST_BASE_API