From: Andre Noll Date: Sun, 3 Jun 2012 09:59:42 +0000 (+0200) Subject: oggdec: Fix EOF handling on repositioning. X-Git-Tag: v0.4.11~13^2~3 X-Git-Url: http://git.tue.mpg.de/?a=commitdiff_plain;h=3f96f9c305ff0c57ef10c523a2c45a4045f32dde;p=paraslash.git 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(). --- 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;