summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Kausch <robert.kausch@freac.org>2020-10-29 20:37:40 +0100
committerErik de Castro Lopo <erikd@mega-nerd.com>2021-03-15 13:46:20 +1100
commit159cd6c41a6ec17b36d74043c45a3aa64de90d5e (patch)
tree2594af149daf2af8a36455029189e06a53747897
parentbfd4f13f3eb1f4d4f9f723e343f63eceedb267ba (diff)
downloadflac-159cd6c41a6ec17b36d74043c45a3aa64de90d5e.tar.gz
libFLAC/stream_decoder.c: Use current position as bound when seeking
-rw-r--r--src/libFLAC/stream_decoder.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/libFLAC/stream_decoder.c b/src/libFLAC/stream_decoder.c
index 5928bbeb..aa63b2ca 100644
--- a/src/libFLAC/stream_decoder.c
+++ b/src/libFLAC/stream_decoder.c
@@ -3032,15 +3032,26 @@ FLAC__bool seek_to_absolute_sample_(FLAC__StreamDecoder *decoder, FLAC__uint64 s
/*
* First, we set an upper and lower bound on where in the
- * stream we will search. For now we assume the worst case
- * scenario, which is our best guess at the beginning of
- * the first frame and end of the stream.
+ * stream we will search. For now we take the current position
+ * as one bound and, depending on where the target position lies,
+ * the beginning of the first frame or the end of the stream as
+ * the other bound.
*/
lower_bound = first_frame_offset;
lower_bound_sample = 0;
upper_bound = stream_length;
upper_bound_sample = total_samples > 0 ? total_samples : target_sample /*estimate it*/;
+ if(decoder->protected_->state == FLAC__STREAM_DECODER_READ_FRAME) {
+ if(target_sample < decoder->private_->samples_decoded) {
+ if(FLAC__stream_decoder_get_decode_position(decoder, &upper_bound))
+ upper_bound_sample = decoder->private_->samples_decoded;
+ } else {
+ if(FLAC__stream_decoder_get_decode_position(decoder, &lower_bound))
+ lower_bound_sample = decoder->private_->samples_decoded;
+ }
+ }
+
/*
* Now we refine the bounds if we have a seektable with
* suitable points. Note that according to the spec they