From dc61d27b5e6b321067e38cb830ead225ae0b9829 Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Mon, 1 Feb 2010 11:23:54 +0000 Subject: Ticket #766: - Applied patch provided by Bram Kuijvenhoven related to truncation issue in floating-point to integer type-casts in pjmedia components. - Original patch proposal and description can be found here: http://lists.pjsip.org/pipermail/pjsip_lists.pjsip.org/2010-January/010258.html. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3085 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/src/pjmedia/conference.c | 8 ++++---- pjmedia/src/pjmedia/resample_resample.c | 4 ++-- third_party/resample/src/resamplesubs.c | 12 ++++++++---- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/pjmedia/src/pjmedia/conference.c b/pjmedia/src/pjmedia/conference.c index fd237aa4..fd6477ce 100644 --- a/pjmedia/src/pjmedia/conference.c +++ b/pjmedia/src/pjmedia/conference.c @@ -372,7 +372,7 @@ static pj_status_t create_conf_port( pj_pool_t *pool, //conf_port->rx_buf_cap = (unsigned)(conf_port->samples_per_frame + // conf->samples_per_frame * // conf_port->clock_rate * 1.0 / - // conf->clock_rate); + // conf->clock_rate + 0.5); conf_port->rx_buf_cap = conf_port->clock_rate * buff_ptime / 1000; if (conf_port->channel_count > conf->channel_count) conf_port->rx_buf_cap *= conf_port->channel_count; @@ -1437,7 +1437,7 @@ static pj_status_t read_port( pjmedia_conf *conf, */ samples_req = (unsigned) (count * 1.0 * - cport->clock_rate / conf->clock_rate); + cport->clock_rate / conf->clock_rate + 0.5); while (cport->rx_buf_count < samples_req) { @@ -1509,7 +1509,7 @@ static pj_status_t read_port( pjmedia_conf *conf, pjmedia_resample_run( cport->rx_resample,cport->rx_buf, frame); src_count = (unsigned)(count * 1.0 * cport->clock_rate / - conf->clock_rate); + conf->clock_rate + 0.5); cport->rx_buf_count -= src_count; if (cport->rx_buf_count) { pjmedia_move_samples(cport->rx_buf, cport->rx_buf+src_count, @@ -1693,7 +1693,7 @@ static pj_status_t write_port(pjmedia_conf *conf, struct conf_port *cport, pjmedia_resample_run( cport->tx_resample, buf, cport->tx_buf + cport->tx_buf_count ); dst_count = (unsigned)(conf->samples_per_frame * 1.0 * - cport->clock_rate / conf->clock_rate); + cport->clock_rate / conf->clock_rate + 0.5); } else { /* Same clock rate. * Just copy the samples to tx_buffer. diff --git a/pjmedia/src/pjmedia/resample_resample.c b/pjmedia/src/pjmedia/resample_resample.c index 39a293a7..d251859c 100644 --- a/pjmedia/src/pjmedia/resample_resample.c +++ b/pjmedia/src/pjmedia/resample_resample.c @@ -123,7 +123,7 @@ PJ_DEF(pj_status_t) pjmedia_resample_create( pj_pool_t *pool, /* Allocate temporary output buffer */ size = (unsigned) (resample->frame_size * sizeof(pj_int16_t) * - resample->factor / channel_count); + resample->factor / channel_count + 0.5); resample->tmp_buffer = (pj_int16_t*) pj_pool_alloc(pool, size); PJ_ASSERT_RETURN(resample->tmp_buffer, PJ_ENOMEM); } @@ -245,7 +245,7 @@ PJ_DEF(void) pjmedia_resample_run( pjmedia_resample *resample, unsigned mono_frm_sz_out; mono_frm_sz_in = resample->frame_size / resample->channel_cnt; - mono_frm_sz_out = (unsigned)(mono_frm_sz_in * resample->factor); + mono_frm_sz_out = (unsigned)(mono_frm_sz_in * resample->factor + 0.5); /* Deinterleave input */ dst_buf = resample->in_buffer[i] + resample->xoff*2; diff --git a/third_party/resample/src/resamplesubs.c b/third_party/resample/src/resamplesubs.c index 242844d5..23f2f252 100644 --- a/third_party/resample/src/resamplesubs.c +++ b/third_party/resample/src/resamplesubs.c @@ -118,9 +118,13 @@ static int dtb = dt*(1< 0), + // so it may cause resample write pass the output buffer (Y >= Yend). + // while (time < endTime) + while (Y < Yend) { iconst = (time) & Pmask; xp = &X[(time)>>Np]; /* Ptr to current input sample */ @@ -257,7 +261,7 @@ static int SrcUp(const RES_HWORD X[], RES_HWORD Y[], double pFactor, dtb = dt*(1< 0), @@ -305,7 +309,7 @@ static int SrcUD(const RES_HWORD X[], RES_HWORD Y[], double pFactor, dhb = dh*(1< 0), -- cgit v1.2.3