[pulseaudio-commits] 3 commits - src/pulsecore

Tanu Kaskinen tanuk at kemper.freedesktop.org
Mon Nov 11 03:14:12 PST 2013


 src/pulsecore/resampler.c |  106 +++++++++++++++++++---------------------------
 1 file changed, 44 insertions(+), 62 deletions(-)

New commits:
commit d0fd59c34c6745fe62db6cc0f44b1a1004ea8f47
Author: Peter Meerwald <pmeerw at pmeerw.net>
Date:   Sun Jul 21 23:14:45 2013 +0200

    resampler: Cleanup, index of memchunks is not used
    
    Signed-off-by: Peter Meerwald <pmeerw at pmeerw.net>

diff --git a/src/pulsecore/resampler.c b/src/pulsecore/resampler.c
index 638b53f..3ac8f5e 100644
--- a/src/pulsecore/resampler.c
+++ b/src/pulsecore/resampler.c
@@ -1168,7 +1168,6 @@ static pa_memchunk* convert_to_work_format(pa_resampler *r, pa_memchunk *input)
 
     n_samples = (unsigned) ((input->length / r->i_fz) * r->i_ss.channels);
 
-    r->to_work_format_buf.index = 0;
     r->to_work_format_buf.length = r->w_sz * n_samples;
     r->to_work_format_buf_size = fit_buf(r, &r->to_work_format_buf, r->to_work_format_buf_size);
 
@@ -1283,7 +1282,6 @@ static pa_memchunk *resample(pa_resampler *r, pa_memchunk *input) {
 
     out_n_frames = ((in_n_frames*r->o_ss.rate)/r->i_ss.rate)+EXTRA_FRAMES;
 
-    r->resample_buf.index = 0;
     r->resample_buf.length = r->w_fz * out_n_frames;
     r->resample_buf_size = fit_buf(r, &r->resample_buf, r->resample_buf_size);
 
@@ -1316,7 +1314,6 @@ static pa_memchunk *convert_from_work_format(pa_resampler *r, pa_memchunk *input
     n_samples = (unsigned) (input->length / r->w_sz);
     n_frames = n_samples / r->o_ss.channels;
 
-    r->from_work_format_buf.index = 0;
     r->from_work_format_buf.length = r->o_fz * n_frames;
     r->from_work_format_buf_size = fit_buf(r, &r->from_work_format_buf, r->from_work_format_buf_size);
 

commit b14e9c0a6cdc93b022892f4be2a989c12e71355e
Author: Peter Meerwald <pmeerw at pmeerw.net>
Date:   Sun Jul 21 23:14:44 2013 +0200

    resampler: Prepare to have leftover data in different output buffers
    
    leftover_buf points to the output buffer of a stage containing leftover
    data; similar for leftover_buf_size and have_leftover
    
    Signed-off-by: Peter Meerwald <pmeerw at pmeerw.net>

diff --git a/src/pulsecore/resampler.c b/src/pulsecore/resampler.c
index 1becd5c..638b53f 100644
--- a/src/pulsecore/resampler.c
+++ b/src/pulsecore/resampler.c
@@ -64,7 +64,14 @@ struct pa_resampler {
     size_t remap_buf_size;
     size_t resample_buf_size;
     size_t from_work_format_buf_size;
-    bool remap_buf_contains_leftover_data;
+
+    /* points to buffer before resampling stage, remap */
+    pa_memchunk *leftover_buf;
+    size_t *leftover_buf_size;
+
+    /* have_leftover points to leftover_in_remap */
+    bool *have_leftover;
+    bool leftover_in_remap;
 
     pa_sample_format_t work_format;
     uint8_t work_channels;
@@ -421,6 +428,11 @@ pa_resampler* pa_resampler_new(
         }
     }
 
+    /* leftover buffer is the buffer before the resampling stage */
+    r->leftover_buf = &r->remap_buf;
+    r->leftover_buf_size = &r->remap_buf_size;
+    r->have_leftover = &r->leftover_in_remap;
+
     r->work_channels = r->o_ss.channels;
     r->w_fz = pa_sample_size_of_format(r->work_format) * r->work_channels;
 
@@ -506,9 +518,8 @@ size_t pa_resampler_result(pa_resampler *r, size_t in_length) {
      * enough output buffer. */
 
     frames = (in_length + r->i_fz - 1) / r->i_fz;
-
-    if (r->remap_buf_contains_leftover_data)
-        frames += r->remap_buf.length / r->w_fz;
+    if (*r->have_leftover)
+        frames += r->leftover_buf->length / r->w_fz;
 
     return (((uint64_t) frames * r->o_ss.rate + r->i_ss.rate - 1) / r->i_ss.rate) * r->o_fz;
 }
@@ -536,8 +547,9 @@ size_t pa_resampler_max_block_size(pa_resampler *r) {
     max_fs = pa_frame_size(&max_ss);
     frames = block_size_max / max_fs - EXTRA_FRAMES;
 
-    if (r->remap_buf_contains_leftover_data)
-        frames -= r->remap_buf.length / r->w_fz;
+    pa_assert(frames >= (r->leftover_buf->length / r->w_fz));
+    if (*r->have_leftover)
+        frames -= r->leftover_buf->length / r->w_fz;
 
     block_size_max = ((uint64_t) frames * r->i_ss.rate / max_ss.rate) * r->i_fz;
 
@@ -564,7 +576,7 @@ void pa_resampler_reset(pa_resampler *r) {
     if (r->impl.reset)
         r->impl.reset(r);
 
-    r->remap_buf_contains_leftover_data = false;
+    *r->have_leftover = false;
 }
 
 pa_resample_method_t pa_resampler_get_method(pa_resampler *r) {
@@ -1185,8 +1197,8 @@ static pa_memchunk *remap_channels(pa_resampler *r, pa_memchunk *input) {
      * data in the beginning of remap_buf. The leftover data is already
      * remapped, so it's not part of the input, it's part of the output. */
 
-    have_leftover = r->remap_buf_contains_leftover_data;
-    r->remap_buf_contains_leftover_data = false;
+    have_leftover = r->leftover_in_remap;
+    r->leftover_in_remap = false;
 
     if (!have_leftover && (!r->map_required || input->length <= 0))
         return input;
@@ -1218,7 +1230,6 @@ static pa_memchunk *remap_channels(pa_resampler *r, pa_memchunk *input) {
             r->remap_buf.memblock = new_block;
             r->remap_buf_size = r->remap_buf.length;
         }
-
     } else
         r->remap_buf_size = fit_buf(r, &r->remap_buf, r->remap_buf_size);
 
@@ -1247,16 +1258,14 @@ static void save_leftover(pa_resampler *r, void *buf, size_t len) {
     pa_assert(buf);
     pa_assert(len > 0);
 
-    /* Store the leftover to remap_buf. */
-
-    r->remap_buf.length = len;
-    r->remap_buf_size = fit_buf(r, &r->remap_buf, r->remap_buf_size);
-
-    dst = pa_memblock_acquire(r->remap_buf.memblock);
-    memcpy(dst, buf, r->remap_buf.length);
-    pa_memblock_release(r->remap_buf.memblock);
+    /* Store the leftover data. */
+    r->leftover_buf->length = len;
+    *r->leftover_buf_size = fit_buf(r, r->leftover_buf, *r->leftover_buf_size);
+    *r->have_leftover = true;
 
-    r->remap_buf_contains_leftover_data = true;
+    dst = pa_memblock_acquire(r->leftover_buf->memblock);
+    memmove(dst, buf, len);
+    pa_memblock_release(r->leftover_buf->memblock);
 }
 
 static pa_memchunk *resample(pa_resampler *r, pa_memchunk *input) {

commit 0109a50a2d68b5cd3c8c654667d384fc24825ca4
Author: Peter Meerwald <pmeerw at pmeerw.net>
Date:   Sun Jul 21 23:14:43 2013 +0200

    resampler: Add fit_buf() helper funtion for buffer allocation
    
    Signed-off-by: Peter Meerwald <pmeerw at pmeerw.net>

diff --git a/src/pulsecore/resampler.c b/src/pulsecore/resampler.c
index 856fd29..1becd5c 100644
--- a/src/pulsecore/resampler.c
+++ b/src/pulsecore/resampler.c
@@ -1129,6 +1129,17 @@ static void calc_map_table(pa_resampler *r) {
     pa_init_remap(m);
 }
 
+static size_t fit_buf(pa_resampler *r, pa_memchunk *buf, size_t size) {
+    if (!buf->memblock || size < buf->length) {
+        size = buf->length;
+        if (buf->memblock)
+            pa_memblock_unref(buf->memblock);
+
+        buf->memblock = pa_memblock_new(r->mempool, size);
+    }
+    return size;
+}
+
 static pa_memchunk* convert_to_work_format(pa_resampler *r, pa_memchunk *input) {
     unsigned n_samples;
     void *src, *dst;
@@ -1147,14 +1158,7 @@ static pa_memchunk* convert_to_work_format(pa_resampler *r, pa_memchunk *input)
 
     r->to_work_format_buf.index = 0;
     r->to_work_format_buf.length = r->w_sz * n_samples;
-
-    if (!r->to_work_format_buf.memblock || r->to_work_format_buf_size < r->to_work_format_buf.length) {
-        if (r->to_work_format_buf.memblock)
-            pa_memblock_unref(r->to_work_format_buf.memblock);
-
-        r->to_work_format_buf_size = r->to_work_format_buf.length;
-        r->to_work_format_buf.memblock = pa_memblock_new(r->mempool, r->to_work_format_buf.length);
-    }
+    r->to_work_format_buf_size = fit_buf(r, &r->to_work_format_buf, r->to_work_format_buf_size);
 
     src = pa_memblock_acquire_chunk(input);
     dst = pa_memblock_acquire(r->to_work_format_buf.memblock);
@@ -1215,15 +1219,8 @@ static pa_memchunk *remap_channels(pa_resampler *r, pa_memchunk *input) {
             r->remap_buf_size = r->remap_buf.length;
         }
 
-    } else {
-        if (!r->remap_buf.memblock || r->remap_buf_size < r->remap_buf.length) {
-            if (r->remap_buf.memblock)
-                pa_memblock_unref(r->remap_buf.memblock);
-
-            r->remap_buf_size = r->remap_buf.length;
-            r->remap_buf.memblock = pa_memblock_new(r->mempool, r->remap_buf.length);
-        }
-    }
+    } else
+        r->remap_buf_size = fit_buf(r, &r->remap_buf, r->remap_buf_size);
 
     src = pa_memblock_acquire_chunk(input);
     dst = (uint8_t *) pa_memblock_acquire(r->remap_buf.memblock) + leftover_length;
@@ -1253,14 +1250,7 @@ static void save_leftover(pa_resampler *r, void *buf, size_t len) {
     /* Store the leftover to remap_buf. */
 
     r->remap_buf.length = len;
-
-    if (!r->remap_buf.memblock || r->remap_buf_size < r->remap_buf.length) {
-        if (r->remap_buf.memblock)
-            pa_memblock_unref(r->remap_buf.memblock);
-
-        r->remap_buf_size = r->remap_buf.length;
-        r->remap_buf.memblock = pa_memblock_new(r->mempool, r->remap_buf.length);
-    }
+    r->remap_buf_size = fit_buf(r, &r->remap_buf, r->remap_buf_size);
 
     dst = pa_memblock_acquire(r->remap_buf.memblock);
     memcpy(dst, buf, r->remap_buf.length);
@@ -1286,14 +1276,7 @@ static pa_memchunk *resample(pa_resampler *r, pa_memchunk *input) {
 
     r->resample_buf.index = 0;
     r->resample_buf.length = r->w_fz * out_n_frames;
-
-    if (!r->resample_buf.memblock || r->resample_buf_size < r->resample_buf.length) {
-        if (r->resample_buf.memblock)
-            pa_memblock_unref(r->resample_buf.memblock);
-
-        r->resample_buf_size = r->resample_buf.length;
-        r->resample_buf.memblock = pa_memblock_new(r->mempool, r->resample_buf.length);
-    }
+    r->resample_buf_size = fit_buf(r, &r->resample_buf, r->resample_buf_size);
 
     leftover_n_frames = r->impl.resample(r, input, in_n_frames, &r->resample_buf, &out_n_frames);
 
@@ -1326,14 +1309,7 @@ static pa_memchunk *convert_from_work_format(pa_resampler *r, pa_memchunk *input
 
     r->from_work_format_buf.index = 0;
     r->from_work_format_buf.length = r->o_fz * n_frames;
-
-    if (!r->from_work_format_buf.memblock || r->from_work_format_buf_size < r->from_work_format_buf.length) {
-        if (r->from_work_format_buf.memblock)
-            pa_memblock_unref(r->from_work_format_buf.memblock);
-
-        r->from_work_format_buf_size = r->from_work_format_buf.length;
-        r->from_work_format_buf.memblock = pa_memblock_new(r->mempool, r->from_work_format_buf.length);
-    }
+    r->from_work_format_buf_size = fit_buf(r, &r->from_work_format_buf, r->from_work_format_buf_size);
 
     src = pa_memblock_acquire_chunk(input);
     dst = pa_memblock_acquire(r->from_work_format_buf.memblock);



More information about the pulseaudio-commits mailing list