mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 05:16:13 +00:00
adapter: optimize progressive masked_scan
Retain the last scanned buffer entry and offset, so we can resume buffer scanning there in case of a typical progressive scan. Also potentially optimize _copy subsequently occurring in that area.
This commit is contained in:
parent
d5ed339f20
commit
7e23719a74
1 changed files with 32 additions and 2 deletions
|
@ -125,6 +125,9 @@ struct _GstAdapterPrivate
|
||||||
{
|
{
|
||||||
GstClockTime timestamp;
|
GstClockTime timestamp;
|
||||||
guint64 distance;
|
guint64 distance;
|
||||||
|
|
||||||
|
guint scan_offset;
|
||||||
|
GSList *scan_entry;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define _do_init(thing) \
|
#define _do_init(thing) \
|
||||||
|
@ -215,6 +218,8 @@ gst_adapter_clear (GstAdapter * adapter)
|
||||||
adapter->assembled_len = 0;
|
adapter->assembled_len = 0;
|
||||||
adapter->priv->timestamp = GST_CLOCK_TIME_NONE;
|
adapter->priv->timestamp = GST_CLOCK_TIME_NONE;
|
||||||
adapter->priv->distance = 0;
|
adapter->priv->distance = 0;
|
||||||
|
adapter->priv->scan_offset = 0;
|
||||||
|
adapter->priv->scan_entry = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
@ -241,7 +246,13 @@ copy_into_unchecked (GstAdapter * adapter, guint8 * dest, guint skip,
|
||||||
guint bsize, csize;
|
guint bsize, csize;
|
||||||
|
|
||||||
/* first step, do skipping */
|
/* first step, do skipping */
|
||||||
g = adapter->buflist;
|
/* we might well be copying where we were scanning */
|
||||||
|
if (adapter->priv->scan_entry && (adapter->priv->scan_offset <= skip)) {
|
||||||
|
g = adapter->priv->scan_entry;
|
||||||
|
skip -= adapter->priv->scan_offset;
|
||||||
|
} else {
|
||||||
|
g = adapter->buflist;
|
||||||
|
}
|
||||||
buf = g->data;
|
buf = g->data;
|
||||||
bsize = GST_BUFFER_SIZE (buf);
|
bsize = GST_BUFFER_SIZE (buf);
|
||||||
while (G_UNLIKELY (skip >= bsize)) {
|
while (G_UNLIKELY (skip >= bsize)) {
|
||||||
|
@ -352,6 +363,10 @@ gst_adapter_try_to_merge_up (GstAdapter * adapter, guint size)
|
||||||
adapter->buflist = g_slist_delete_link (adapter->buflist, adapter->buflist);
|
adapter->buflist = g_slist_delete_link (adapter->buflist, adapter->buflist);
|
||||||
g->data = head;
|
g->data = head;
|
||||||
|
|
||||||
|
/* invalidate scan position */
|
||||||
|
adapter->priv->scan_offset = 0;
|
||||||
|
adapter->priv->scan_entry = NULL;
|
||||||
|
|
||||||
g = g_slist_next (g);
|
g = g_slist_next (g);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -514,6 +529,9 @@ gst_adapter_flush_unchecked (GstAdapter * adapter, guint flush)
|
||||||
/* account for the remaining bytes */
|
/* account for the remaining bytes */
|
||||||
adapter->skip = flush;
|
adapter->skip = flush;
|
||||||
adapter->priv->distance += flush;
|
adapter->priv->distance += flush;
|
||||||
|
/* invalidate scan position */
|
||||||
|
priv->scan_offset = 0;
|
||||||
|
priv->scan_entry = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -786,12 +804,22 @@ gst_adapter_masked_scan_uint32_peek (GstAdapter * adapter, guint32 mask,
|
||||||
skip = offset + adapter->skip;
|
skip = offset + adapter->skip;
|
||||||
|
|
||||||
/* first step, do skipping and position on the first buffer */
|
/* first step, do skipping and position on the first buffer */
|
||||||
g = adapter->buflist;
|
/* optimistically assume scanning continues sequentially */
|
||||||
|
if (adapter->priv->scan_entry && (adapter->priv->scan_offset <= skip)) {
|
||||||
|
g = adapter->priv->scan_entry;
|
||||||
|
skip -= adapter->priv->scan_offset;
|
||||||
|
} else {
|
||||||
|
g = adapter->buflist;
|
||||||
|
adapter->priv->scan_offset = 0;
|
||||||
|
adapter->priv->scan_entry = NULL;
|
||||||
|
}
|
||||||
buf = g->data;
|
buf = g->data;
|
||||||
bsize = GST_BUFFER_SIZE (buf);
|
bsize = GST_BUFFER_SIZE (buf);
|
||||||
while (G_UNLIKELY (skip >= bsize)) {
|
while (G_UNLIKELY (skip >= bsize)) {
|
||||||
skip -= bsize;
|
skip -= bsize;
|
||||||
g = g_slist_next (g);
|
g = g_slist_next (g);
|
||||||
|
adapter->priv->scan_offset += bsize;
|
||||||
|
adapter->priv->scan_entry = g;
|
||||||
buf = g->data;
|
buf = g->data;
|
||||||
bsize = GST_BUFFER_SIZE (buf);
|
bsize = GST_BUFFER_SIZE (buf);
|
||||||
}
|
}
|
||||||
|
@ -825,6 +853,8 @@ gst_adapter_masked_scan_uint32_peek (GstAdapter * adapter, guint32 mask,
|
||||||
/* nothing found yet, go to next buffer */
|
/* nothing found yet, go to next buffer */
|
||||||
skip += bsize;
|
skip += bsize;
|
||||||
g = g_slist_next (g);
|
g = g_slist_next (g);
|
||||||
|
adapter->priv->scan_offset += GST_BUFFER_SIZE (buf);
|
||||||
|
adapter->priv->scan_entry = g;
|
||||||
buf = g->data;
|
buf = g->data;
|
||||||
bsize = GST_BUFFER_SIZE (buf);
|
bsize = GST_BUFFER_SIZE (buf);
|
||||||
bdata = GST_BUFFER_DATA (buf);
|
bdata = GST_BUFFER_DATA (buf);
|
||||||
|
|
Loading…
Reference in a new issue