+ GstTracerRecord *self;
+ GstStructure *structure;
+ va_list varargs;
+ gchar *err = NULL;
+ GType type;
+ GQuark id;
+
+ va_start (varargs, firstfield);
+ structure = gst_structure_new_empty (name);
+
+ while (firstfield) {
+ GValue val = { 0, };
+
+ id = g_quark_from_string (firstfield);
+ type = va_arg (varargs, GType);
+
+ /* 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",
+ firstfield, g_type_name (type));
+ }
+
+ G_VALUE_COLLECT_INIT (&val, type, varargs, G_VALUE_NOCOPY_CONTENTS, &err);
+ if (G_UNLIKELY (err)) {
+ g_critical ("%s", err);
+ g_free (err);
+ break;
+ }
+ /* see boxed_proxy_collect_value */
+ val.data[1].v_uint &= ~G_VALUE_NOCOPY_CONTENTS;
+ gst_structure_id_take_value (structure, id, &val);
+
+ firstfield = va_arg (varargs, gchar *);
+ }
+ va_end (varargs);
+
+ self = g_object_new (GST_TYPE_TRACER_RECORD, NULL);
+
+ /* Clear floating flag */
+ gst_object_ref_sink (self);
+
+ self->spec = structure;
+ gst_tracer_record_build_format (self);
+
+ return self;