Commit 2ef7c8b3 authored by Wim Taymans's avatar Wim Taymans
Browse files

I think this makes a little more sense

Original commit message from CVS:
I think this makes a little more sense
parent e720f952
......@@ -39,6 +39,8 @@ enum {
static void gst_index_class_init (GstIndexClass *klass);
static void gst_index_init (GstIndex *index);
static gboolean gst_index_default_path_resolver (GstIndex *index, GstObject *writer,
gchar **writer_string, gpointer data);
static GstObject *parent_class = NULL;
static guint gst_index_signals[LAST_SIGNAL] = { 0 };
......@@ -108,6 +110,8 @@ gst_index_init (GstIndex *index)
index->writers = g_hash_table_new (NULL, NULL);
index->last_id = 0;
gst_index_set_resolver (index, gst_index_default_path_resolver, NULL);
GST_FLAG_SET (index, GST_INDEX_WRITABLE);
GST_FLAG_SET (index, GST_INDEX_READABLE);
......@@ -320,7 +324,7 @@ gst_index_add_format (GstIndex *index, gint id, GstFormat format)
g_return_val_if_fail (GST_IS_INDEX (index), NULL);
g_return_val_if_fail (format != 0, NULL);
if (!GST_INDEX_IS_WRITABLE (index))
if (!GST_INDEX_IS_WRITABLE (index) || id == -1)
return NULL;
entry = g_new0 (GstIndexEntry, 1);
......@@ -360,7 +364,7 @@ gst_index_add_id (GstIndex *index, gint id, gchar *description)
g_return_val_if_fail (GST_IS_INDEX (index), NULL);
g_return_val_if_fail (description != NULL, NULL);
if (!GST_INDEX_IS_WRITABLE (index))
if (!GST_INDEX_IS_WRITABLE (index) || id == -1)
return NULL;
entry = g_new0 (GstIndexEntry, 1);
......@@ -378,6 +382,15 @@ gst_index_add_id (GstIndex *index, gint id, gchar *description)
return entry;
}
static gboolean
gst_index_default_path_resolver (GstIndex *index, GstObject *writer,
gchar **writer_string, gpointer data)
{
*writer_string = gst_object_get_path_string (writer);
return TRUE;
}
/**
* gst_index_get_writer_id:
* @index: the index to get a unique write id for
......@@ -388,8 +401,9 @@ gst_index_add_id (GstIndex *index, gint id, gchar *description)
* should obtain a unique id. The methods to add new entries
* to the index require this id as an argument.
*
* The application or a GstIndex subclass can implement
* custom functions to map the writer object to an id.
* The application can implement a custom function to map the writer object
* to a string. That string will be used to register or look up an id
* in the index.
*
* Returns: TRUE if the writer would be mapped to an id.
*/
......@@ -397,9 +411,9 @@ gboolean
gst_index_get_writer_id (GstIndex *index, GstObject *writer, gint *id)
{
gchar *writer_string = NULL;
gboolean success = FALSE;
GstIndexEntry *entry;
GstIndexClass *iclass;
gboolean success = FALSE;
g_return_val_if_fail (GST_IS_INDEX (index), FALSE);
g_return_val_if_fail (GST_IS_OBJECT (writer), FALSE);
......@@ -407,28 +421,50 @@ gst_index_get_writer_id (GstIndex *index, GstObject *writer, gint *id)
*id = -1;
/* first try to get a previously cached id */
entry = g_hash_table_lookup (index->writers, writer);
if (entry == NULL) {
*id = index->last_id;
writer_string = gst_object_get_path_string (writer);
gst_index_add_id (index, *id, writer_string);
index->last_id++;
g_hash_table_insert (index->writers, writer, entry);
}
iclass = GST_INDEX_GET_CLASS (index);
iclass = GST_INDEX_GET_CLASS (index);
/* let the app make a string */
if (index->resolver) {
gboolean res;
if (index->resolver) {
success = index->resolver (index, writer, id, &writer_string, index->resolver_user_data);
}
res = index->resolver (index, writer, &writer_string, index->resolver_user_data);
if (!res)
return FALSE;
}
else {
g_warning ("no resolver found");
return FALSE;
}
/* if the index has a resolver, make it map this string to an id */
if (iclass->get_writer_id) {
success = iclass->get_writer_id (index, id, writer_string);
}
/* if the index could not resolve, we allocate one ourselves */
if (!success) {
*id = index->last_id++;
}
if (iclass->resolve_writer) {
success = iclass->resolve_writer (index, writer, id, &writer_string);
entry = gst_index_add_id (index, *id, writer_string);
if (!entry) {
/* index is probably not writable, make an entry anyway
* to keep it in our cache */
entry = g_new0 (GstIndexEntry, 1);
entry->type = GST_INDEX_ENTRY_ID;
entry->id = *id;
entry->data.id.description = writer_string;
}
g_hash_table_insert (index->writers, writer, entry);
}
else {
*id = entry->id;
}
return success;
return TRUE;
}
/**
......@@ -462,7 +498,7 @@ gst_index_add_association (GstIndex *index, gint id, GstAssocFlags flags,
g_return_val_if_fail (GST_IS_INDEX (index), NULL);
g_return_val_if_fail (format != 0, NULL);
if (!GST_INDEX_IS_WRITABLE (index))
if (!GST_INDEX_IS_WRITABLE (index) || id == -1)
return NULL;
va_start (args, value);
......@@ -528,7 +564,7 @@ GstIndexEntry*
gst_index_add_object (GstIndex *index, gint id, gchar *key,
GType type, gpointer object)
{
if (!GST_INDEX_IS_WRITABLE (index))
if (!GST_INDEX_IS_WRITABLE (index) || id == -1)
return NULL;
return NULL;
......@@ -563,6 +599,9 @@ gst_index_get_assoc_entry (GstIndex *index, gint id,
{
g_return_val_if_fail (GST_IS_INDEX (index), NULL);
if (id == -1)
return NULL;
return gst_index_get_assoc_entry_full (index, id, method, flags, format, value,
gst_index_compare_func, NULL);
}
......@@ -595,6 +634,9 @@ gst_index_get_assoc_entry_full (GstIndex *index, gint id,
g_return_val_if_fail (GST_IS_INDEX (index), NULL);
if (id == -1)
return NULL;
iclass = GST_INDEX_GET_CLASS (index);
if (iclass->get_assoc_entry)
......
......@@ -84,6 +84,8 @@ typedef enum {
#define GST_INDEX_FORMAT_FORMAT(entry) ((entry)->data.format.format)
#define GST_INDEX_FORMAT_KEY(entry) ((entry)->data.format.key)
#define GST_INDEX_ID_INVALID (-1)
#define GST_INDEX_ID_DESCRIPTION(entry) ((entry)->data.id.description)
struct _GstIndexEntry {
......@@ -131,7 +133,6 @@ typedef gboolean (*GstIndexFilter) (GstIndex *index,
typedef gboolean (*GstIndexResolver) (GstIndex *index,
GstObject *writer,
gint *writer_id,
gchar **writer_string,
gpointer user_data);
typedef enum {
......@@ -166,8 +167,7 @@ struct _GstIndex {
struct _GstIndexClass {
GstObjectClass parent_class;
gboolean (*resolve_writer) (GstIndex *index, GstObject *writer,
gint *writer_id, gchar **writer_string);
gboolean (*get_writer_id) (GstIndex *index, gint *writer_id, gchar *writer_string);
void (*commit) (GstIndex *index, gint id);
......
......@@ -126,8 +126,7 @@ gst_file_index_get_property (GObject *object,
GParamSpec *pspec);
static gboolean
gst_file_index_resolve_writer (GstIndex *_index, GstObject *writer,
gint *id, gchar **writer_string);
gst_file_index_get_writer_id (GstIndex *_index, gint *id, gchar *writer_string);
static void gst_file_index_commit (GstIndex *index, gint writer_id);
static void gst_file_index_add_entry (GstIndex *index, GstIndexEntry *entry);
......@@ -182,7 +181,7 @@ gst_file_index_class_init (GstFileIndexClass *klass)
gstindex_class->add_entry = gst_file_index_add_entry;
gstindex_class->get_assoc_entry = gst_file_index_get_assoc_entry;
gstindex_class->commit = gst_file_index_commit;
gstindex_class->resolve_writer = gst_file_index_resolve_writer;
gstindex_class->get_writer_id = gst_file_index_get_writer_id ;
g_object_class_install_property (gobject_class, ARG_LOCATION,
g_param_spec_string ("location", "File Location",
......@@ -212,8 +211,8 @@ gst_file_index_dispose (GObject *object)
}
static gboolean
gst_file_index_resolve_writer (GstIndex *_index, GstObject *writer,
gint *id, gchar **writer_string)
gst_file_index_get_writer_id (GstIndex *_index,
gint *id, gchar *writer_string)
{
GstFileIndex *index = GST_FILE_INDEX (_index);
GSList *pending = index->unresolved;
......@@ -225,23 +224,22 @@ gst_file_index_resolve_writer (GstIndex *_index, GstObject *writer,
g_return_val_if_fail (id, FALSE);
g_return_val_if_fail (writer_string, FALSE);
g_return_val_if_fail (*writer_string, FALSE);
index->unresolved = NULL;
for (elem = pending; elem; elem = g_slist_next (elem)) {
GstFileIndexId *ii = elem->data;
if (strcmp (ii->id_desc, *writer_string) != 0) {
if (strcmp (ii->id_desc, writer_string) != 0) {
index->unresolved = g_slist_prepend (index->unresolved, ii);
continue;
}
if (match) {
g_warning ("Duplicate matches for writer '%s'", *writer_string);
g_warning ("Duplicate matches for writer '%s'", writer_string);
continue;
}
//g_warning ("resolve %d %s", *id, *writer_string);
//g_warning ("resolve %d %s", *id, writer_string);
ii->id = *id;
g_hash_table_insert (index->id_index, id, ii);
match = TRUE;
......
......@@ -126,8 +126,7 @@ gst_file_index_get_property (GObject *object,
GParamSpec *pspec);
static gboolean
gst_file_index_resolve_writer (GstIndex *_index, GstObject *writer,
gint *id, gchar **writer_string);
gst_file_index_get_writer_id (GstIndex *_index, gint *id, gchar *writer_string);
static void gst_file_index_commit (GstIndex *index, gint writer_id);
static void gst_file_index_add_entry (GstIndex *index, GstIndexEntry *entry);
......@@ -182,7 +181,7 @@ gst_file_index_class_init (GstFileIndexClass *klass)
gstindex_class->add_entry = gst_file_index_add_entry;
gstindex_class->get_assoc_entry = gst_file_index_get_assoc_entry;
gstindex_class->commit = gst_file_index_commit;
gstindex_class->resolve_writer = gst_file_index_resolve_writer;
gstindex_class->get_writer_id = gst_file_index_get_writer_id ;
g_object_class_install_property (gobject_class, ARG_LOCATION,
g_param_spec_string ("location", "File Location",
......@@ -212,8 +211,8 @@ gst_file_index_dispose (GObject *object)
}
static gboolean
gst_file_index_resolve_writer (GstIndex *_index, GstObject *writer,
gint *id, gchar **writer_string)
gst_file_index_get_writer_id (GstIndex *_index,
gint *id, gchar *writer_string)
{
GstFileIndex *index = GST_FILE_INDEX (_index);
GSList *pending = index->unresolved;
......@@ -225,23 +224,22 @@ gst_file_index_resolve_writer (GstIndex *_index, GstObject *writer,
g_return_val_if_fail (id, FALSE);
g_return_val_if_fail (writer_string, FALSE);
g_return_val_if_fail (*writer_string, FALSE);
index->unresolved = NULL;
for (elem = pending; elem; elem = g_slist_next (elem)) {
GstFileIndexId *ii = elem->data;
if (strcmp (ii->id_desc, *writer_string) != 0) {
if (strcmp (ii->id_desc, writer_string) != 0) {
index->unresolved = g_slist_prepend (index->unresolved, ii);
continue;
}
if (match) {
g_warning ("Duplicate matches for writer '%s'", *writer_string);
g_warning ("Duplicate matches for writer '%s'", writer_string);
continue;
}
//g_warning ("resolve %d %s", *id, *writer_string);
//g_warning ("resolve %d %s", *id, writer_string);
ii->id = *id;
g_hash_table_insert (index->id_index, id, ii);
match = TRUE;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment