Skip to content

Commit 2537f19

Browse files
committed
gst1-plugins-good: qtdemux: Honor edit lists only on wpe-2.28
This patch reverts 2 custom patches from 1.16.2 that were ignoring edit lists, but ONLY on wpe-2.28: 0002-0007-qtdemux-dont-check-pushbased-edts.patch.patch 0006-Manual-revert-of-bfd0e022-qtdemux-rework-segment-eve.patch The reversion is done by applying the custom revert patches stored in package/gstreamer1/gst1-plugins-good/1.16.2-wpe-2.28. Some special rules in gst1-plugins-good.mk check if we're building wpe-2.28 and, only in that case, apply the patches in the special directory mentioned before. The patches are applied by hand (using a script) instead of using buildroot's built-in patching feature, which doesn't support conditional patching by evaluating a Makefile condition. This was needed for WebPlatformForEmbedded/WPEWebKit#850
1 parent 89613ad commit 2537f19

3 files changed

Lines changed: 260 additions & 0 deletions

File tree

Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
From 7d706e0f4114f31f7eb1bc7e2f02d79f86c136d7 Mon Sep 17 00:00:00 2001
2+
From: =?UTF-8?q?Enrique=20Oca=C3=B1a=20Gonz=C3=A1lez?= <eocanha@igalia.com>
3+
Date: Mon, 6 Jun 2022 20:56:35 +0200
4+
Subject: [PATCH 1/3] Revert "Manual revert of bfd0e022 qtdemux: rework segment
5+
event pushing"
6+
7+
This reverts commit e0d65818e8254e441b9652b525ae18d6d08f5542.
8+
---
9+
gst/isomp4/qtdemux.c | 78 +++++++++++---------------------------------
10+
gst/isomp4/qtdemux.h | 7 ++--
11+
2 files changed, 24 insertions(+), 61 deletions(-)
12+
13+
diff --git a/gst/isomp4/qtdemux.c b/gst/isomp4/qtdemux.c
14+
index 47bd6fe83..effc505a5 100644
15+
--- a/gst/isomp4/qtdemux.c
16+
+++ b/gst/isomp4/qtdemux.c
17+
@@ -2152,9 +2152,6 @@ gst_qtdemux_reset (GstQTDemux * qtdemux, gboolean hard)
18+
qtdemux->element_index = NULL;
19+
#endif
20+
qtdemux->major_brand = 0;
21+
- if (qtdemux->pending_newsegment)
22+
- gst_event_unref (qtdemux->pending_newsegment);
23+
- qtdemux->pending_newsegment = NULL;
24+
qtdemux->upstream_format_is_time = FALSE;
25+
qtdemux->upstream_seekable = FALSE;
26+
qtdemux->upstream_size = 0;
27+
@@ -2177,6 +2174,7 @@ gst_qtdemux_reset (GstQTDemux * qtdemux, gboolean hard)
28+
qtdemux->offset = 0;
29+
gst_adapter_clear (qtdemux->adapter);
30+
gst_segment_init (&qtdemux->segment, GST_FORMAT_TIME);
31+
+ qtdemux->need_segment = TRUE;
32+
33+
if (hard) {
34+
qtdemux->segment_seqnum = GST_SEQNUM_INVALID;
35+
@@ -2218,12 +2216,6 @@ gst_qtdemux_reset (GstQTDemux * qtdemux, gboolean hard)
36+
stream->time_position = 0;
37+
stream->accumulated_base = 0;
38+
}
39+
- if (!qtdemux->pending_newsegment) {
40+
- qtdemux->pending_newsegment = gst_event_new_segment (&qtdemux->segment);
41+
- if (qtdemux->segment_seqnum != GST_SEQNUM_INVALID)
42+
- gst_event_set_seqnum (qtdemux->pending_newsegment,
43+
- qtdemux->segment_seqnum);
44+
- }
45+
}
46+
}
47+
48+
@@ -2318,12 +2310,7 @@ gst_qtdemux_handle_sink_event (GstPad * sinkpad, GstObject * parent,
49+
GST_DEBUG_OBJECT (demux, "received newsegment %" GST_SEGMENT_FORMAT,
50+
&segment);
51+
52+
- /* erase any previously set segment */
53+
- gst_event_replace (&demux->pending_newsegment, NULL);
54+
-
55+
if (segment.format == GST_FORMAT_TIME) {
56+
- GST_DEBUG_OBJECT (demux, "new pending_newsegment");
57+
- gst_event_replace (&demux->pending_newsegment, event);
58+
demux->upstream_format_is_time = TRUE;
59+
demux->segment_seqnum = gst_event_get_seqnum (event);
60+
} else {
61+
@@ -2400,16 +2387,8 @@ gst_qtdemux_handle_sink_event (GstPad * sinkpad, GstObject * parent,
62+
63+
/* map segment to internal qt segments and push on each stream */
64+
if (QTDEMUX_N_STREAMS (demux)) {
65+
- if (demux->fragmented) {
66+
- GstEvent *segment_event = gst_event_new_segment (&segment);
67+
-
68+
- gst_event_replace (&demux->pending_newsegment, NULL);
69+
- gst_event_set_seqnum (segment_event, demux->segment_seqnum);
70+
- gst_qtdemux_push_event (demux, segment_event);
71+
- } else {
72+
- gst_event_replace (&demux->pending_newsegment, NULL);
73+
- gst_qtdemux_map_and_push_segments (demux, &segment);
74+
- }
75+
+ demux->need_segment = TRUE;
76+
+ gst_qtdemux_check_send_pending_segment (demux);
77+
}
78+
79+
/* clear leftover in current segment, if any */
80+
@@ -4380,6 +4359,12 @@ qtdemux_parse_moof (GstQTDemux * qtdemux, const guint8 * buffer, guint length,
81+
QtDemuxStream *stream = QTDEMUX_NTH_STREAM (qtdemux, i);
82+
stream->time_position = min_dts;
83+
}
84+
+
85+
+ /* Before this code was run a segment was already sent when the moov was
86+
+ * parsed... which is OK -- some apps (mostly tests) expect a segment to
87+
+ * be emitted after a moov, and we can emit a second segment anyway for
88+
+ * special cases like this. */
89+
+ qtdemux->need_segment = TRUE;
90+
}
91+
92+
qtdemux->first_moof_already_parsed = TRUE;
93+
@@ -6915,7 +6900,7 @@ gst_qtdemux_drop_data (GstQTDemux * demux, gint bytes)
94+
static void
95+
gst_qtdemux_check_send_pending_segment (GstQTDemux * demux)
96+
{
97+
- if (G_UNLIKELY (demux->pending_newsegment)) {
98+
+ if (G_UNLIKELY (demux->need_segment)) {
99+
gint i;
100+
101+
if (!demux->upstream_format_is_time) {
102+
@@ -6928,6 +6913,8 @@ gst_qtdemux_check_send_pending_segment (GstQTDemux * demux)
103+
gst_qtdemux_push_event (demux, segment_event);
104+
}
105+
106+
+ demux->need_segment = FALSE;
107+
+
108+
/* clear to send tags on all streams */
109+
for (i = 0; i < QTDEMUX_N_STREAMS (demux); i++) {
110+
QtDemuxStream *stream = QTDEMUX_NTH_STREAM (demux, i);
111+
@@ -7227,15 +7214,6 @@ gst_qtdemux_process_adapter (GstQTDemux * demux, gboolean force)
112+
if (demux->moov_node)
113+
g_node_destroy (demux->moov_node);
114+
demux->moov_node = NULL;
115+
- } else {
116+
- /* prepare newsegment to send when streaming actually starts */
117+
- if (!demux->pending_newsegment) {
118+
- demux->pending_newsegment =
119+
- gst_event_new_segment (&demux->segment);
120+
- if (demux->segment_seqnum != GST_SEQNUM_INVALID)
121+
- gst_event_set_seqnum (demux->pending_newsegment,
122+
- demux->segment_seqnum);
123+
- }
124+
}
125+
126+
demux->last_moov_offset = demux->offset;
127+
@@ -7254,8 +7232,7 @@ gst_qtdemux_process_adapter (GstQTDemux * demux, gboolean force)
128+
129+
demux->got_moov = TRUE;
130+
131+
- gst_event_replace (&demux->pending_newsegment, NULL);
132+
- gst_qtdemux_map_and_push_segments (demux, &demux->segment);
133+
+ gst_qtdemux_check_send_pending_segment (demux);
134+
135+
if (demux->moov_node_compressed) {
136+
g_node_destroy (demux->moov_node_compressed);
137+
@@ -7338,20 +7315,15 @@ gst_qtdemux_process_adapter (GstQTDemux * demux, gboolean force)
138+
ret = GST_FLOW_ERROR;
139+
goto done;
140+
}
141+
+
142+
/* in MSS we need to expose the pads after the first moof as we won't get a moov */
143+
if (demux->mss_mode && !demux->exposed) {
144+
- if (!demux->pending_newsegment) {
145+
- GST_DEBUG_OBJECT (demux, "new pending_newsegment");
146+
- demux->pending_newsegment =
147+
- gst_event_new_segment (&demux->segment);
148+
- if (demux->segment_seqnum != GST_SEQNUM_INVALID)
149+
- gst_event_set_seqnum (demux->pending_newsegment,
150+
- demux->segment_seqnum);
151+
- }
152+
QTDEMUX_EXPOSE_LOCK (demux);
153+
qtdemux_expose_streams (demux);
154+
QTDEMUX_EXPOSE_UNLOCK (demux);
155+
}
156+
+
157+
+ gst_qtdemux_check_send_pending_segment (demux);
158+
} else {
159+
GST_DEBUG_OBJECT (demux, "Discarding [moof]");
160+
}
161+
@@ -13139,14 +13111,6 @@ qtdemux_update_streams (GstQTDemux * qtdemux)
162+
stream->stream_tags = NULL;
163+
if (!gst_qtdemux_add_stream (qtdemux, stream, list))
164+
return FALSE;
165+
-
166+
- /* New segment will be exposed at _update_segment in case of pull mode */
167+
- if (!qtdemux->pending_newsegment && !qtdemux->pullbased) {
168+
- qtdemux->pending_newsegment = gst_event_new_segment (&qtdemux->segment);
169+
- if (qtdemux->segment_seqnum)
170+
- gst_event_set_seqnum (qtdemux->pending_newsegment,
171+
- qtdemux->segment_seqnum);
172+
- }
173+
}
174+
}
175+
176+
@@ -13171,6 +13135,7 @@ qtdemux_expose_streams (GstQTDemux * qtdemux)
177+
}
178+
179+
g_ptr_array_set_size (qtdemux->old_streams, 0);
180+
+ qtdemux->need_segment = TRUE;
181+
182+
return GST_FLOW_OK;
183+
}
184+
@@ -13189,13 +13154,6 @@ qtdemux_expose_streams (GstQTDemux * qtdemux)
185+
if (!gst_qtdemux_add_stream (qtdemux, stream, list))
186+
return GST_FLOW_ERROR;
187+
188+
- /* New segment will be exposed at _update_segment in case of pull mode */
189+
- if (!qtdemux->pending_newsegment && !qtdemux->pullbased) {
190+
- qtdemux->pending_newsegment = gst_event_new_segment (&qtdemux->segment);
191+
- if (qtdemux->segment_seqnum)
192+
- gst_event_set_seqnum (qtdemux->pending_newsegment,
193+
- qtdemux->segment_seqnum);
194+
- }
195+
}
196+
}
197+
198+
@@ -13239,6 +13197,8 @@ qtdemux_expose_streams (GstQTDemux * qtdemux)
199+
g_ptr_array_foreach (qtdemux->active_streams,
200+
(GFunc) qtdemux_do_allocation, qtdemux);
201+
202+
+ qtdemux->need_segment = TRUE;
203+
+
204+
qtdemux->exposed = TRUE;
205+
return GST_FLOW_OK;
206+
}
207+
diff --git a/gst/isomp4/qtdemux.h b/gst/isomp4/qtdemux.h
208+
index ccee2ee2b..83a050a43 100644
209+
--- a/gst/isomp4/qtdemux.h
210+
+++ b/gst/isomp4/qtdemux.h
211+
@@ -118,8 +118,11 @@ struct _GstQTDemux {
212+
/* configured playback region */
213+
GstSegment segment;
214+
215+
- /* The SEGMENT_EVENT from upstream *OR* generated from segment (above) */
216+
- GstEvent *pending_newsegment;
217+
+ /* PUSH-BASED only: If the initial segment event, or a segment consequence of
218+
+ * a seek or incoming TIME segment from upstream needs to be pushed. This
219+
+ * variable is used instead of pushing the event directly because at that
220+
+ * point we may not have yet emitted the srcpads. */
221+
+ gboolean need_segment;
222+
223+
guint32 segment_seqnum;
224+
225+
--
226+
2.34.1
227+
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
From 3be157a7536e8b42a456870424981bfa69fa9aae Mon Sep 17 00:00:00 2001
2+
From: =?UTF-8?q?Enrique=20Oca=C3=B1a=20Gonz=C3=A1lez?= <eocanha@igalia.com>
3+
Date: Tue, 7 Jun 2022 14:37:00 +0200
4+
Subject: [PATCH 2/3] Revert "0007-qtdemux-dont-check-pushbased-edts.patch"
5+
6+
This reverts commit 6710041c6ba6893eddf60fc610011b0b9ca7497c.
7+
---
8+
gst/isomp4/qtdemux.c | 2 +-
9+
1 file changed, 1 insertion(+), 1 deletion(-)
10+
11+
diff --git a/gst/isomp4/qtdemux.c b/gst/isomp4/qtdemux.c
12+
index effc505a5..1bdbb22d3 100644
13+
--- a/gst/isomp4/qtdemux.c
14+
+++ b/gst/isomp4/qtdemux.c
15+
@@ -9988,7 +9988,7 @@ done:
16+
17+
/* push based does not handle segments, so act accordingly here,
18+
* and warn if applicable */
19+
- if (!qtdemux->pullbased /* && !allow_pushbased_edts */) {
20+
+ if (!qtdemux->pullbased && !allow_pushbased_edts) {
21+
GST_WARNING_OBJECT (qtdemux, "streaming; discarding edit list segments");
22+
/* remove and use default one below, we stream like it anyway */
23+
g_free (stream->segments);
24+
--
25+
2.34.1
26+

package/gstreamer1/gst1-plugins-good/gst1-plugins-good.mk

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,4 +491,11 @@ else
491491
GST1_PLUGINS_GOOD_CONF_OPTS += -Dbz2=disabled
492492
endif
493493

494+
ifeq ($(BR2_PACKAGE_WPEWEBKIT2_28),y)
495+
define GST1_PLUGINS_GOOD_APPLY_WPEWEBKIT2_28_EXTRA_PATCHES_POST_HOOK
496+
cd $(@D) && { for P in ../../../package/gstreamer1/gst1-plugins-good/1.16.2-wpe-2.28/*.patch; do patch -p1 < "$$P" ; done; }
497+
endef
498+
GST1_PLUGINS_GOOD_POST_PATCH_HOOKS += GST1_PLUGINS_GOOD_APPLY_WPEWEBKIT2_28_EXTRA_PATCHES_POST_HOOK
499+
endif
500+
494501
$(eval $(meson-package))

0 commit comments

Comments
 (0)