|
| 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 | + |
0 commit comments