mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 16:50:47 +00:00
queue2: Fix a special case during range management
When a range contained no data, if it was new or newly empty, it would be mishandled if it were the current range.
This commit is contained in:
parent
414911b90a
commit
dec12cb2b8
1 changed files with 22 additions and 9 deletions
|
@ -493,9 +493,12 @@ debug_ranges (GstQueue2 * queue)
|
||||||
GstQueue2Range *walk;
|
GstQueue2Range *walk;
|
||||||
|
|
||||||
for (walk = queue->ranges; walk; walk = walk->next) {
|
for (walk = queue->ranges; walk; walk = walk->next) {
|
||||||
GST_DEBUG_OBJECT (queue, "range %" G_GUINT64_FORMAT "-%" G_GUINT64_FORMAT
|
GST_DEBUG_OBJECT (queue,
|
||||||
", reading %" G_GUINT64_FORMAT, walk->offset, walk->writing_pos,
|
"range [%" G_GUINT64_FORMAT "-%" G_GUINT64_FORMAT "] (rb [%"
|
||||||
walk->reading_pos);
|
G_GUINT64_FORMAT "-%" G_GUINT64_FORMAT "]), reading %" G_GUINT64_FORMAT
|
||||||
|
" current range? %s", walk->offset, walk->writing_pos, walk->rb_offset,
|
||||||
|
walk->rb_writing_pos, walk->reading_pos,
|
||||||
|
walk == queue->current ? "**y**" : " n ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1170,8 +1173,8 @@ gst_queue2_create_read (GstQueue2 * queue, guint64 offset, guint length,
|
||||||
/* we don't have the data but if we have a ring buffer that is full, we
|
/* we don't have the data but if we have a ring buffer that is full, we
|
||||||
* need to read */
|
* need to read */
|
||||||
GST_DEBUG_OBJECT (queue,
|
GST_DEBUG_OBJECT (queue,
|
||||||
"ring buffer full, reading ring-buffer-max-size %d bytes",
|
"ring buffer full, reading ring-buffer-max-size %"
|
||||||
rb_size);
|
G_GUINT64_FORMAT " bytes", rb_size);
|
||||||
read_length = rb_size;
|
read_length = rb_size;
|
||||||
} else if (queue->is_eos) {
|
} else if (queue->is_eos) {
|
||||||
/* won't get any more data so read any data we have */
|
/* won't get any more data so read any data we have */
|
||||||
|
@ -1536,13 +1539,23 @@ gst_queue2_create_write (GstQueue2 * queue, GstBuffer * buffer)
|
||||||
guint64 range_data_start, range_data_end;
|
guint64 range_data_start, range_data_end;
|
||||||
GstQueue2Range *range_to_destroy = NULL;
|
GstQueue2Range *range_to_destroy = NULL;
|
||||||
|
|
||||||
/* we don't edit the current range here */
|
|
||||||
if (range == queue->current)
|
|
||||||
goto next_range;
|
|
||||||
|
|
||||||
range_data_start = range->rb_offset;
|
range_data_start = range->rb_offset;
|
||||||
range_data_end = range->rb_writing_pos;
|
range_data_end = range->rb_writing_pos;
|
||||||
|
|
||||||
|
/* handle the special case where the range has no data in it */
|
||||||
|
if (range->writing_pos == range->offset) {
|
||||||
|
if (range != queue->current) {
|
||||||
|
GST_DEBUG_OBJECT (queue,
|
||||||
|
"Removing range: offset %" G_GUINT64_FORMAT ", wpos %"
|
||||||
|
G_GUINT64_FORMAT, range->offset, range->writing_pos);
|
||||||
|
/* remove range */
|
||||||
|
range_to_destroy = range;
|
||||||
|
if (prev)
|
||||||
|
prev->next = range->next;
|
||||||
|
}
|
||||||
|
goto next_range;
|
||||||
|
}
|
||||||
|
|
||||||
if (range_data_end > range_data_start) {
|
if (range_data_end > range_data_start) {
|
||||||
if (writing_pos >= range_data_end && new_writing_pos >= writing_pos)
|
if (writing_pos >= range_data_end && new_writing_pos >= writing_pos)
|
||||||
goto next_range;
|
goto next_range;
|
||||||
|
|
Loading…
Reference in a new issue