mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-09-29 07:12:36 +00:00
audio/video aggregator: make use of new aggregator inactive pad API
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/867>
This commit is contained in:
parent
f829ed3313
commit
c3d878e990
4 changed files with 93 additions and 0 deletions
|
@ -1875,6 +1875,18 @@
|
||||||
"type": "GstCompositorBackground",
|
"type": "GstCompositorBackground",
|
||||||
"writable": true
|
"writable": true
|
||||||
},
|
},
|
||||||
|
"ignore-inactive-pads": {
|
||||||
|
"blurb": "Avoid timing out waiting for inactive pads",
|
||||||
|
"conditionally-available": false,
|
||||||
|
"construct": false,
|
||||||
|
"construct-only": false,
|
||||||
|
"controllable": false,
|
||||||
|
"default": "false",
|
||||||
|
"mutable": "null",
|
||||||
|
"readable": true,
|
||||||
|
"type": "gboolean",
|
||||||
|
"writable": true
|
||||||
|
},
|
||||||
"max-threads": {
|
"max-threads": {
|
||||||
"blurb": "Maximum number of blending/rendering worker threads to spawn (0 = auto)",
|
"blurb": "Maximum number of blending/rendering worker threads to spawn (0 = auto)",
|
||||||
"conditionally-available": false,
|
"conditionally-available": false,
|
||||||
|
|
|
@ -537,6 +537,7 @@ enum
|
||||||
PROP_ALIGNMENT_THRESHOLD,
|
PROP_ALIGNMENT_THRESHOLD,
|
||||||
PROP_DISCONT_WAIT,
|
PROP_DISCONT_WAIT,
|
||||||
PROP_OUTPUT_BUFFER_DURATION_FRACTION,
|
PROP_OUTPUT_BUFFER_DURATION_FRACTION,
|
||||||
|
PROP_IGNORE_INACTIVE_PADS,
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GstAudioAggregator, gst_audio_aggregator,
|
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GstAudioAggregator, gst_audio_aggregator,
|
||||||
|
@ -697,6 +698,27 @@ gst_audio_aggregator_class_init (GstAudioAggregatorClass * klass)
|
||||||
"Window of time in nanoseconds to wait before "
|
"Window of time in nanoseconds to wait before "
|
||||||
"creating a discontinuity", 0,
|
"creating a discontinuity", 0,
|
||||||
G_MAXUINT64 - 1, DEFAULT_DISCONT_WAIT,
|
G_MAXUINT64 - 1, DEFAULT_DISCONT_WAIT,
|
||||||
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
|
||||||
|
GST_PARAM_MUTABLE_PLAYING));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GstAudioAggregator:ignore-inactive-pads:
|
||||||
|
*
|
||||||
|
* Don't wait for inactive pads when live. An inactive pad
|
||||||
|
* is a pad that hasn't yet received a buffer, but that has
|
||||||
|
* been waited on at least once.
|
||||||
|
*
|
||||||
|
* The purpose of this property is to avoid aggregating on
|
||||||
|
* timeout when new pads are requested in advance of receiving
|
||||||
|
* data flow, for example the user may decide to connect it later,
|
||||||
|
* but wants to configure it already.
|
||||||
|
*
|
||||||
|
* Since: 1.20
|
||||||
|
*/
|
||||||
|
g_object_class_install_property (gobject_class,
|
||||||
|
PROP_IGNORE_INACTIVE_PADS, g_param_spec_boolean ("ignore-inactive-pads",
|
||||||
|
"Ignore inactive pads",
|
||||||
|
"Avoid timing out waiting for inactive pads", FALSE,
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -763,6 +785,10 @@ gst_audio_aggregator_set_property (GObject * object, guint prop_id,
|
||||||
g_object_notify (object, "output-buffer-duration");
|
g_object_notify (object, "output-buffer-duration");
|
||||||
gst_audio_aggregator_recalculate_latency (aagg);
|
gst_audio_aggregator_recalculate_latency (aagg);
|
||||||
break;
|
break;
|
||||||
|
case PROP_IGNORE_INACTIVE_PADS:
|
||||||
|
gst_aggregator_set_ignore_inactive_pads (GST_AGGREGATOR (object),
|
||||||
|
g_value_get_boolean (value));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -791,6 +817,10 @@ gst_audio_aggregator_get_property (GObject * object, guint prop_id,
|
||||||
gst_value_set_fraction (value, aagg->priv->output_buffer_duration_n,
|
gst_value_set_fraction (value, aagg->priv->output_buffer_duration_n,
|
||||||
aagg->priv->output_buffer_duration_d);
|
aagg->priv->output_buffer_duration_d);
|
||||||
break;
|
break;
|
||||||
|
case PROP_IGNORE_INACTIVE_PADS:
|
||||||
|
g_value_set_boolean (value,
|
||||||
|
gst_aggregator_get_ignore_inactive_pads (GST_AGGREGATOR (object)));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -2271,6 +2301,9 @@ gst_audio_aggregator_aggregate (GstAggregator * agg, gboolean timeout)
|
||||||
gboolean pad_eos = gst_aggregator_pad_is_eos (aggpad);
|
gboolean pad_eos = gst_aggregator_pad_is_eos (aggpad);
|
||||||
GstBuffer *input_buffer;
|
GstBuffer *input_buffer;
|
||||||
|
|
||||||
|
if (gst_aggregator_pad_is_inactive (aggpad))
|
||||||
|
continue;
|
||||||
|
|
||||||
if (!pad_eos)
|
if (!pad_eos)
|
||||||
is_eos = FALSE;
|
is_eos = FALSE;
|
||||||
|
|
||||||
|
@ -2381,6 +2414,9 @@ gst_audio_aggregator_aggregate (GstAggregator * agg, gboolean timeout)
|
||||||
GstAudioAggregatorPad *pad = (GstAudioAggregatorPad *) iter->data;
|
GstAudioAggregatorPad *pad = (GstAudioAggregatorPad *) iter->data;
|
||||||
GstAggregatorPad *aggpad = (GstAggregatorPad *) iter->data;
|
GstAggregatorPad *aggpad = (GstAggregatorPad *) iter->data;
|
||||||
|
|
||||||
|
if (gst_aggregator_pad_is_inactive (aggpad))
|
||||||
|
continue;
|
||||||
|
|
||||||
GST_OBJECT_LOCK (pad);
|
GST_OBJECT_LOCK (pad);
|
||||||
|
|
||||||
if (pad->priv->buffer && pad->priv->output_offset >= aagg->priv->offset
|
if (pad->priv->buffer && pad->priv->output_offset >= aagg->priv->offset
|
||||||
|
@ -2432,6 +2468,9 @@ gst_audio_aggregator_aggregate (GstAggregator * agg, gboolean timeout)
|
||||||
for (iter = GST_ELEMENT (agg)->sinkpads; iter; iter = iter->next) {
|
for (iter = GST_ELEMENT (agg)->sinkpads; iter; iter = iter->next) {
|
||||||
GstAudioAggregatorPad *pad = GST_AUDIO_AGGREGATOR_PAD (iter->data);
|
GstAudioAggregatorPad *pad = GST_AUDIO_AGGREGATOR_PAD (iter->data);
|
||||||
|
|
||||||
|
if (gst_aggregator_pad_is_inactive (GST_AGGREGATOR_PAD (pad)))
|
||||||
|
continue;
|
||||||
|
|
||||||
max_offset = MAX ((gint64) max_offset, (gint64) pad->priv->output_offset);
|
max_offset = MAX ((gint64) max_offset, (gint64) pad->priv->output_offset);
|
||||||
}
|
}
|
||||||
GST_OBJECT_UNLOCK (agg);
|
GST_OBJECT_UNLOCK (agg);
|
||||||
|
|
|
@ -1745,6 +1745,10 @@ gst_video_aggregator_fill_queues (GstVideoAggregator * vagg,
|
||||||
gboolean is_eos;
|
gboolean is_eos;
|
||||||
|
|
||||||
bpad = GST_AGGREGATOR_PAD (pad);
|
bpad = GST_AGGREGATOR_PAD (pad);
|
||||||
|
|
||||||
|
if (gst_aggregator_pad_is_inactive (bpad))
|
||||||
|
continue;
|
||||||
|
|
||||||
GST_OBJECT_LOCK (bpad);
|
GST_OBJECT_LOCK (bpad);
|
||||||
segment = bpad->segment;
|
segment = bpad->segment;
|
||||||
GST_OBJECT_UNLOCK (bpad);
|
GST_OBJECT_UNLOCK (bpad);
|
||||||
|
|
|
@ -544,6 +544,9 @@ gst_compositor_pad_prepare_frame_start (GstVideoAggregatorPad * pad,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (gst_aggregator_pad_is_inactive (GST_AGGREGATOR_PAD (pad)))
|
||||||
|
return;
|
||||||
|
|
||||||
frame_rect = clamp_rectangle (cpad->xpos + cpad->x_offset,
|
frame_rect = clamp_rectangle (cpad->xpos + cpad->x_offset,
|
||||||
cpad->ypos + cpad->y_offset, width, height,
|
cpad->ypos + cpad->y_offset, width, height,
|
||||||
GST_VIDEO_INFO_WIDTH (&vagg->info), GST_VIDEO_INFO_HEIGHT (&vagg->info));
|
GST_VIDEO_INFO_WIDTH (&vagg->info), GST_VIDEO_INFO_HEIGHT (&vagg->info));
|
||||||
|
@ -709,6 +712,7 @@ enum
|
||||||
PROP_BACKGROUND,
|
PROP_BACKGROUND,
|
||||||
PROP_ZERO_SIZE_IS_UNSCALED,
|
PROP_ZERO_SIZE_IS_UNSCALED,
|
||||||
PROP_MAX_THREADS,
|
PROP_MAX_THREADS,
|
||||||
|
PROP_IGNORE_INACTIVE_PADS,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -727,6 +731,10 @@ gst_compositor_get_property (GObject * object,
|
||||||
case PROP_MAX_THREADS:
|
case PROP_MAX_THREADS:
|
||||||
g_value_set_uint (value, self->max_threads);
|
g_value_set_uint (value, self->max_threads);
|
||||||
break;
|
break;
|
||||||
|
case PROP_IGNORE_INACTIVE_PADS:
|
||||||
|
g_value_set_boolean (value,
|
||||||
|
gst_aggregator_get_ignore_inactive_pads (GST_AGGREGATOR (object)));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -749,6 +757,10 @@ gst_compositor_set_property (GObject * object,
|
||||||
case PROP_MAX_THREADS:
|
case PROP_MAX_THREADS:
|
||||||
self->max_threads = g_value_get_uint (value);
|
self->max_threads = g_value_get_uint (value);
|
||||||
break;
|
break;
|
||||||
|
case PROP_IGNORE_INACTIVE_PADS:
|
||||||
|
gst_aggregator_set_ignore_inactive_pads (GST_AGGREGATOR (object),
|
||||||
|
g_value_get_boolean (value));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -968,6 +980,9 @@ _fixate_caps (GstAggregator * agg, GstCaps * caps)
|
||||||
gint x_offset;
|
gint x_offset;
|
||||||
gint y_offset;
|
gint y_offset;
|
||||||
|
|
||||||
|
if (gst_aggregator_pad_is_inactive (GST_AGGREGATOR_PAD (vaggpad)))
|
||||||
|
continue;
|
||||||
|
|
||||||
fps_n = GST_VIDEO_INFO_FPS_N (&vaggpad->info);
|
fps_n = GST_VIDEO_INFO_FPS_N (&vaggpad->info);
|
||||||
fps_d = GST_VIDEO_INFO_FPS_D (&vaggpad->info);
|
fps_d = GST_VIDEO_INFO_FPS_D (&vaggpad->info);
|
||||||
_mixer_pad_get_output_size (GST_COMPOSITOR (vagg), compositor_pad, par_n,
|
_mixer_pad_get_output_size (GST_COMPOSITOR (vagg), compositor_pad, par_n,
|
||||||
|
@ -1217,6 +1232,9 @@ _should_draw_background (GstVideoAggregator * vagg)
|
||||||
/* Check if the background is completely obscured by a pad
|
/* Check if the background is completely obscured by a pad
|
||||||
* TODO: Also skip if it's obscured by a combination of pads */
|
* TODO: Also skip if it's obscured by a combination of pads */
|
||||||
for (l = GST_ELEMENT (vagg)->sinkpads; l; l = l->next) {
|
for (l = GST_ELEMENT (vagg)->sinkpads; l; l = l->next) {
|
||||||
|
if (gst_aggregator_pad_is_inactive (GST_AGGREGATOR_PAD (l->data)))
|
||||||
|
continue;
|
||||||
|
|
||||||
if (_pad_obscures_rectangle (vagg, l->data, bg_rect)) {
|
if (_pad_obscures_rectangle (vagg, l->data, bg_rect)) {
|
||||||
draw = FALSE;
|
draw = FALSE;
|
||||||
break;
|
break;
|
||||||
|
@ -1611,6 +1629,26 @@ gst_compositor_class_init (GstCompositorClass * klass)
|
||||||
"Composite multiple video streams", "Wim Taymans <wim@fluendo.com>, "
|
"Composite multiple video streams", "Wim Taymans <wim@fluendo.com>, "
|
||||||
"Sebastian Dröge <sebastian.droege@collabora.co.uk>");
|
"Sebastian Dröge <sebastian.droege@collabora.co.uk>");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* compositor:ignore-inactive-pads:
|
||||||
|
*
|
||||||
|
* Don't wait for inactive pads when live. An inactive pad
|
||||||
|
* is a pad that hasn't yet received a buffer, but that has
|
||||||
|
* been waited on at least once.
|
||||||
|
*
|
||||||
|
* The purpose of this property is to avoid aggregating on
|
||||||
|
* timeout when new pads are requested in advance of receiving
|
||||||
|
* data flow, for example the user may decide to connect it later,
|
||||||
|
* but wants to configure it already.
|
||||||
|
*
|
||||||
|
* Since: 1.20
|
||||||
|
*/
|
||||||
|
g_object_class_install_property (gobject_class,
|
||||||
|
PROP_IGNORE_INACTIVE_PADS, g_param_spec_boolean ("ignore-inactive-pads",
|
||||||
|
"Ignore inactive pads",
|
||||||
|
"Avoid timing out waiting for inactive pads", FALSE,
|
||||||
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
|
||||||
gst_type_mark_as_plugin_api (GST_TYPE_COMPOSITOR_PAD, 0);
|
gst_type_mark_as_plugin_api (GST_TYPE_COMPOSITOR_PAD, 0);
|
||||||
gst_type_mark_as_plugin_api (GST_TYPE_COMPOSITOR_OPERATOR, 0);
|
gst_type_mark_as_plugin_api (GST_TYPE_COMPOSITOR_OPERATOR, 0);
|
||||||
gst_type_mark_as_plugin_api (GST_TYPE_COMPOSITOR_BACKGROUND, 0);
|
gst_type_mark_as_plugin_api (GST_TYPE_COMPOSITOR_BACKGROUND, 0);
|
||||||
|
|
Loading…
Reference in a new issue