#define GST_BUFFER_MEM_PTR(b,i) (((GstBufferImpl *)(b))->mem[i])
#define GST_BUFFER_BUFMEM(b) (((GstBufferImpl *)(b))->bufmem)
#define GST_BUFFER_META(b) (((GstBufferImpl *)(b))->item)
+#define GST_BUFFER_TAIL_META(b) (((GstBufferImpl *)(b))->tail_item)
typedef struct
{
/* FIXME, make metadata allocation more efficient by using part of the
* GstBufferImpl */
GstMetaItem *item;
+ GstMetaItem *tail_item;
} GstBufferImpl;
static gint64 meta_seq; /* 0 *//* ATOMIC */
goto init_failed;
item->seq_num = gst_atomic_int64_inc (&meta_seq);
+ item->next = NULL;
- /* and add to the list of metadata */
- item->next = GST_BUFFER_META (buffer);
- GST_BUFFER_META (buffer) = item;
+ if (!GST_BUFFER_META (buffer)) {
+ GST_BUFFER_META (buffer) = item;
+ GST_BUFFER_TAIL_META (buffer) = item;
+ } else {
+ GST_BUFFER_TAIL_META (buffer)->next = item;
+ GST_BUFFER_TAIL_META (buffer) = item;
+ }
return result;
const GstMetaInfo *info = meta->info;
/* remove from list */
+ if (GST_BUFFER_TAIL_META (buffer) == walk) {
+ if (prev != walk)
+ GST_BUFFER_TAIL_META (buffer) = prev;
+ else
+ GST_BUFFER_TAIL_META (buffer) = NULL;
+ }
+
if (GST_BUFFER_META (buffer) == walk)
GST_BUFFER_META (buffer) = walk->next;
else
prev->next = walk->next;
+
/* call free_func if any */
if (info->free_func)
info->free_func (m, buffer);
g_return_val_if_fail (!GST_META_FLAG_IS_SET (m, GST_META_FLAG_LOCKED),
FALSE);
+ if (GST_BUFFER_TAIL_META (buffer) == walk) {
+ if (prev != walk)
+ GST_BUFFER_TAIL_META (buffer) = prev;
+ else
+ GST_BUFFER_TAIL_META (buffer) = NULL;
+ }
+
/* remove from list */
if (GST_BUFFER_META (buffer) == walk)
prev = GST_BUFFER_META (buffer) = next;
gst_buffer_foreach_meta (buffer, foreach_meta_remove_one, meta3);
- fail_unless (gst_buffer_iterate_meta (buffer, &state) == (GstMeta *) meta2);
fail_unless (gst_buffer_iterate_meta (buffer, &state) == (GstMeta *) meta1);
+ fail_unless (gst_buffer_iterate_meta (buffer, &state) == (GstMeta *) meta2);
fail_unless (gst_buffer_iterate_meta (buffer, &state) == NULL);
/* clean up */
gst_buffer_foreach_meta (buffer, foreach_meta_remove_one, meta2);
- fail_unless (gst_buffer_iterate_meta (buffer, &state) == (GstMeta *) meta3);
fail_unless (gst_buffer_iterate_meta (buffer, &state) == (GstMeta *) meta1);
+ fail_unless (gst_buffer_iterate_meta (buffer, &state) == (GstMeta *) meta3);
fail_unless (gst_buffer_iterate_meta (buffer, &state) == NULL);
/* clean up */
gst_buffer_foreach_meta (buffer, foreach_meta_remove_one, meta1);
- fail_unless (gst_buffer_iterate_meta (buffer, &state) == (GstMeta *) meta3);
fail_unless (gst_buffer_iterate_meta (buffer, &state) == (GstMeta *) meta2);
+ fail_unless (gst_buffer_iterate_meta (buffer, &state) == (GstMeta *) meta3);
fail_unless (gst_buffer_iterate_meta (buffer, &state) == NULL);
/* clean up */
gst_buffer_foreach_meta (buffer, foreach_meta_remove_unpooled, NULL);
- fail_unless (gst_buffer_iterate_meta (buffer, &state) == (GstMeta *) meta5);
fail_unless (gst_buffer_iterate_meta (buffer, &state) == (GstMeta *) meta2);
+ fail_unless (gst_buffer_iterate_meta (buffer, &state) == (GstMeta *) meta5);
fail_unless (gst_buffer_iterate_meta (buffer, &state) == NULL);
/* clean up */