mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-25 11:11:08 +00:00
nlecomposition: Let parent compositions tell if they will send initialization seeks
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5035>
This commit is contained in:
parent
daa1519e3d
commit
63ce3c8da6
8 changed files with 108 additions and 9 deletions
|
@ -219,7 +219,6 @@ typedef struct
|
||||||
{
|
{
|
||||||
GMutex lock;
|
GMutex lock;
|
||||||
gboolean needs_initialization_seek;
|
gboolean needs_initialization_seek;
|
||||||
gboolean answered;
|
|
||||||
} NleCompositionQueryNeedsInitializationSeek;
|
} NleCompositionQueryNeedsInitializationSeek;
|
||||||
|
|
||||||
/* *INDENT-OFF* */
|
/* *INDENT-OFF* */
|
||||||
|
@ -1063,13 +1062,15 @@ nle_composition_handle_message (GstBin * bin, GstMessage * message)
|
||||||
&& GST_MESSAGE_SRC (message) != GST_OBJECT_CAST (comp)) {
|
&& GST_MESSAGE_SRC (message) != GST_OBJECT_CAST (comp)) {
|
||||||
NleCompositionQueryNeedsInitializationSeek *q;
|
NleCompositionQueryNeedsInitializationSeek *q;
|
||||||
|
|
||||||
|
/* First let parents answer */
|
||||||
|
GST_BIN_CLASS (parent_class)->handle_message (bin, message);
|
||||||
|
|
||||||
gst_structure_get (structure, "query",
|
gst_structure_get (structure, "query",
|
||||||
NLE_TYPE_COMPOSITION_QUERY_NEEDS_INITIALIZATION_SEEK, &q, NULL);
|
NLE_TYPE_COMPOSITION_QUERY_NEEDS_INITIALIZATION_SEEK, &q, NULL);
|
||||||
g_assert (q);
|
g_assert (q);
|
||||||
|
|
||||||
g_mutex_lock (&q->lock);
|
g_mutex_lock (&q->lock);
|
||||||
if (!q->answered || q->needs_initialization_seek) {
|
if (q->needs_initialization_seek) {
|
||||||
q->answered = TRUE;
|
|
||||||
q->needs_initialization_seek = priv->stack_initialization_seek == NULL;
|
q->needs_initialization_seek = priv->stack_initialization_seek == NULL;
|
||||||
}
|
}
|
||||||
g_mutex_unlock (&q->lock);
|
g_mutex_unlock (&q->lock);
|
||||||
|
@ -1781,6 +1782,7 @@ nle_composition_query_needs_topelevel_initializing_seek (NleComposition * comp)
|
||||||
{
|
{
|
||||||
NleCompositionQueryNeedsInitializationSeek *q =
|
NleCompositionQueryNeedsInitializationSeek *q =
|
||||||
g_atomic_rc_box_new0 (NleCompositionQueryNeedsInitializationSeek);
|
g_atomic_rc_box_new0 (NleCompositionQueryNeedsInitializationSeek);
|
||||||
|
q->needs_initialization_seek = TRUE;
|
||||||
|
|
||||||
GstMessage *m = gst_message_new_element (GST_OBJECT_CAST (comp),
|
GstMessage *m = gst_message_new_element (GST_OBJECT_CAST (comp),
|
||||||
gst_structure_new (QUERY_NEEDS_INITIALIZATION_SEEK_MESSAGE_STRUCT_NAME,
|
gst_structure_new (QUERY_NEEDS_INITIALIZATION_SEEK_MESSAGE_STRUCT_NAME,
|
||||||
|
@ -1794,12 +1796,7 @@ nle_composition_query_needs_topelevel_initializing_seek (NleComposition * comp)
|
||||||
|
|
||||||
gboolean res = TRUE;
|
gboolean res = TRUE;
|
||||||
g_mutex_lock (&q->lock);
|
g_mutex_lock (&q->lock);
|
||||||
if (q->answered) {
|
res = q->needs_initialization_seek;
|
||||||
res = q->needs_initialization_seek;
|
|
||||||
if (!res) {
|
|
||||||
GST_INFO_OBJECT (comp, "Parent composition is going to seek us");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
g_mutex_unlock (&q->lock);
|
g_mutex_unlock (&q->lock);
|
||||||
g_atomic_rc_box_release (q);
|
g_atomic_rc_box_release (q);
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@ endif
|
||||||
tests = [
|
tests = [
|
||||||
'nle/simple_source_playback',
|
'nle/simple_source_playback',
|
||||||
'nle/simple_source_in_composition_playback',
|
'nle/simple_source_in_composition_playback',
|
||||||
|
'nle/ensure_no_unnecessary_stack_init_seeks',
|
||||||
]
|
]
|
||||||
|
|
||||||
env = environment()
|
env = environment()
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
# Sets up 3 levels of nested composition and verify the dataflow.
|
||||||
|
# This allows us to verify that we do not end up seeking nested
|
||||||
|
# timelines unnecessarily.
|
||||||
|
meta,
|
||||||
|
handles-states=true,
|
||||||
|
ignore-eos=true,
|
||||||
|
args={
|
||||||
|
"nlecomposition name=compo ! video/x-raw,format=(string)YUY2,framerate=(fraction)30/1,height=(int)240,interlace-mode=(string)progressive, multiview-mode=(string)mono, pixel-aspect-ratio=(fraction)1/1, width=(int)320 ! videoconvert ! $(videosink)",
|
||||||
|
},
|
||||||
|
configs = {
|
||||||
|
"$(validateflow), pad=overlay:src, buffers-checksum=as-id, ignored-event-types={ tag }, ignored-fields = \"buffer={meta}\"",
|
||||||
|
"$(validateflow), pad=source_L0:src, buffers-checksum=as-id, ignored-event-types={ tag }",
|
||||||
|
"$(validateflow), pad=source_L1:src, buffers-checksum=as-id, ignored-event-types={ tag }",
|
||||||
|
"$(validateflow), pad=source_L2:src, buffers-checksum=as-id, ignored-event-types={ tag }",
|
||||||
|
"$(validateflow), pad=source_L3:src, buffers-checksum=as-id, ignored-event-types={ tag }",
|
||||||
|
}
|
||||||
|
|
||||||
|
nle-add-child, object-name="compo", desc="nlesource name=source_L0 inpoint=0 duration=200000000"
|
||||||
|
nle-add-child, object-name="source_L0", desc="nlecomposition name=compo_L1"
|
||||||
|
nle-add-child, object-name="compo_L1", desc="nlesource name=source_L1 inpoint=0 duration=200000000"
|
||||||
|
nle-add-child, object-name="source_L1", desc="nlecomposition name=compo_L2"
|
||||||
|
nle-add-child, object-name="compo_L2", desc="nlesource name=source_L2 inpoint=0 duration=200000000"
|
||||||
|
nle-add-child, object-name="source_L2", desc="nlecomposition name=compo_L3"
|
||||||
|
nle-add-child, object-name="compo_L3", desc="nlesource name=source_L3 inpoint=200000000 duration=200000000"
|
||||||
|
nle-add-child, object-name="source_L3", desc="videotestsrc ! timeoverlay name=overlay"
|
||||||
|
|
||||||
|
play
|
||||||
|
check-position, on-message=eos, expected-position=0.2
|
||||||
|
|
||||||
|
stop
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
event stream-start: GstEventStreamStart, flags=(GstStreamFlags)GST_STREAM_FLAG_NONE, group-id=(uint)1;
|
||||||
|
event caps: video/x-raw, format=(string)YUY2, framerate=(fraction)30/1, height=(int)240, interlace-mode=(string)progressive, multiview-mode=(string)mono, pixel-aspect-ratio=(fraction)1/1, width=(int)320;
|
||||||
|
event flush-start: (no structure)
|
||||||
|
event flush-stop: GstEventFlushStop, reset-time=(boolean)true;
|
||||||
|
event segment: format=TIME, start=0:00:00.200000000, offset=0:00:00.000000000, stop=0:00:00.400000000, flags=0x01, time=0:00:00.200000000, base=0:00:00.000000000, position=0:00:00.200000000
|
||||||
|
buffer: content-id=0, pts=0:00:00.200000000, dur=0:00:00.033333333, flags=discont
|
||||||
|
buffer: content-id=1, pts=0:00:00.233333333, dur=0:00:00.033333333
|
||||||
|
buffer: content-id=2, pts=0:00:00.266666666, dur=0:00:00.033333334
|
||||||
|
buffer: content-id=3, pts=0:00:00.300000000, dur=0:00:00.033333333
|
||||||
|
buffer: content-id=4, pts=0:00:00.333333333, dur=0:00:00.033333333
|
||||||
|
buffer: content-id=5, pts=0:00:00.366666666, dur=0:00:00.033333334
|
||||||
|
event eos: (no structure)
|
|
@ -0,0 +1,16 @@
|
||||||
|
event stream-start: GstEventStreamStart, flags=(GstStreamFlags)GST_STREAM_FLAG_NONE;
|
||||||
|
event caps: video/x-raw, format=(string)YUY2, framerate=(fraction)30/1, height=(int)240, interlace-mode=(string)progressive, multiview-mode=(string)mono, pixel-aspect-ratio=(fraction)1/1, width=(int)320;
|
||||||
|
event caps: video/x-raw, format=(string)YUY2, framerate=(fraction)30/1, height=(int)240, interlace-mode=(string)progressive, multiview-mode=(string)mono, pixel-aspect-ratio=(fraction)1/1, width=(int)320;
|
||||||
|
event flush-start: (no structure)
|
||||||
|
event flush-stop: GstEventFlushStop, reset-time=(boolean)true;
|
||||||
|
event caps: video/x-raw, format=(string)YUY2, framerate=(fraction)30/1, height=(int)240, interlace-mode=(string)progressive, multiview-mode=(string)mono, pixel-aspect-ratio=(fraction)1/1, width=(int)320;
|
||||||
|
event segment: format=TIME, start=0:00:00.200000000, offset=0:00:00.000000000, stop=0:00:00.400000000, flags=0x01, time=0:00:00.000000000, base=0:00:00.000000000, position=0:00:00.200000000
|
||||||
|
buffer: content-id=0, pts=0:00:00.200000000, dur=0:00:00.033333333, flags=discont
|
||||||
|
buffer: content-id=1, pts=0:00:00.233333333, dur=0:00:00.033333333
|
||||||
|
buffer: content-id=2, pts=0:00:00.266666666, dur=0:00:00.033333334
|
||||||
|
buffer: content-id=3, pts=0:00:00.300000000, dur=0:00:00.033333333
|
||||||
|
buffer: content-id=4, pts=0:00:00.333333333, dur=0:00:00.033333333
|
||||||
|
buffer: content-id=5, pts=0:00:00.366666666, dur=0:00:00.033333334
|
||||||
|
event eos: (no structure)
|
||||||
|
event flush-start: (no structure)
|
||||||
|
event flush-stop: GstEventFlushStop, reset-time=(boolean)true;
|
|
@ -0,0 +1,14 @@
|
||||||
|
event stream-start: GstEventStreamStart, flags=(GstStreamFlags)GST_STREAM_FLAG_NONE;
|
||||||
|
event caps: video/x-raw, format=(string)YUY2, framerate=(fraction)30/1, height=(int)240, interlace-mode=(string)progressive, multiview-mode=(string)mono, pixel-aspect-ratio=(fraction)1/1, width=(int)320;
|
||||||
|
event flush-start: (no structure)
|
||||||
|
event flush-stop: GstEventFlushStop, reset-time=(boolean)true;
|
||||||
|
event segment: format=TIME, start=0:00:00.200000000, offset=0:00:00.000000000, stop=0:00:00.400000000, flags=0x01, time=0:00:00.000000000, base=0:00:00.000000000, position=0:00:00.200000000
|
||||||
|
buffer: content-id=0, pts=0:00:00.200000000, dur=0:00:00.033333333, flags=discont
|
||||||
|
buffer: content-id=1, pts=0:00:00.233333333, dur=0:00:00.033333333
|
||||||
|
buffer: content-id=2, pts=0:00:00.266666666, dur=0:00:00.033333334
|
||||||
|
buffer: content-id=3, pts=0:00:00.300000000, dur=0:00:00.033333333
|
||||||
|
buffer: content-id=4, pts=0:00:00.333333333, dur=0:00:00.033333333
|
||||||
|
buffer: content-id=5, pts=0:00:00.366666666, dur=0:00:00.033333334
|
||||||
|
event eos: (no structure)
|
||||||
|
event flush-start: (no structure)
|
||||||
|
event flush-stop: GstEventFlushStop, reset-time=(boolean)true;
|
|
@ -0,0 +1,14 @@
|
||||||
|
event stream-start: GstEventStreamStart, flags=(GstStreamFlags)GST_STREAM_FLAG_NONE;
|
||||||
|
event caps: video/x-raw, format=(string)YUY2, framerate=(fraction)30/1, height=(int)240, interlace-mode=(string)progressive, multiview-mode=(string)mono, pixel-aspect-ratio=(fraction)1/1, width=(int)320;
|
||||||
|
event flush-start: (no structure)
|
||||||
|
event flush-stop: GstEventFlushStop, reset-time=(boolean)true;
|
||||||
|
event segment: format=TIME, start=0:00:00.200000000, offset=0:00:00.000000000, stop=0:00:00.400000000, flags=0x01, time=0:00:00.000000000, base=0:00:00.000000000, position=0:00:00.200000000
|
||||||
|
buffer: content-id=0, pts=0:00:00.200000000, dur=0:00:00.033333333, flags=discont
|
||||||
|
buffer: content-id=1, pts=0:00:00.233333333, dur=0:00:00.033333333
|
||||||
|
buffer: content-id=2, pts=0:00:00.266666666, dur=0:00:00.033333334
|
||||||
|
buffer: content-id=3, pts=0:00:00.300000000, dur=0:00:00.033333333
|
||||||
|
buffer: content-id=4, pts=0:00:00.333333333, dur=0:00:00.033333333
|
||||||
|
buffer: content-id=5, pts=0:00:00.366666666, dur=0:00:00.033333334
|
||||||
|
event eos: (no structure)
|
||||||
|
event flush-start: (no structure)
|
||||||
|
event flush-stop: GstEventFlushStop, reset-time=(boolean)true;
|
|
@ -0,0 +1,14 @@
|
||||||
|
event stream-start: GstEventStreamStart, flags=(GstStreamFlags)GST_STREAM_FLAG_NONE, group-id=(uint)1;
|
||||||
|
event caps: video/x-raw, format=(string)YUY2, framerate=(fraction)30/1, height=(int)240, interlace-mode=(string)progressive, multiview-mode=(string)mono, pixel-aspect-ratio=(fraction)1/1, width=(int)320;
|
||||||
|
event flush-start: (no structure)
|
||||||
|
event flush-stop: GstEventFlushStop, reset-time=(boolean)true;
|
||||||
|
event segment: format=TIME, start=0:00:00.200000000, offset=0:00:00.000000000, stop=0:00:00.400000000, flags=0x01, time=0:00:00.000000000, base=0:00:00.000000000, position=0:00:00.200000000
|
||||||
|
buffer: content-id=0, pts=0:00:00.200000000, dur=0:00:00.033333333, flags=discont
|
||||||
|
buffer: content-id=1, pts=0:00:00.233333333, dur=0:00:00.033333333
|
||||||
|
buffer: content-id=2, pts=0:00:00.266666666, dur=0:00:00.033333334
|
||||||
|
buffer: content-id=3, pts=0:00:00.300000000, dur=0:00:00.033333333
|
||||||
|
buffer: content-id=4, pts=0:00:00.333333333, dur=0:00:00.033333333
|
||||||
|
buffer: content-id=5, pts=0:00:00.366666666, dur=0:00:00.033333334
|
||||||
|
event eos: (no structure)
|
||||||
|
event flush-start: (no structure)
|
||||||
|
event flush-stop: GstEventFlushStop, reset-time=(boolean)true;
|
Loading…
Reference in a new issue