dashsink: fix crash with no pad name for representation
authorStéphane Cerveau <scerveau@collabora.com>
Wed, 30 Jun 2021 08:30:43 +0000 (10:30 +0200)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Wed, 7 Jul 2021 13:50:35 +0000 (13:50 +0000)
if there is no pad name, the representation id
was NULL, causing a crash when writing the mpd file.

gst-launch-1.0 videotestsrc num-buffers=900 ! video/x-raw, width=800,
height=600, framerate=30/1 ! x264enc ! video/x-h264, profile=high !
dashsink

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2064>

ext/dash/gstdashsink.c

index 770eb07fe335ac35ce4245c19fe87c4fac20c9b6..e6c948e3c41f5a49f39f3b054c1bbac861adf22c 100644 (file)
@@ -334,6 +334,37 @@ gst_dash_sink_stream_from_splitmuxsink (GList * streams, GstElement * element)
   return NULL;
 }
 
+static gchar *
+gst_dash_sink_stream_get_next_name (GList * streams, GstDashSinkStreamType type)
+{
+  GList *l;
+  guint count = 0;
+  GstDashSinkStream *stream = NULL;
+  gchar *name = NULL;
+
+  for (l = streams; l != NULL; l = l->next) {
+    stream = l->data;
+    if (stream->type == type)
+      count++;
+  }
+
+  switch (type) {
+    case DASH_SINK_STREAM_TYPE_VIDEO:
+      name = g_strdup_printf ("video_%d", count);
+      break;
+    case DASH_SINK_STREAM_TYPE_AUDIO:
+      name = g_strdup_printf ("audio_%d", count);
+      break;
+    case DASH_SINK_STREAM_TYPE_SUBTITLE:
+      name = g_strdup_printf ("sub_%d", count);
+      break;
+    default:
+      name = g_strdup_printf ("unknown_%d", count);
+  }
+
+  return name;
+}
+
 static void
 gst_dash_sink_stream_free (gpointer s)
 {
@@ -936,7 +967,13 @@ gst_dash_sink_request_new_pad (GstElement * element, GstPadTemplate * templ,
     stream->adaptation_set_id = ADAPTATION_SET_ID_SUBTITLE;
   }
 
-  stream->representation_id = g_strdup (pad_name);
+  if (pad_name)
+    stream->representation_id = g_strdup (pad_name);
+  else
+    stream->representation_id =
+        gst_dash_sink_stream_get_next_name (sink->streams, stream->type);
+
+
   stream->mimetype = g_strdup (dash_muxer_list[sink->muxer].mimetype);