mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-04 01:32:42 +00:00
libs/gst/base/gsttypefindhelper.c: Sort buffer cache list by end offsets. This makes sure that we don't stop to searc...
Original commit message from CVS: * libs/gst/base/gsttypefindhelper.c: (helper_find_peek): Sort buffer cache list by end offsets. This makes sure that we don't stop to search for a cached buffer that contains the requested data too early. Also read a minimum of 4k bytes instead of 512 bytes as this is a bit more efficient. Fixes bug #459862.
This commit is contained in:
parent
f6b8cf77d9
commit
654ba215df
3 changed files with 16 additions and 10 deletions
|
@ -1,3 +1,12 @@
|
||||||
|
2008-05-16 Sebastian Dröge <slomo@circular-chaos.org>
|
||||||
|
|
||||||
|
* libs/gst/base/gsttypefindhelper.c: (helper_find_peek):
|
||||||
|
Sort buffer cache list by end offsets. This makes sure that we don't
|
||||||
|
stop to search for a cached buffer that contains the requested data
|
||||||
|
too early.
|
||||||
|
Also read a minimum of 4k bytes instead of 512 bytes as this is a bit
|
||||||
|
more efficient. Fixes bug #459862.
|
||||||
|
|
||||||
2008-05-14 Stefan Kost <ensonic@users.sf.net>
|
2008-05-14 Stefan Kost <ensonic@users.sf.net>
|
||||||
|
|
||||||
* gst/gstinfo.c:
|
* gst/gstinfo.c:
|
||||||
|
|
2
common
2
common
|
@ -1 +1 @@
|
||||||
Subproject commit d78efae300d4dff0291717ccf7a2b82c713a81ef
|
Subproject commit 3b3631082d04b426f450810e8836de94e9c5d60a
|
|
@ -111,16 +111,14 @@ helper_find_peek (gpointer data, gint64 offset, guint size)
|
||||||
guint64 buf_offset = GST_BUFFER_OFFSET (buf);
|
guint64 buf_offset = GST_BUFFER_OFFSET (buf);
|
||||||
guint buf_size = GST_BUFFER_SIZE (buf);
|
guint buf_size = GST_BUFFER_SIZE (buf);
|
||||||
|
|
||||||
|
/* buffers are kept sorted by end offset (highest first) in the list, so
|
||||||
|
* at this point we save the current position and stop searching if
|
||||||
|
* we're after the searched end offset */
|
||||||
if (buf_offset <= offset) {
|
if (buf_offset <= offset) {
|
||||||
if ((offset + size) < (buf_offset + buf_size)) {
|
if ((offset + size) < (buf_offset + buf_size)) {
|
||||||
return GST_BUFFER_DATA (buf) + (offset - buf_offset);
|
return GST_BUFFER_DATA (buf) + (offset - buf_offset);
|
||||||
}
|
}
|
||||||
/* buffers are kept sorted by offset (highest first) in the list, so
|
} else if (offset + size >= buf_offset + buf_size) {
|
||||||
* at this point we know we don't need to check the remaining buffers
|
|
||||||
* (is that correct or just a guess that we're unlikely to find a
|
|
||||||
* match further down and it's most of the time not worth going through
|
|
||||||
* the entire list? How do we know the next buffer isn't offset-N with
|
|
||||||
* a big enough size to cover the requested offset+size?) */
|
|
||||||
insert_pos = walk;
|
insert_pos = walk;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -134,7 +132,7 @@ helper_find_peek (gpointer data, gint64 offset, guint size)
|
||||||
* of the file is also not a problem here, we'll just get a truncated buffer
|
* of the file is also not a problem here, we'll just get a truncated buffer
|
||||||
* in that case (and we'll have to double-check the size we actually get
|
* in that case (and we'll have to double-check the size we actually get
|
||||||
* anyway, see below) */
|
* anyway, see below) */
|
||||||
ret = helper->func (helper->obj, offset, MAX (size, 512), &buffer);
|
ret = helper->func (helper->obj, offset, MAX (size, 4096), &buffer);
|
||||||
|
|
||||||
if (ret != GST_FLOW_OK)
|
if (ret != GST_FLOW_OK)
|
||||||
goto error;
|
goto error;
|
||||||
|
@ -157,8 +155,7 @@ helper_find_peek (gpointer data, gint64 offset, guint size)
|
||||||
/* if insert_pos is not set, our offset is bigger than the largest offset
|
/* if insert_pos is not set, our offset is bigger than the largest offset
|
||||||
* we have so far; since we keep the list sorted with highest offsets
|
* we have so far; since we keep the list sorted with highest offsets
|
||||||
* first, we need to prepend the buffer to the list */
|
* first, we need to prepend the buffer to the list */
|
||||||
/* FIXME: why not last_offset = buffer_offset + buffer_size here? */
|
helper->last_offset = GST_BUFFER_OFFSET (buffer) + GST_BUFFER_SIZE (buffer);
|
||||||
helper->last_offset = GST_BUFFER_OFFSET (buffer);
|
|
||||||
helper->buffers = g_slist_prepend (helper->buffers, buffer);
|
helper->buffers = g_slist_prepend (helper->buffers, buffer);
|
||||||
}
|
}
|
||||||
return GST_BUFFER_DATA (buffer);
|
return GST_BUFFER_DATA (buffer);
|
||||||
|
|
Loading…
Reference in a new issue