X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=flacdec_filter.c;h=bf881725165f38415267193473f56bc145dc2b5c;hp=b51ac3bdee671dba91dc444fdd333126a912677a;hb=994e7207f84d7c18e0d78484d431df93d973e83e;hpb=a1beef4331994ddeb9fe0fd9fee363bfb91875e7 diff --git a/flacdec_filter.c b/flacdec_filter.c index b51ac3bd..bf881725 100644 --- a/flacdec_filter.c +++ b/flacdec_filter.c @@ -63,6 +63,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 @@ -248,10 +258,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: