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;
* 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))
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);
}
GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (demux);
GstMapInfo info;
GstClockTime first_pcr, last_pcr;
+ GstTagList *tags;
if (buffer == NULL)
return GST_FLOW_OK;
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;
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);