/**
* SECTION:gsttoc
+ * @title: GstToc
* @short_description: Generic table of contents support
* @see_also: #GstStructure, #GstEvent, #GstMessage, #GstQuery
*
if (toc->tags != NULL)
gst_tag_list_unref (toc->tags);
+#ifdef USE_POISONING
+ memset (toc, 0xff, sizeof (GstToc));
+#endif
+
g_slice_free (GstToc, toc);
}
if (entry->tags != NULL)
gst_tag_list_unref (entry->tags);
+#ifdef USE_POISONING
+ memset (entry, 0xff, sizeof (GstTocEntry));
+#endif
+
g_slice_free (GstTocEntry, entry);
}
return NULL;
}
+static GList *
+gst_toc_deep_copy_toc_entries (GList * entry_list)
+{
+ GQueue new_entries = G_QUEUE_INIT;
+ GList *l;
+
+ for (l = entry_list; l != NULL; l = l->next)
+ g_queue_push_tail (&new_entries, gst_toc_entry_copy (l->data));
+
+ return new_entries.head;
+}
+
/**
* gst_toc_entry_copy:
* @entry: #GstTocEntry to copy.
static GstTocEntry *
gst_toc_entry_copy (const GstTocEntry * entry)
{
- GstTocEntry *ret, *sub;
+ GstTocEntry *ret;
GstTagList *list;
- GList *cur;
g_return_val_if_fail (entry != NULL, NULL);
ret->tags = list;
}
- cur = entry->subentries;
- while (cur != NULL) {
- sub = gst_toc_entry_copy (cur->data);
-
- if (sub != NULL)
- ret->subentries = g_list_prepend (ret->subentries, sub);
-
- cur = cur->next;
- }
- ret->subentries = g_list_reverse (ret->subentries);
+ ret->subentries = gst_toc_deep_copy_toc_entries (entry->subentries);
return ret;
}
gst_toc_copy (const GstToc * toc)
{
GstToc *ret;
- GstTocEntry *entry;
- GList *cur;
GstTagList *list;
g_return_val_if_fail (toc != NULL, NULL);
ret->tags = list;
}
- cur = toc->entries;
- while (cur != NULL) {
- entry = gst_toc_entry_copy (cur->data);
-
- if (entry != NULL)
- ret->entries = g_list_prepend (ret->entries, entry);
+ ret->entries = gst_toc_deep_copy_toc_entries (toc->entries);
- cur = cur->next;
- }
- ret->entries = g_list_reverse (ret->entries);
return ret;
}
/**
* gst_toc_entry_get_start_stop_times:
* @entry: #GstTocEntry to get values from.
- * @start: (out): the storage for the start value, leave %NULL if not need.
- * @stop: (out): the storage for the stop value, leave %NULL if not need.
+ * @start: (out) (allow-none): the storage for the start value, leave
+ * %NULL if not need.
+ * @stop: (out) (allow-none): the storage for the stop value, leave
+ * %NULL if not need.
*
* Get @start and @stop values from the @entry and write them into appropriate
* storages.
/**
* gst_toc_entry_get_loop:
* @entry: #GstTocEntry to get values from.
- * @loop_type: (out): the storage for the loop_type value, leave %NULL if not
- * need.
- * @repeat_count: (out): the storage for the repeat_count value, leave %NULL if
- * not need.
+ * @loop_type: (out) (allow-none): the storage for the loop_type
+ * value, leave %NULL if not need.
+ * @repeat_count: (out) (allow-none): the storage for the repeat_count
+ * value, leave %NULL if not need.
*
* Get @loop_type and @repeat_count values from the @entry and write them into
* appropriate storages. Loops are e.g. used by sampled instruments. GStreamer
*
* Gets the parent #GstTocEntry of @entry.
*
- * Returns: (transfer none): The parent #GstTocEntry of @entry
+ * Returns: (transfer none) (nullable): The parent #GstTocEntry of @entry
*/
GstTocEntry *
gst_toc_entry_get_parent (GstTocEntry * entry)