]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - oggdec_filter.c
Consolidate decoder code by introducing prepare_filter_node().
[paraslash.git] / oggdec_filter.c
index fc03077bf4fc65505affd7db301f0b3dae4fd67c..f968bf142b2af5afc822c69a9c6ea36469f5a9d5 100644 (file)
@@ -43,6 +43,7 @@ struct private_oggdec_data {
        unsigned int channels;
        /** Current sample rate in Hz. */
        unsigned int samplerate;
+       size_t min_iqs;
 };
 
 static size_t cb_read_nobtr(void *buf, size_t size, size_t nmemb, void *datasource)
@@ -202,12 +203,19 @@ static void ogg_post_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;
        struct btr_node *btrn = fn->btrn;
-       size_t iqs = btr_get_input_queue_size(btrn);
+       size_t iqs, len;
        int ret;
+       char *in;
 
        t->error = 0;
-       if (!pod->vf && iqs) {
-               struct oggdec_filter_args_info *conf = fn->conf;
+       ret = prepare_filter_node(btrn, pod->min_iqs);
+       if (ret < 0)
+               goto err;
+       if (ret == 0)
+               return;
+       len = btr_next_buffer(btrn, &in);
+       iqs = btr_get_input_queue_size(btrn);
+       if (!pod->vf) {
                int oret;
 
                pod->vf = para_malloc(sizeof(struct OggVorbis_File));
@@ -218,10 +226,10 @@ static void ogg_post_select(__a_unused struct sched *s, struct task *t)
                        ovc); /* the ov_open_callbacks */
                if (oret == OV_ENOTVORBIS || oret == OV_EBADHEADER) {
                        /* this might be due to the input buffer being too small */
-                       int ib = 1024 * conf->initial_buffer_arg; /* initial buffer */
-                       if (iqs < ib) {
+                       if (!btr_no_parent(btrn)) {
                                free(pod->vf);
                                pod->vf = NULL;
+                               pod->min_iqs = iqs + 1;
                                return;
                        }
                        ret = (oret == OV_ENOTVORBIS)?