X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=flacdec_filter.c;h=6a3a8effaf83b3b9e333e429762f0ff2d3938afe;hp=b51ac3bdee671dba91dc444fdd333126a912677a;hb=da13797a119f8ce621a67145ca1c7acb8d338a3c;hpb=a1beef4331994ddeb9fe0fd9fee363bfb91875e7 diff --git a/flacdec_filter.c b/flacdec_filter.c index b51ac3bd..6a3a8eff 100644 --- a/flacdec_filter.c +++ b/flacdec_filter.c @@ -1,8 +1,4 @@ -/* - * Copyright (C) 2011-2013 Andre Noll - * - * Licensed under the GPL v2. For licencing details see COPYING. - */ +/* Copyright (C) 2011 Andre Noll , see file COPYING. */ /** \file flacdec_filter.c The flac decoder. */ @@ -12,7 +8,6 @@ #include "para.h" #include "list.h" #include "sched.h" -#include "ggo.h" #include "buffer_tree.h" #include "filter.h" #include "error.h" @@ -63,6 +58,16 @@ static FLAC__StreamDecoderReadStatus read_cb( } if (*bytes > 0) return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + /** + * Nothing was copied. If the input queue of the btrn is smaller than + * the minimal input queue size, our parent must have been gone, so + * we're not going to get more input. Since our remaining data is not + * sufficient do decode a single frame, we have an EOF condition. + */ + if (btr_get_input_queue_size(btrn) < fn->min_iqs) { + assert(btr_no_parent(btrn)); + return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; + } /* * We are kind of screwed here. Returning CONTINUE with a byte count of * zero leads to an endless loop, so we must return either EOF or @@ -200,9 +205,9 @@ static bool output_queue_full(struct btr_node *btrn) return btr_get_output_queue_size(btrn) > FLACDEC_MAX_OUTPUT_SIZE; } -static void flacdec_pre_select(struct sched *s, struct task *t) +static void flacdec_pre_select(struct sched *s, void *context) { - struct filter_node *fn = container_of(t, struct filter_node, task); + struct filter_node *fn = context; struct private_flacdec_data *pfd = fn->private_data; struct btr_node *btrn = fn->btrn; int ret; @@ -216,9 +221,9 @@ static void flacdec_pre_select(struct sched *s, struct task *t) return sched_min_delay(s); } -static int flacdec_post_select(__a_unused struct sched *s, struct task *t) +static int flacdec_post_select(__a_unused struct sched *s, void *context) { - struct filter_node *fn = container_of(t, struct filter_node, task); + struct filter_node *fn = context; struct private_flacdec_data *pfd = fn->private_data; struct btr_node *btrn = fn->btrn; int ret; @@ -248,10 +253,12 @@ static int flacdec_post_select(__a_unused struct sched *s, struct task *t) goto out; if (state == FLAC__STREAM_DECODER_ABORTED) { FLAC__stream_decoder_flush(pfd->decoder); - fn->min_iqs = pfd->unconsumed + 1; + pfd->unconsumed = 0; /* feed unconsumed bytes again */ + fn->min_iqs = btr_get_input_queue_size(btrn) + 1; ret = 1; goto out; } + pfd->have_more = true; fn->min_iqs = 0; ret = 1; out: @@ -284,18 +291,10 @@ static void flacdec_open(struct filter_node *fn) fn->min_iqs = 0; } -/** - * The init function of the flacdec filter. - * - * \param f Pointer to the filter struct to initialize. - * - * \sa filter::init. - */ -void flacdec_filter_init(struct filter *f) -{ - f->open = flacdec_open; - f->close = flacdec_close; - f->pre_select = flacdec_pre_select; - f->post_select = flacdec_post_select; - f->execute = flacdec_execute; -} +const struct filter lsg_filter_cmd_com_flacdec_user_data = { + .open = flacdec_open, + .close = flacdec_close, + .pre_select = flacdec_pre_select, + .post_select = flacdec_post_select, + .execute = flacdec_execute, +};