From 7fdd2f129ac59e4f57d9683e7ff0ad6076fbad23 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Mon, 17 Jan 2011 08:32:52 +0100 Subject: [PATCH] oggdec: Replace stream start delay by minimum input queue size. Waiting 300ms at stream start is both ugly and unnecessary if playback does not start in the middle of the stream. This patch removes the ->stream_start member of struct private_oggdec_data and delays plaback only if ov_read returns OV_HOLE, i.e. if streaming does not start at the beginning of the file. This delay is enforced by setting the minimal input queue size. --- oggdec_filter.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/oggdec_filter.c b/oggdec_filter.c index 1bc6d2f7..67cbf97e 100644 --- a/oggdec_filter.c +++ b/oggdec_filter.c @@ -35,7 +35,6 @@ struct private_oggdec_data { /** The number of channels of the current stream. */ unsigned int channels; /** Current sample rate in Hz. */ - struct timeval stream_start; unsigned int sample_rate; }; @@ -167,7 +166,6 @@ open: goto out; pod->channels = ov_info(pod->vf, 0)->channels; pod->sample_rate = ov_info(pod->vf, 0)->rate; - tv_add(now, &(struct timeval)EMBRACE(0, 300 * 1000), &pod->stream_start); PARA_NOTICE_LOG("%d channels, %d Hz\n", pod->channels, pod->sample_rate); ret = 1; @@ -186,15 +184,14 @@ out: static void ogg_pre_select(__a_unused struct sched *s, struct task *t) { struct filter_node *fn = container_of(t, struct filter_node, task); - struct private_oggdec_data *pod = fn->private_data; int ret; t->error = 0; ret = btr_node_status(fn->btrn, fn->min_iqs, BTR_NT_INTERNAL); - if (ret < 0) + if (ret != 0) sched_min_delay(s); else - sched_request_barrier(&pod->stream_start, s); + sched_request_timeout_ms(100, s); } static void ogg_post_select(__a_unused struct sched *s, struct task *t) @@ -204,11 +201,11 @@ static void ogg_post_select(__a_unused struct sched *s, struct task *t) struct btr_node *btrn = fn->btrn; int ret, ns; - if (tv_diff(&pod->stream_start, now, NULL) > 0) - return; pod->converted = 0; t->error = 0; ret = ns = btr_node_status(btrn, fn->min_iqs, BTR_NT_INTERNAL); + if (ret <= 0) + goto out; if (!pod->vf) { if (ret <= 0) goto out; @@ -226,12 +223,15 @@ static void ogg_post_select(__a_unused struct sched *s, struct task *t) if (read_ret <= 0) free(out); ret = ns; + if (read_ret == OV_HOLE) /* avoid buffer underruns */ + fn->min_iqs = 9000; if (read_ret == 0 || read_ret == OV_HOLE) goto out; ret = -E_OGGDEC_BADLINK; if (read_ret < 0) goto out; btr_add_output(out, read_ret, btrn); + fn->min_iqs = 0; if (btr_get_output_queue_size(btrn) > 128 * 1024) return; /* enough data for the moment */ } -- 2.39.5