[pulseaudio-discuss] [PATCH v2 3/3] resampler: Add support for resamplers that consume less data than asked.

Wang Xingchao wangxingchao2011 at gmail.com
Tue May 1 19:44:46 PDT 2012


Hi Tanu,

2012/4/25 Tanu Kaskinen <tanuk at iki.fi>:
> libsamplerate_resample() assumed that src_process() would
> always consume the whole input buffer. That was an invalid
> assumption leading to crashes.
>
> This patch adds a leftover memchunk for storing any
> non-consumed input. When pa_resampler_run() is called next
> time, the leftover is prepended to the new input.
>
> Changes in v2:
>  - If add_leftover() is called with zero-length input while
>   the leftover length is non-zero, we don't try to acquire
>   the input memblock.
>  - Instead of taking a reference to the original input in
>   libsamplerate_resample(), we copy the leftover data to a
>   new memblock. This is done, because otherwise, if the
>   input is one of the internal buffers, the data can get
>   overwritten before reading it in add_leftover().
>  - Store add_leftover_buf size in bytes instead of samples
>   (more convenient, but less consistent with other code).
>
> BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=47156
[snip]

> +static pa_memchunk *add_leftover(pa_resampler *r, pa_memchunk *input) {
> +    void *src;
> +    void *dst;
> +
> +    pa_assert(r);
> +    pa_assert(input);
> +
> +    /* Concatenate leftover and input and place the result in
> +     * add_leftover_buf. */
> +
> +    if (r->leftover_buf.length <= 0)
> +        return input;
> +
> +    r->add_leftover_buf.length = r->leftover_buf.length + input->length;
> +
> +    if (!r->add_leftover_buf.memblock || r->add_leftover_buf_bytes < r->add_leftover_buf.length) {
> +        if (r->add_leftover_buf.memblock)
> +            pa_memblock_unref(r->add_leftover_buf.memblock);
> +
> +        r->add_leftover_buf_bytes = r->add_leftover_buf.length;
> +        r->add_leftover_buf.memblock = pa_memblock_new(r->mempool, r->add_leftover_buf.length);
> +    }
> +
> +    src = (uint8_t *) pa_memblock_acquire(r->leftover_buf.memblock);
> +    dst = pa_memblock_acquire(r->add_leftover_buf.memblock);
> +    memcpy(dst, src, r->leftover_buf.length);
> +    pa_memblock_release(r->leftover_buf.memblock);
> +
> +    if (input->length > 0) {
> +        src = (uint8_t *) pa_memblock_acquire(input->memblock) + input->index;
> +        dst = (uint8_t *) dst + r->leftover_buf.length;
> +        memcpy(dst, src, input->length);
> +        pa_memblock_release(input->memblock);
> +    }
> +

it's a bit different with original
patch(https://bugs.freedesktop.org/attachment.cgi?id=60461). :)  i
guess most of time the leftover buffer length should be little, and
the main input buffer is bigger, so there're two times waste copy  and
why not reduce that to one time copy?

thanks
--xingchao


More information about the pulseaudio-discuss mailing list