From fb9970d85ad9ca8445dc0673f1dd4a51284d8e51 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 26 Dec 2002 22:35:58 +0000 Subject: [PATCH] - Added flags to lookup method so that one can search for keyframes too Original commit message from CVS: - Added flags to lookup method so that one can search for keyframes too - Updated memindex --- gst/gstindex.c | 8 ++++---- gst/gstindex.h | 9 ++++++--- gst/indexers/gstmemindex.c | 27 +++++++++++++++++++++++++-- plugins/indexers/gstmemindex.c | 27 +++++++++++++++++++++++++-- 4 files changed, 60 insertions(+), 11 deletions(-) diff --git a/gst/gstindex.c b/gst/gstindex.c index f718e7c0da..7298f0df73 100644 --- a/gst/gstindex.c +++ b/gst/gstindex.c @@ -557,12 +557,12 @@ gst_index_compare_func (gconstpointer a, */ GstIndexEntry* gst_index_get_assoc_entry (GstIndex *index, gint id, - GstIndexLookupMethod method, + GstIndexLookupMethod method, GstAssocFlags flags, GstFormat format, gint64 value) { g_return_val_if_fail (GST_IS_INDEX (index), NULL); - return gst_index_get_assoc_entry_full (index, id, method, format, value, + return gst_index_get_assoc_entry_full (index, id, method, flags, format, value, gst_index_compare_func, NULL); } @@ -584,7 +584,7 @@ gst_index_get_assoc_entry (GstIndex *index, gint id, */ GstIndexEntry* gst_index_get_assoc_entry_full (GstIndex *index, gint id, - GstIndexLookupMethod method, + GstIndexLookupMethod method, GstAssocFlags flags, GstFormat format, gint64 value, GCompareDataFunc func, gpointer user_data) @@ -596,7 +596,7 @@ gst_index_get_assoc_entry_full (GstIndex *index, gint id, iclass = GST_INDEX_GET_CLASS (index); if (iclass->get_assoc_entry) - return iclass->get_assoc_entry (index, id, method, format, value, func, user_data); + return iclass->get_assoc_entry (index, id, method, flags, format, value, func, user_data); return NULL; } diff --git a/gst/gstindex.h b/gst/gstindex.h index 8e3331f386..be7d669dbd 100644 --- a/gst/gstindex.h +++ b/gst/gstindex.h @@ -76,6 +76,9 @@ struct _GstIndexAssociation { typedef enum { GST_ACCOCIATION_FLAG_NONE = 0, GST_ACCOCIATION_FLAG_KEY_UNIT = (1 << 0), + + /* new flags should start here */ + GST_ACCOCIATION_FLAG_LAST = (1 << 8), } GstAssocFlags; #define GST_INDEX_FORMAT_FORMAT(entry) ((entry)->data.format.format) @@ -172,7 +175,7 @@ struct _GstIndexClass { void (*add_entry) (GstIndex *index, GstIndexEntry *entry); GstIndexEntry* (*get_assoc_entry) (GstIndex *index, gint id, - GstIndexLookupMethod method, + GstIndexLookupMethod method, GstAssocFlags flags, GstFormat format, gint64 value, GCompareDataFunc func, gpointer user_data); @@ -210,10 +213,10 @@ GstIndexEntry* gst_index_add_id (GstIndex *index, gint id, gchar *description); GstIndexEntry* gst_index_get_assoc_entry (GstIndex *index, gint id, - GstIndexLookupMethod method, + GstIndexLookupMethod method, GstAssocFlags flags, GstFormat format, gint64 value); GstIndexEntry* gst_index_get_assoc_entry_full (GstIndex *index, gint id, - GstIndexLookupMethod method, + GstIndexLookupMethod method, GstAssocFlags flags, GstFormat format, gint64 value, GCompareDataFunc func, gpointer user_data); diff --git a/gst/indexers/gstmemindex.c b/gst/indexers/gstmemindex.c index 1c07392661..dea42da07d 100644 --- a/gst/indexers/gstmemindex.c +++ b/gst/indexers/gstmemindex.c @@ -106,7 +106,7 @@ static void gst_mem_index_dispose (GObject *object); static void gst_mem_index_add_entry (GstIndex *index, GstIndexEntry *entry); static GstIndexEntry* gst_mem_index_get_assoc_entry (GstIndex *index, gint id, - GstIndexLookupMethod method, + GstIndexLookupMethod method, GstAssocFlags flags, GstFormat format, gint64 value, GCompareDataFunc func, gpointer user_data); @@ -332,7 +332,8 @@ mem_index_search (gconstpointer a, static GstIndexEntry* gst_mem_index_get_assoc_entry (GstIndex *index, gint id, - GstIndexLookupMethod method, + GstIndexLookupMethod method, + GstAssocFlags flags, GstFormat format, gint64 value, GCompareDataFunc func, gpointer user_data) @@ -375,6 +376,28 @@ gst_mem_index_get_assoc_entry (GstIndex *index, gint id, } } + if (entry) { + if ((GST_INDEX_ASSOC_FLAGS (entry) & flags) != flags) { + GList *l_entry = g_list_find (memindex->associations, entry); + + entry = NULL; + + while (l_entry) { + entry = (GstIndexEntry *) l_entry->data; + + if (entry->id == id && + (GST_INDEX_ASSOC_FLAGS (entry) & flags) == flags) + break; + + if (method == GST_INDEX_LOOKUP_BEFORE) + l_entry = g_list_next (l_entry); + else if (method == GST_INDEX_LOOKUP_AFTER) { + l_entry = g_list_previous (l_entry); + } + } + } + } + return entry; } diff --git a/plugins/indexers/gstmemindex.c b/plugins/indexers/gstmemindex.c index 1c07392661..dea42da07d 100644 --- a/plugins/indexers/gstmemindex.c +++ b/plugins/indexers/gstmemindex.c @@ -106,7 +106,7 @@ static void gst_mem_index_dispose (GObject *object); static void gst_mem_index_add_entry (GstIndex *index, GstIndexEntry *entry); static GstIndexEntry* gst_mem_index_get_assoc_entry (GstIndex *index, gint id, - GstIndexLookupMethod method, + GstIndexLookupMethod method, GstAssocFlags flags, GstFormat format, gint64 value, GCompareDataFunc func, gpointer user_data); @@ -332,7 +332,8 @@ mem_index_search (gconstpointer a, static GstIndexEntry* gst_mem_index_get_assoc_entry (GstIndex *index, gint id, - GstIndexLookupMethod method, + GstIndexLookupMethod method, + GstAssocFlags flags, GstFormat format, gint64 value, GCompareDataFunc func, gpointer user_data) @@ -375,6 +376,28 @@ gst_mem_index_get_assoc_entry (GstIndex *index, gint id, } } + if (entry) { + if ((GST_INDEX_ASSOC_FLAGS (entry) & flags) != flags) { + GList *l_entry = g_list_find (memindex->associations, entry); + + entry = NULL; + + while (l_entry) { + entry = (GstIndexEntry *) l_entry->data; + + if (entry->id == id && + (GST_INDEX_ASSOC_FLAGS (entry) & flags) == flags) + break; + + if (method == GST_INDEX_LOOKUP_BEFORE) + l_entry = g_list_next (l_entry); + else if (method == GST_INDEX_LOOKUP_AFTER) { + l_entry = g_list_previous (l_entry); + } + } + } + } + return entry; }