summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Hervey <edward@centricular.com>2016-10-12 14:35:21 +0200
committerEdward Hervey <bilboed@bilboed.com>2016-10-12 14:35:21 +0200
commitddacbb7793cd1614b4c7d8681af60e12364dba14 (patch)
tree106e593ed9cb8ff9cbebba8c0a24fb1fdb955a2e
parentee70f830a870cdc8cc80c0dc3001bb3e329236f5 (diff)
mpegtsdemux: Ensure we always get an upstream stream-id
This was a regression. We only have a upstream-id via STREAM_START if we were in push-mode. In pull-mode we need to create one. Note: It would be good to eventually have that method (copied from gst_pad_get_stream_id_internal()) public in the future
-rw-r--r--gst/mpegtsdemux/mpegtsbase.c42
1 files changed, 41 insertions, 1 deletions
diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c
index 938509be7..e5756a96d 100644
--- a/gst/mpegtsdemux/mpegtsbase.c
+++ b/gst/mpegtsdemux/mpegtsbase.c
@@ -328,6 +328,46 @@ mpegts_get_descriptor_from_program (MpegTSBaseProgram * program, guint8 tag)
return gst_mpegts_find_descriptor (pmt->descriptors, tag);
}
+static gchar *
+_get_upstream_id (GstElement * element, GstPad * sinkpad)
+{
+ gchar *upstream_id = gst_pad_get_stream_id (sinkpad);
+
+ if (!upstream_id) {
+ /* Try to create one from the upstream URI, else use a randome number */
+ GstQuery *query;
+ gchar *uri = NULL;
+
+ /* Try to generate one from the URI query and
+ * if it fails take a random number instead */
+ query = gst_query_new_uri ();
+ if (gst_element_query (element, query)) {
+ gst_query_parse_uri (query, &uri);
+ }
+
+ if (uri) {
+ GChecksum *cs;
+
+ /* And then generate an SHA256 sum of the URI */
+ cs = g_checksum_new (G_CHECKSUM_SHA256);
+ g_checksum_update (cs, (const guchar *) uri, strlen (uri));
+ g_free (uri);
+ upstream_id = g_strdup (g_checksum_get_string (cs));
+ g_checksum_free (cs);
+ } else {
+ /* Just get some random number if the URI query fails */
+ GST_FIXME_OBJECT (element, "Creating random stream-id, consider "
+ "implementing a deterministic way of creating a stream-id");
+ upstream_id =
+ g_strdup_printf ("%08x%08x%08x%08x", g_random_int (), g_random_int (),
+ g_random_int (), g_random_int ());
+ }
+
+ gst_query_unref (query);
+ }
+ return upstream_id;
+}
+
static MpegTSBaseProgram *
mpegts_base_new_program (MpegTSBase * base,
gint program_number, guint16 pmt_pid)
@@ -345,7 +385,7 @@ mpegts_base_new_program (MpegTSBase * base,
program->streams = g_new0 (MpegTSBaseStream *, 0x2000);
program->patcount = 0;
- upstream_id = gst_pad_get_stream_id (base->sinkpad);
+ upstream_id = _get_upstream_id ((GstElement *) base, base->sinkpad);
stream_id = g_strdup_printf ("%s:%d", upstream_id, program_number);
program->collection = gst_stream_collection_new (stream_id);
g_free (stream_id);