diff --git a/ext/hls/gsthlsdemux-util.c b/ext/hls/gsthlsdemux-util.c index 252f042c5f..efa1129a33 100644 --- a/ext/hls/gsthlsdemux-util.c +++ b/ext/hls/gsthlsdemux-util.c @@ -265,13 +265,15 @@ gst_hlsdemux_tsreader_find_pcrs_mpegts (GstHLSTSReader * r, static gboolean gst_hlsdemux_tsreader_find_pcrs_id3 (GstHLSTSReader * r, - GstBuffer * buffer, GstClockTime * first_pcr, GstClockTime * last_pcr) + GstBuffer ** buffer_out, GstClockTime * first_pcr, GstClockTime * last_pcr, + GstTagList ** tags) { GstMapInfo info; guint32 tag_size; gsize size; GstTagList *taglist; GstSample *priv_data = NULL; + GstBuffer *buffer = *buffer_out; GstBuffer *tag_buf; guint64 pts; @@ -297,10 +299,17 @@ gst_hlsdemux_tsreader_find_pcrs_id3 (GstHLSTSReader * r, * not try and read again */ r->have_id3 = TRUE; + *buffer_out = + gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, tag_size, -1); + /* Parse the tag */ taglist = gst_tag_list_from_id3v2_tag (buffer); - if (taglist == NULL) + if (taglist == NULL) { + gst_buffer_unref (buffer); return TRUE; /* Invalid tag, stop trying */ + } + + *tags = taglist; /* Extract the timestamps */ if (!gst_tag_list_get_sample (taglist, GST_TAG_PRIVATE_DATA, &priv_data)) @@ -330,19 +339,22 @@ gst_hlsdemux_tsreader_find_pcrs_id3 (GstHLSTSReader * r, out: if (priv_data) gst_sample_unref (priv_data); - - gst_tag_list_unref (taglist); + gst_buffer_unref (buffer); return TRUE; } gboolean gst_hlsdemux_tsreader_find_pcrs (GstHLSTSReader * r, - GstBuffer * buffer, GstClockTime * first_pcr, GstClockTime * last_pcr) + GstBuffer ** buffer, GstClockTime * first_pcr, GstClockTime * last_pcr, + GstTagList ** tags) { + *tags = NULL; + if (r->rtype == GST_HLS_TSREADER_MPEGTS) - return gst_hlsdemux_tsreader_find_pcrs_mpegts (r, buffer, first_pcr, + return gst_hlsdemux_tsreader_find_pcrs_mpegts (r, *buffer, first_pcr, last_pcr); - return gst_hlsdemux_tsreader_find_pcrs_id3 (r, buffer, first_pcr, last_pcr); + return gst_hlsdemux_tsreader_find_pcrs_id3 (r, buffer, first_pcr, last_pcr, + tags); } diff --git a/ext/hls/gsthlsdemux.c b/ext/hls/gsthlsdemux.c index 9247d45c33..3e82d58e98 100644 --- a/ext/hls/gsthlsdemux.c +++ b/ext/hls/gsthlsdemux.c @@ -767,6 +767,7 @@ gst_hls_demux_handle_buffer (GstAdaptiveDemux * demux, GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (demux); GstMapInfo info; GstClockTime first_pcr, last_pcr; + GstTagList *tags; if (buffer == NULL) return GST_FLOW_OK; @@ -832,14 +833,18 @@ gst_hls_demux_handle_buffer (GstAdaptiveDemux * demux, hls_stream->pending_pcr_buffer = NULL; } - if (!gst_hlsdemux_tsreader_find_pcrs (&hls_stream->tsreader, buffer, - &first_pcr, &last_pcr) + if (!gst_hlsdemux_tsreader_find_pcrs (&hls_stream->tsreader, &buffer, + &first_pcr, &last_pcr, &tags) && !at_eos) { // Store this buffer for later hls_stream->pending_pcr_buffer = buffer; return GST_FLOW_OK; } + if (tags) { + gst_adaptive_demux_stream_set_tags (stream, tags); + } + if (buffer) { buffer = gst_buffer_make_writable (buffer); GST_BUFFER_OFFSET (buffer) = hls_stream->current_offset; diff --git a/ext/hls/gsthlsdemux.h b/ext/hls/gsthlsdemux.h index f2bc238c5d..4a2b9c0fe4 100644 --- a/ext/hls/gsthlsdemux.h +++ b/ext/hls/gsthlsdemux.h @@ -154,8 +154,8 @@ struct _GstHLSDemuxClass void gst_hlsdemux_tsreader_init (GstHLSTSReader *r); void gst_hlsdemux_tsreader_set_type (GstHLSTSReader *r, GstHLSTSReaderType rtype); -gboolean gst_hlsdemux_tsreader_find_pcrs (GstHLSTSReader *r, GstBuffer *buffer, - GstClockTime *first_pcr, GstClockTime *last_pcr); +gboolean gst_hlsdemux_tsreader_find_pcrs (GstHLSTSReader *r, GstBuffer **buffer, + GstClockTime *first_pcr, GstClockTime *last_pcr, GstTagList **tags); GType gst_hls_demux_get_type (void);