mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-16 19:25:18 +00:00
nlecomposition: Use a message to check if we need an initialization seek
Subtimeline might be in an auxiliary pipeline which make the current recurse up approach not working. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5983>
This commit is contained in:
parent
37602d1d02
commit
79c211a5fb
1 changed files with 65 additions and 16 deletions
|
@ -45,6 +45,7 @@ GST_DEBUG_CATEGORY_STATIC (nlecomposition_debug);
|
||||||
#define _do_init \
|
#define _do_init \
|
||||||
GST_DEBUG_CATEGORY_INIT (nlecomposition_debug,"nlecomposition", GST_DEBUG_FG_BLUE | GST_DEBUG_BOLD, "NLE Composition");
|
GST_DEBUG_CATEGORY_INIT (nlecomposition_debug,"nlecomposition", GST_DEBUG_FG_BLUE | GST_DEBUG_BOLD, "NLE Composition");
|
||||||
#define nle_composition_parent_class parent_class
|
#define nle_composition_parent_class parent_class
|
||||||
|
#define QUERY_NEEDS_INITIALIZATION_SEEK_MESSAGE_STRUCT_NAME "nlecomposition-query-needs-initialization-seek"
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -214,6 +215,22 @@ struct _NleCompositionPrivate
|
||||||
|
|
||||||
#define ACTION_CALLBACK(__action) (((GCClosure*) (__action))->callback)
|
#define ACTION_CALLBACK(__action) (((GCClosure*) (__action))->callback)
|
||||||
|
|
||||||
|
#define QUERY_NEEDS_INITIALIZATION_SEEK_MESSAGE_STRUCT_NAME "nlecomposition-query-needs-initialization-seek"
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
GMutex lock;
|
||||||
|
gboolean needs_initialization_seek;
|
||||||
|
gboolean answered;
|
||||||
|
} NleCompositionQueryNeedsInitializationSeek;
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
|
#define NLE_TYPE_COMPOSITION_QUERY_NEEDS_INITIALIZATION_SEEK nle_composition_query_needs_initialization_seek_get_type ()
|
||||||
|
GType nle_composition_query_needs_initialization_seek_get_type (void) G_GNUC_CONST;
|
||||||
|
G_DEFINE_BOXED_TYPE (NleCompositionQueryNeedsInitializationSeek,
|
||||||
|
nle_composition_query_needs_initialization_seek,
|
||||||
|
g_atomic_rc_box_acquire, g_atomic_rc_box_release);
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
static guint _signals[LAST_SIGNAL] = { 0 };
|
static guint _signals[LAST_SIGNAL] = { 0 };
|
||||||
|
|
||||||
static GParamSpec *nleobject_properties[NLEOBJECT_PROP_LAST];
|
static GParamSpec *nleobject_properties[NLEOBJECT_PROP_LAST];
|
||||||
|
@ -1022,6 +1039,30 @@ nle_composition_handle_message (GstBin * bin, GstMessage * message)
|
||||||
GST_DEBUG_OBJECT (comp, "Dropping message %" GST_PTR_FORMAT " from "
|
GST_DEBUG_OBJECT (comp, "Dropping message %" GST_PTR_FORMAT " from "
|
||||||
"object being teared down to READY!", message);
|
"object being teared down to READY!", message);
|
||||||
goto drop;
|
goto drop;
|
||||||
|
} else if (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ELEMENT &&
|
||||||
|
GST_MESSAGE_SRC (message) != GST_OBJECT_CAST (comp)) {
|
||||||
|
const GstStructure *structure = gst_message_get_structure (message);
|
||||||
|
|
||||||
|
if (gst_structure_has_name (structure,
|
||||||
|
QUERY_NEEDS_INITIALIZATION_SEEK_MESSAGE_STRUCT_NAME)
|
||||||
|
&& GST_MESSAGE_SRC (message) != GST_OBJECT_CAST (comp)) {
|
||||||
|
NleCompositionQueryNeedsInitializationSeek *q;
|
||||||
|
|
||||||
|
gst_structure_get (structure, "query",
|
||||||
|
NLE_TYPE_COMPOSITION_QUERY_NEEDS_INITIALIZATION_SEEK, &q, NULL);
|
||||||
|
g_assert (q);
|
||||||
|
|
||||||
|
g_mutex_lock (&q->lock);
|
||||||
|
if (!q->answered || q->needs_initialization_seek) {
|
||||||
|
q->answered = TRUE;
|
||||||
|
q->needs_initialization_seek = priv->stack_initialization_seek == NULL;
|
||||||
|
}
|
||||||
|
g_mutex_unlock (&q->lock);
|
||||||
|
|
||||||
|
g_atomic_rc_box_release (q);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_BIN_CLASS (parent_class)->handle_message (bin, message);
|
GST_BIN_CLASS (parent_class)->handle_message (bin, message);
|
||||||
|
@ -1688,26 +1729,33 @@ get_new_seek_event (NleComposition * comp, gboolean initial,
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
nle_composition_needs_topelevel_initializing_seek (NleComposition * comp)
|
nle_composition_query_needs_topelevel_initializing_seek (NleComposition * comp)
|
||||||
{
|
{
|
||||||
GstObject *parent;
|
NleCompositionQueryNeedsInitializationSeek *q =
|
||||||
|
g_atomic_rc_box_new0 (NleCompositionQueryNeedsInitializationSeek);
|
||||||
|
|
||||||
parent = gst_object_get_parent (GST_OBJECT (comp));
|
GstMessage *m = gst_message_new_element (GST_OBJECT_CAST (comp),
|
||||||
while (parent) {
|
gst_structure_new (QUERY_NEEDS_INITIALIZATION_SEEK_MESSAGE_STRUCT_NAME,
|
||||||
if (NLE_IS_COMPOSITION (parent)
|
"query", NLE_TYPE_COMPOSITION_QUERY_NEEDS_INITIALIZATION_SEEK, q,
|
||||||
&& NLE_COMPOSITION (parent)->priv->stack_initialization_seek) {
|
NULL)
|
||||||
gst_object_unref (parent);
|
);
|
||||||
GST_INFO_OBJECT (comp,
|
|
||||||
"Not sending an initializing seek as %" GST_PTR_FORMAT
|
|
||||||
"is gonna seek anyway!", parent);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_object_unref (parent);
|
if (!gst_element_post_message (GST_ELEMENT (comp), m)) {
|
||||||
parent = gst_object_get_parent (parent);
|
GST_WARNING_OBJECT (comp, "Querying needs_initialization_seek failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
gboolean res = TRUE;
|
||||||
|
g_mutex_lock (&q->lock);
|
||||||
|
if (q->answered) {
|
||||||
|
res = q->needs_initialization_seek;
|
||||||
|
if (!res) {
|
||||||
|
GST_INFO_OBJECT (comp, "Parent composition is going to seek us");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g_mutex_unlock (&q->lock);
|
||||||
|
g_atomic_rc_box_release (q);
|
||||||
|
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstClockTime
|
static GstClockTime
|
||||||
|
@ -3424,7 +3472,8 @@ update_pipeline (NleComposition * comp, GstClockTime currenttime, gint32 seqnum,
|
||||||
* per level of nesting)
|
* per level of nesting)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (tear_down && !nle_composition_needs_topelevel_initializing_seek (comp))
|
if (tear_down
|
||||||
|
&& !nle_composition_query_needs_topelevel_initializing_seek (comp))
|
||||||
gst_clear_event (&toplevel_seek);
|
gst_clear_event (&toplevel_seek);
|
||||||
|
|
||||||
if (toplevel_seek) {
|
if (toplevel_seek) {
|
||||||
|
|
Loading…
Reference in a new issue