mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-30 20:59:44 +00:00
qtdemux: Clear protection events when we get new ones
If we keep the old events they can be end up being passed to the app, that could discard the protection information because it has been seen before. Drive by improvement: use g_queue_clear_full instead of foreach+clear for protection events. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3547>
This commit is contained in:
parent
993bc8fc01
commit
87ae60176b
1 changed files with 25 additions and 9 deletions
|
@ -392,6 +392,8 @@ static void gst_qtdemux_append_protection_system_id (GstQTDemux * qtdemux,
|
|||
const gchar * id);
|
||||
static void qtdemux_gst_structure_free (GstStructure * gststructure);
|
||||
static void gst_qtdemux_reset (GstQTDemux * qtdemux, gboolean hard);
|
||||
static void qtdemux_clear_protection_events_on_all_streams (GstQTDemux *
|
||||
qtdemux);
|
||||
|
||||
static void
|
||||
gst_qtdemux_class_init (GstQTDemuxClass * klass)
|
||||
|
@ -482,9 +484,8 @@ gst_qtdemux_dispose (GObject * object)
|
|||
}
|
||||
gst_tag_list_unref (qtdemux->tag_list);
|
||||
gst_flow_combiner_free (qtdemux->flowcombiner);
|
||||
g_queue_foreach (&qtdemux->protection_event_queue, (GFunc) gst_event_unref,
|
||||
NULL);
|
||||
g_queue_clear (&qtdemux->protection_event_queue);
|
||||
g_queue_clear_full (&qtdemux->protection_event_queue,
|
||||
(GDestroyNotify) gst_event_unref);
|
||||
|
||||
g_free (qtdemux->cenc_aux_info_sizes);
|
||||
qtdemux->cenc_aux_info_sizes = NULL;
|
||||
|
@ -2039,9 +2040,8 @@ gst_qtdemux_reset (GstQTDemux * qtdemux, gboolean hard)
|
|||
qtdemux->have_group_id = FALSE;
|
||||
qtdemux->group_id = G_MAXUINT;
|
||||
|
||||
g_queue_foreach (&qtdemux->protection_event_queue, (GFunc) gst_event_unref,
|
||||
NULL);
|
||||
g_queue_clear (&qtdemux->protection_event_queue);
|
||||
g_queue_clear_full (&qtdemux->protection_event_queue,
|
||||
(GDestroyNotify) gst_event_unref);
|
||||
|
||||
qtdemux->received_seek = FALSE;
|
||||
qtdemux->first_moof_already_parsed = FALSE;
|
||||
|
@ -2099,6 +2099,15 @@ gst_qtdemux_reset (GstQTDemux * qtdemux, gboolean hard)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
qtdemux_clear_protection_events_on_all_streams (GstQTDemux * qtdemux)
|
||||
{
|
||||
for (unsigned i = 0; i < QTDEMUX_N_STREAMS (qtdemux); i++) {
|
||||
QtDemuxStream *stream = QTDEMUX_NTH_STREAM (qtdemux, i);
|
||||
g_queue_clear_full (&stream->protection_scheme_event_queue,
|
||||
(GDestroyNotify) gst_event_unref);
|
||||
}
|
||||
}
|
||||
|
||||
/* Maps the @segment to the qt edts internal segments and pushes
|
||||
* the corresponding segment event.
|
||||
|
@ -2574,9 +2583,8 @@ gst_qtdemux_stream_clear (QtDemuxStream * stream)
|
|||
}
|
||||
stream->protection_scheme_type = 0;
|
||||
stream->protection_scheme_version = 0;
|
||||
g_queue_foreach (&stream->protection_scheme_event_queue,
|
||||
(GFunc) gst_event_unref, NULL);
|
||||
g_queue_clear (&stream->protection_scheme_event_queue);
|
||||
g_queue_clear_full (&stream->protection_scheme_event_queue,
|
||||
(GDestroyNotify) gst_event_unref);
|
||||
gst_qtdemux_stream_flush_segments_data (stream);
|
||||
gst_qtdemux_stream_flush_samples_data (stream);
|
||||
}
|
||||
|
@ -4292,6 +4300,10 @@ qtdemux_parse_moof (GstQTDemux * qtdemux, const guint8 * buffer, guint length,
|
|||
|
||||
/* parse any protection system info */
|
||||
pssh_node = qtdemux_tree_get_child_by_type (moof_node, FOURCC_pssh);
|
||||
if (pssh_node) {
|
||||
/* Unref old protection events if we are going to receive new ones. */
|
||||
qtdemux_clear_protection_events_on_all_streams (qtdemux);
|
||||
}
|
||||
while (pssh_node) {
|
||||
GST_LOG_OBJECT (qtdemux, "Parsing pssh box.");
|
||||
qtdemux_parse_pssh (qtdemux, pssh_node);
|
||||
|
@ -14113,6 +14125,10 @@ qtdemux_parse_tree (GstQTDemux * qtdemux)
|
|||
|
||||
/* parse any protection system info */
|
||||
pssh = qtdemux_tree_get_child_by_type (qtdemux->moov_node, FOURCC_pssh);
|
||||
if (pssh) {
|
||||
/* Unref old protection events if we are going to receive new ones. */
|
||||
qtdemux_clear_protection_events_on_all_streams (qtdemux);
|
||||
}
|
||||
while (pssh) {
|
||||
GST_LOG_OBJECT (qtdemux, "Parsing pssh box.");
|
||||
qtdemux_parse_pssh (qtdemux, pssh);
|
||||
|
|
Loading…
Reference in a new issue