summaryrefslogtreecommitdiff
path: root/ext/hls/gsthlsdemux.c
diff options
context:
space:
mode:
authorJan Schmidt <jan@centricular.com>2016-07-12 23:05:55 +1000
committerJan Schmidt <jan@centricular.com>2016-08-03 23:49:54 +1000
commit1d4eb71a05c27fa66e53b949f9cce836d41c8b87 (patch)
tree45250457d366903fddb7b4d4681e084838c10d73 /ext/hls/gsthlsdemux.c
parent8cf50dbc441688f6b823b9ccc5ec57869e6344ef (diff)
downloadgstreamer-plugins-bad-1d4eb71a05c27fa66e53b949f9cce836d41c8b87.tar.gz
hlsdemux: Add support for ID3 tag parsing
Parse start PTS out of the ID3 tags in audio fragments. Informational only for now.
Diffstat (limited to 'ext/hls/gsthlsdemux.c')
-rw-r--r--ext/hls/gsthlsdemux.c43
1 files changed, 32 insertions, 11 deletions
diff --git a/ext/hls/gsthlsdemux.c b/ext/hls/gsthlsdemux.c
index ed52b8e25..8f1035703 100644
--- a/ext/hls/gsthlsdemux.c
+++ b/ext/hls/gsthlsdemux.c
@@ -447,6 +447,9 @@ create_stream_for_playlist (GstAdaptiveDemux * demux, GstM3U8 * playlist,
gst_hls_demux_create_pad (hlsdemux));
hlsdemux_stream = GST_HLS_DEMUX_STREAM_CAST (stream);
+
+ hlsdemux_stream->stream_type = GST_HLS_TSREADER_NONE;
+
hlsdemux_stream->playlist = gst_m3u8_ref (playlist);
hlsdemux_stream->is_primary_playlist = is_primary_playlist;
@@ -696,8 +699,11 @@ gst_hls_demux_start_fragment (GstAdaptiveDemux * demux,
gst_hls_demux_stream_clear_pending_data (hls_stream);
- /* Init the MPEG-TS reader for this fragment */
+ /* Init the timestamp reader for this fragment */
gst_hlsdemux_tsreader_init (&hls_stream->tsreader);
+ /* Reset the stream type if we already know it */
+ gst_hlsdemux_tsreader_set_type (&hls_stream->tsreader,
+ hls_stream->stream_type);
/* If no decryption is needed, there's nothing to be done here */
if (hls_stream->current_key == NULL)
@@ -725,6 +731,19 @@ key_failed:
}
}
+static GstHLSTSReaderType
+caps_to_reader (const GstCaps * caps)
+{
+ const GstStructure *s = gst_caps_get_structure (caps, 0);
+
+ if (gst_structure_has_name (s, "video/mpegts"))
+ return GST_HLS_TSREADER_MPEGTS;
+ if (gst_structure_has_name (s, "application/x-id3"))
+ return GST_HLS_TSREADER_ID3;
+
+ return GST_HLS_TSREADER_NONE;
+}
+
static GstFlowReturn
gst_hls_demux_handle_buffer (GstAdaptiveDemux * demux,
GstAdaptiveDemuxStream * stream, GstBuffer * buffer, gboolean at_eos)
@@ -780,30 +799,32 @@ gst_hls_demux_handle_buffer (GstAdaptiveDemux * demux,
GST_DEBUG_OBJECT (hlsdemux, "Typefind result: %" GST_PTR_FORMAT " prob:%d",
caps, prob);
+ hls_stream->stream_type = caps_to_reader (caps);
+ gst_hlsdemux_tsreader_set_type (&hls_stream->tsreader,
+ hls_stream->stream_type);
+
gst_adaptive_demux_stream_set_caps (stream, caps);
+
hls_stream->do_typefind = FALSE;
}
g_assert (hls_stream->pending_typefind_buffer == NULL);
+ gst_buffer_unmap (buffer, &info);
+
// Accumulate this buffer
if (hls_stream->pending_pcr_buffer) {
- gst_buffer_unmap (buffer, &info);
buffer = gst_buffer_append (hls_stream->pending_pcr_buffer, buffer);
hls_stream->pending_pcr_buffer = NULL;
- gst_buffer_map (buffer, &info, GST_MAP_READ);
}
- if (!gst_hlsdemux_tsreader_find_pcrs (&hls_stream->tsreader, info.data,
- info.size, &first_pcr, &last_pcr)
+ if (!gst_hlsdemux_tsreader_find_pcrs (&hls_stream->tsreader, buffer,
+ &first_pcr, &last_pcr)
&& !at_eos) {
- gst_buffer_unmap (buffer, &info);
// Store this buffer for later
hls_stream->pending_pcr_buffer = buffer;
return GST_FLOW_OK;
}
- gst_buffer_unmap (buffer, &info);
-
if (buffer) {
buffer = gst_buffer_make_writable (buffer);
GST_BUFFER_OFFSET (buffer) = hls_stream->current_offset;
@@ -1020,7 +1041,7 @@ gst_hls_demux_update_fragment_info (GstAdaptiveDemuxStream * stream)
g_free (stream->fragment.uri);
stream->fragment.uri = g_strdup (file->uri);
- GST_DEBUG_OBJECT (stream, "URI now %s", file->uri);
+ GST_DEBUG_OBJECT (hlsdemux, "Stream %p URI now %s", stream, file->uri);
stream->fragment.range_start = file->offset;
if (file->size != -1)
@@ -1053,8 +1074,8 @@ gst_hls_demux_select_bitrate (GstAdaptiveDemuxStream * stream, guint64 bitrate)
GST_M3U8_CLIENT_UNLOCK (hlsdemux->client);
if (hls_stream->is_primary_playlist == FALSE) {
- GST_LOG_OBJECT (stream,
- "Not choosing new bitrate - not the primary stream");
+ GST_LOG_OBJECT (hlsdemux,
+ "Stream %p Not choosing new bitrate - not the primary stream", stream);
return FALSE;
}