tracerrecord: Be stricter while parsing record templates
authorNirbheek Chauhan <nirbheek@centricular.com>
Fri, 21 Jun 2019 05:13:18 +0000 (10:43 +0530)
committerNirbheek Chauhan <nirbheek.chauhan@gmail.com>
Mon, 1 Jul 2019 13:33:13 +0000 (13:33 +0000)
It's not really possible for us to recover when someone uses the
gst_tracer_record_new() API incorrectly. Also, document a piece of
somewhat-obscure code.

gst/gsttracerrecord.c

index 639a4ccbb3c9041ade80c27d5eca80fbc051e3e8..a2cc11ef0c59ec7c82973515a703762518850222 100644 (file)
@@ -70,7 +70,7 @@ build_field_template (GQuark field_id, const GValue * value, gpointer user_data)
   gboolean res;
 
   if (G_VALUE_TYPE (value) != GST_TYPE_STRUCTURE) {
-    GST_WARNING ("expected field of type GstStructure, but %s is %s",
+    GST_ERROR ("expected field of type GstStructure, but %s is %s",
         g_quark_to_string (field_id), G_VALUE_TYPE_NAME (value));
     return FALSE;
   }
@@ -201,8 +201,11 @@ gst_tracer_record_new (const gchar * name, const gchar * firstfield, ...)
 
     /* all fields passed here must be GstStructures which we take over */
     if (type != GST_TYPE_STRUCTURE) {
-      GST_WARNING ("expected field of type GstStructure, but %s is %s",
+      GST_ERROR ("expected field of type GstStructure, but %s is %s",
           firstfield, g_type_name (type));
+      va_end (varargs);
+      gst_structure_free (structure);
+      return NULL;
     }
 
     G_VALUE_COLLECT_INIT (&val, type, varargs, G_VALUE_NOCOPY_CONTENTS, &err);
@@ -211,7 +214,9 @@ gst_tracer_record_new (const gchar * name, const gchar * firstfield, ...)
       g_free (err);
       break;
     }
-    /* see boxed_proxy_collect_value */
+    /* give ownership of the GstStructure "value" collected from varargs
+     * to this structure by unsetting the NOCOPY_CONTENTS collect-flag.
+     * see boxed_proxy_collect_value in glib's gobject/gboxed.c */
     val.data[1].v_uint &= ~G_VALUE_NOCOPY_CONTENTS;
     gst_structure_id_take_value (structure, id, &val);