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:
parent
e94830c79d
commit
75590bfeac
@ -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"/>
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user