+static void prebuffer_pre_select(struct sched *s, struct task *t)
+{
+ struct filter_node *fn = container_of(t, struct filter_node, task);
+ struct btr_node *btrn = fn->btrn;
+ size_t iqs = btr_get_input_queue_size(btrn);
+ struct private_prebuffer_data *ppd = fn->private_data;
+ struct prebuffer_filter_args_info *conf = ppd->conf;
+ struct timeval diff;
+
+ t->error = 0;
+ if (iqs == 0)
+ return;
+ if (ppd->barrier.tv_sec == 0) {
+ struct timeval tv;
+ PARA_INFO_LOG("prebuffer period %dms\n",
+ conf->duration_arg);
+ ms2tv(conf->duration_arg, &tv);
+ tv_add(&tv, now, &ppd->barrier);
+ }
+ if (tv_diff(&ppd->barrier, now, &diff) < 0)
+ goto min_delay;
+ if (tv_diff(&diff, &s->timeout, NULL) < 0)
+ s->timeout = diff;
+ return;
+min_delay:
+ s->timeout.tv_sec = 0;
+ s->timeout.tv_usec = 1;
+}
+