From 3f96f9c305ff0c57ef10c523a2c45a4045f32dde Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sun, 3 Jun 2012 11:59:42 +0200 Subject: [PATCH] oggdec: Fix EOF handling on repositioning. If playback starts near the end of the file, it might happen that (a) the read callback consumes all the remaining part in one go (so the node status is BTR_EOF) and (b) the last ov_read() returned OV_HOLE. (b) makes the decoder wait for more data which will never arrive due to (a). Currently we error out without playing the last part of the file. This patch makes ogg_post_select() return an error only if additionally fn->min_iqs == 0, which indicates we did not hit OV_HOLE during the last ov_read(). --- oggdec_filter.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/oggdec_filter.c b/oggdec_filter.c index 16c8d907..9498313c 100644 --- a/oggdec_filter.c +++ b/oggdec_filter.c @@ -208,9 +208,13 @@ static void ogg_post_select(__a_unused struct sched *s, struct task *t) char *buf; ret = btr_node_status(btrn, fn->min_iqs, BTR_NT_INTERNAL); - if (ret < 0 && ret != -E_BTR_EOF) /* fatal error */ - goto out; - if (ret <= 0 && !pod->have_more) /* nothing to do */ + if (ret < 0) { + if (ret != -E_BTR_EOF) /* fatal error */ + goto out; + if (fn->min_iqs == 0 && !pod->have_more) /* EOF */ + goto out; + /* last ov_read() returned OV_HOLE */ + } else if (ret == 0 && !pod->have_more) /* nothing to do */ goto out; if (btr_get_output_queue_size(btrn) > OGGDEC_MAX_OUTPUT_SIZE) return; -- 2.39.5