summaryrefslogtreecommitdiffstats
path: root/gst/avi
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2009-05-11 16:50:48 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2009-05-11 16:50:48 +0200
commit97fa58f397157c2e5392a7c0c7edc66b1c18307c (patch)
tree50253ca0fdbbff858a857c9a2f1dac557b8c10ac /gst/avi
parente4909b37ebb96d19d4708c9395ecd4b53a7f4763 (diff)
avidemux: Use binary search for finding the requested index entry when seeking
Diffstat (limited to 'gst/avi')
-rw-r--r--gst/avi/gstavidemux.c44
1 files changed, 27 insertions, 17 deletions
diff --git a/gst/avi/gstavidemux.c b/gst/avi/gstavidemux.c
index 4d961b67..7f17f25e 100644
--- a/gst/avi/gstavidemux.c
+++ b/gst/avi/gstavidemux.c
@@ -326,6 +326,16 @@ gst_avi_demux_index_prev (GstAviDemux * avi, gint stream_nr, gint last,
return result;
}
+static gint
+gst_avi_demux_index_entry_search (gst_avi_index_entry * entry, guint64 * time)
+{
+ if (entry->ts < *time)
+ return -1;
+ else if (entry->ts > *time)
+ return 1;
+ return 0;
+}
+
/*
* gst_avi_index_entry:
* @avi: Avi object
@@ -340,30 +350,30 @@ static gst_avi_index_entry *
gst_avi_demux_index_entry_for_time (GstAviDemux * avi,
gint stream_nr, guint64 time)
{
- gst_avi_index_entry *entry = NULL, *last_entry = NULL;
- gint i;
+ gst_avi_index_entry *entry = NULL;
+ guint n;
GST_LOG_OBJECT (avi, "stream_nr:%d , time:%" GST_TIME_FORMAT,
stream_nr, GST_TIME_ARGS (time));
- for (i = 0; i < avi->index_size; i++) {
- entry = &avi->index_entries[i];
+ entry = gst_util_array_binary_search (avi->index_entries,
+ avi->index_size,
+ sizeof (gst_avi_index_entry),
+ (GCompareDataFunc) gst_avi_demux_index_entry_search,
+ GST_SEARCH_MODE_BEFORE, &time, NULL);
- if (entry->stream_nr != stream_nr)
- continue;
-
- if (entry->ts > time)
- break;
-
- last_entry = entry;
-
- GST_LOG_OBJECT (avi,
- "best at entry %d / ts:%" GST_TIME_FORMAT " / dur:%" GST_TIME_FORMAT
- " flags:%02x", i, GST_TIME_ARGS (entry->ts), GST_TIME_ARGS (entry->dur),
- entry->flags);
+ n = (entry - avi->index_entries) / sizeof (gst_avi_index_entry);
+ while (entry->stream_nr != stream_nr && n > 0) {
+ n--;
+ entry = &avi->index_entries[n];
}
- return last_entry;
+ GST_LOG_OBJECT (avi,
+ "best at entry %u / ts:%" GST_TIME_FORMAT " / dur:%" GST_TIME_FORMAT
+ " flags:%02x", n, GST_TIME_ARGS (entry->ts), GST_TIME_ARGS (entry->dur),
+ entry->flags);
+
+ return entry;
}
/* GstElement methods */