diff options
author | Benny Prijono <bennylp@teluu.com> | 2007-04-09 07:06:08 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2007-04-09 07:06:08 +0000 |
commit | e58d19666ee71630cbc267928b4f9cac1fa09580 (patch) | |
tree | aa496409ed53905d577503117b3cf7a94598e461 /pjmedia/src | |
parent | cf6e8a6e1d79d98378427ee60dfa099808517732 (diff) |
Fixed all VS6 and VS8 projects with new third party projects layout
git-svn-id: http://svn.pjsip.org/repos/pjproject/branches/split-3rd-party@1177 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia/src')
-rw-r--r-- | pjmedia/src/pjmedia-codec/gsm.c | 25 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/g711.c | 30 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/resample_resample.c | 526 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/resample_speex.c | 11 |
4 files changed, 81 insertions, 511 deletions
diff --git a/pjmedia/src/pjmedia-codec/gsm.c b/pjmedia/src/pjmedia-codec/gsm.c index 34f538b2..d21956ae 100644 --- a/pjmedia/src/pjmedia-codec/gsm.c +++ b/pjmedia/src/pjmedia-codec/gsm.c @@ -34,6 +34,9 @@ */ #if defined(PJMEDIA_HAS_GSM_CODEC) && PJMEDIA_HAS_GSM_CODEC != 0 +/* We removed PLC in 0.6 */ +#define PLC_DISABLED 1 + /* Prototypes for GSM factory */ static pj_status_t gsm_test_alloc( pjmedia_codec_factory *factory, @@ -72,9 +75,11 @@ static pj_status_t gsm_codec_decode( pjmedia_codec *codec, const struct pjmedia_frame *input, unsigned output_buf_len, struct pjmedia_frame *output); +#if !PLC_DISABLED static pj_status_t gsm_codec_recover(pjmedia_codec *codec, unsigned output_buf_len, struct pjmedia_frame *output); +#endif /* Definition for GSM codec operations. */ static pjmedia_codec_op gsm_op = @@ -86,7 +91,11 @@ static pjmedia_codec_op gsm_op = &gsm_codec_parse, &gsm_codec_encode, &gsm_codec_decode, +#if !PLC_DISABLED &gsm_codec_recover +#else + NULL +#endif }; /* Definition for GSM codec factory operations. */ @@ -116,7 +125,9 @@ struct gsm_data void *encoder; void *decoder; pj_bool_t plc_enabled; +#if !PLC_DISABLED pjmedia_plc *plc; +#endif pj_bool_t vad_enabled; pjmedia_silence_det *vad; pj_timestamp last_tx; @@ -259,7 +270,9 @@ static pj_status_t gsm_default_attr (pjmedia_codec_factory *factory, attr->setting.frm_per_pkt = 1; attr->setting.vad = 1; +#if !PLC_DISABLED attr->setting.plc = 1; +#endif /* Default all other flag bits disabled. */ @@ -320,6 +333,7 @@ static pj_status_t gsm_alloc_codec( pjmedia_codec_factory *factory, sizeof(struct gsm_data)); codec->codec_data = gsm_data; +#if !PLC_DISABLED /* Create PLC */ status = pjmedia_plc_create(gsm_codec_factory.pool, 8000, 160, 0, &gsm_data->plc); @@ -327,6 +341,7 @@ static pj_status_t gsm_alloc_codec( pjmedia_codec_factory *factory, pj_mutex_unlock(gsm_codec_factory.mutex); return status; } +#endif /* Create silence detector */ status = pjmedia_silence_det_create(gsm_codec_factory.pool, @@ -351,7 +366,6 @@ static pj_status_t gsm_dealloc_codec( pjmedia_codec_factory *factory, pjmedia_codec *codec ) { struct gsm_data *gsm_data; - pj_int16_t frame[160]; int i; PJ_ASSERT_RETURN(factory && codec, PJ_EINVAL); @@ -362,13 +376,18 @@ static pj_status_t gsm_dealloc_codec( pjmedia_codec_factory *factory, /* Close codec, if it's not closed. */ gsm_codec_close(codec); +#if !PLC_DISABLED /* Clear left samples in the PLC, since codec+plc will be reused * next time. */ for (i=0; i<2; ++i) { + pj_int16_t frame[160]; pjmedia_zero_samples(frame, PJ_ARRAY_SIZE(frame)); pjmedia_plc_save(gsm_data->plc, frame); } +#else + PJ_UNUSED_ARG(i); +#endif /* Re-init silence_period */ pj_set_timestamp32(&gsm_data->last_tx, 0, 0); @@ -569,13 +588,16 @@ static pj_status_t gsm_codec_decode( pjmedia_codec *codec, output->size = 320; output->type = PJMEDIA_FRAME_TYPE_AUDIO; +#if !PLC_DISABLED if (gsm_data->plc_enabled) pjmedia_plc_save( gsm_data->plc, output->buf); +#endif return PJ_SUCCESS; } +#if !PLC_DISABLED /* * Recover lost frame. */ @@ -594,6 +616,7 @@ static pj_status_t gsm_codec_recover(pjmedia_codec *codec, return PJ_SUCCESS; } +#endif #endif /* PJMEDIA_HAS_GSM_CODEC */ diff --git a/pjmedia/src/pjmedia/g711.c b/pjmedia/src/pjmedia/g711.c index 38306d0b..da9b7586 100644 --- a/pjmedia/src/pjmedia/g711.c +++ b/pjmedia/src/pjmedia/g711.c @@ -32,6 +32,9 @@ #if defined(PJMEDIA_HAS_G711_CODEC) && PJMEDIA_HAS_G711_CODEC!=0 +/* We removed PLC in 0.6 */ +#define PLC_DISABLED 1 + #define G711_BPS 64000 #define G711_CODEC_CNT 0 /* number of codec to preallocate in memory */ @@ -80,9 +83,11 @@ static pj_status_t g711_decode( pjmedia_codec *codec, const struct pjmedia_frame *input, unsigned output_buf_len, struct pjmedia_frame *output); +#if !PLC_DISABLED static pj_status_t g711_recover( pjmedia_codec *codec, unsigned output_buf_len, struct pjmedia_frame *output); +#endif /* Definition for G711 codec operations. */ static pjmedia_codec_op g711_op = @@ -94,7 +99,11 @@ static pjmedia_codec_op g711_op = &g711_parse, &g711_encode, &g711_decode, +#if !PLC_DISABLED &g711_recover +#else + NULL +#endif }; /* Definition for G711 codec factory operations. */ @@ -121,8 +130,10 @@ static struct g711_factory struct g711_private { unsigned pt; +#if !PLC_DISABLED pj_bool_t plc_enabled; pjmedia_plc *plc; +#endif pj_bool_t vad_enabled; pjmedia_silence_det *vad; pj_timestamp last_tx; @@ -249,8 +260,10 @@ static pj_status_t g711_default_attr (pjmedia_codec_factory *factory, /* Set default frames per packet to 2 (or 20ms) */ attr->setting.frm_per_pkt = 2; +#if !PLC_DISABLED /* Enable plc by default. */ attr->setting.plc = 1; +#endif /* Enable VAD by default. */ attr->setting.vad = 1; @@ -317,6 +330,7 @@ static pj_status_t g711_alloc_codec( pjmedia_codec_factory *factory, /* Set the payload type */ codec_priv->pt = id->pt; +#if !PLC_DISABLED /* Create PLC, always with 10ms ptime */ status = pjmedia_plc_create(g711_factory.pool, 8000, 80, 0, &codec_priv->plc); @@ -324,6 +338,7 @@ static pj_status_t g711_alloc_codec( pjmedia_codec_factory *factory, pj_mutex_unlock(g711_factory.mutex); return status; } +#endif /* Create VAD */ status = pjmedia_silence_det_create(g711_factory.pool, @@ -357,7 +372,6 @@ static pj_status_t g711_dealloc_codec(pjmedia_codec_factory *factory, pjmedia_codec *codec ) { struct g711_private *priv = codec->codec_data; - pj_int16_t frame[SAMPLES_PER_FRAME]; int i; PJ_ASSERT_RETURN(factory==&g711_factory.base, PJ_EINVAL); @@ -368,13 +382,19 @@ static pj_status_t g711_dealloc_codec(pjmedia_codec_factory *factory, return PJ_EINVALIDOP; } +#if !PLC_DISABLED /* Clear left samples in the PLC, since codec+plc will be reused * next time. */ for (i=0; i<2; ++i) { + pj_int16_t frame[SAMPLES_PER_FRAME]; pjmedia_zero_samples(frame, PJ_ARRAY_SIZE(frame)); pjmedia_plc_save(priv->plc, frame); } +#else + PJ_UNUSED_ARG(i); + PJ_UNUSED_ARG(priv); +#endif /* Lock mutex. */ pj_mutex_lock(g711_factory.mutex); @@ -402,7 +422,9 @@ static pj_status_t g711_open(pjmedia_codec *codec, { struct g711_private *priv = codec->codec_data; priv->pt = attr->info.pt; +#if !PLC_DISABLED priv->plc_enabled = (attr->setting.plc != 0); +#endif priv->vad_enabled = (attr->setting.vad != 0); return PJ_SUCCESS; } @@ -422,7 +444,9 @@ static pj_status_t g711_modify(pjmedia_codec *codec, if (attr->info.pt != priv->pt) return PJMEDIA_EINVALIDPT; +#if !PLC_DISABLED priv->plc_enabled = (attr->setting.plc != 0); +#endif priv->vad_enabled = (attr->setting.vad != 0); return PJ_SUCCESS; @@ -561,12 +585,15 @@ static pj_status_t g711_decode(pjmedia_codec *codec, output->type = PJMEDIA_FRAME_TYPE_AUDIO; output->size = (input->size << 1); +#if !PLC_DISABLED if (priv->plc_enabled) pjmedia_plc_save( priv->plc, output->buf); +#endif return PJ_SUCCESS; } +#if !PLC_DISABLED static pj_status_t g711_recover( pjmedia_codec *codec, unsigned output_buf_len, struct pjmedia_frame *output) @@ -584,6 +611,7 @@ static pj_status_t g711_recover( pjmedia_codec *codec, return PJ_SUCCESS; } +#endif #endif /* PJMEDIA_HAS_G711_CODEC */ diff --git a/pjmedia/src/pjmedia/resample_resample.c b/pjmedia/src/pjmedia/resample_resample.c index fbb4a727..0dc755d9 100644 --- a/pjmedia/src/pjmedia/resample_resample.c +++ b/pjmedia/src/pjmedia/resample_resample.c @@ -17,451 +17,21 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* - * Based on: - * resample-1.8.tar.gz from the - * Digital Audio Resampling Home Page located at - * http://www-ccrma.stanford.edu/~jos/resample/. - * - * SOFTWARE FOR SAMPLING-RATE CONVERSION AND FIR DIGITAL FILTER DESIGN - * - * Snippet from the resample.1 man page: - * - * HISTORY - * - * The first version of this software was written by Julius O. Smith III - * <jos@ccrma.stanford.edu> at CCRMA <http://www-ccrma.stanford.edu> in - * 1981. It was called SRCONV and was written in SAIL for PDP-10 - * compatible machines. The algorithm was first published in - * - * Smith, Julius O. and Phil Gossett. ``A Flexible Sampling-Rate - * Conversion Method,'' Proceedings (2): 19.4.1-19.4.4, IEEE Conference - * on Acoustics, Speech, and Signal Processing, San Diego, March 1984. - * - * An expanded tutorial based on this paper is available at the Digital - * Audio Resampling Home Page given above. - * - * Circa 1988, the SRCONV program was translated from SAIL to C by - * Christopher Lee Fraley working with Roger Dannenberg at CMU. - * - * Since then, the C version has been maintained by jos. - * - * Sndlib support was added 6/99 by John Gibson <jgg9c@virginia.edu>. - * - * The resample program is free software distributed in accordance - * with the Lesser GNU Public License (LGPL). There is NO warranty; not - * even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* PJMEDIA modification: - * - remove resample(), just use SrcUp, SrcUD, and SrcLinear directly. - * - move FilterUp() and FilterUD() from filterkit.c - * - move stddefs.h and resample.h to this file. - * - const correctness. - */ #include <pjmedia/resample.h> + #include <pjmedia/errno.h> #include <pj/assert.h> #include <pj/log.h> #include <pj/pool.h> -#define THIS_FILE "resample.c" - - -/* - * Taken from stddefs.h - */ -#ifndef PI -#define PI (3.14159265358979232846) -#endif - -#ifndef PI2 -#define PI2 (6.28318530717958465692) -#endif - -#define D2R (0.01745329348) /* (2*pi)/360 */ -#define R2D (57.29577951) /* 360/(2*pi) */ - -#ifndef MAX -#define MAX(x,y) ((x)>(y) ?(x):(y)) -#endif -#ifndef MIN -#define MIN(x,y) ((x)<(y) ?(x):(y)) -#endif - -#ifndef ABS -#define ABS(x) ((x)<0 ?(-(x)):(x)) -#endif - -#ifndef SGN -#define SGN(x) ((x)<0 ?(-1):((x)==0?(0):(1))) -#endif - -typedef char RES_BOOL; -typedef short RES_HWORD; -typedef int RES_WORD; -typedef unsigned short RES_UHWORD; -typedef unsigned int RES_UWORD; - -#define MAX_HWORD (32767) -#define MIN_HWORD (-32768) - -#ifdef DEBUG -#define INLINE -#else -#define INLINE inline -#endif - -/* - * Taken from resample.h - * - * The configuration constants below govern - * the number of bits in the input sample and filter coefficients, the - * number of bits to the right of the binary-point for fixed-point math, etc. - * - */ - -/* Conversion constants */ -#define Nhc 8 -#define Na 7 -#define Np (Nhc+Na) -#define Npc (1<<Nhc) -#define Amask ((1<<Na)-1) -#define Pmask ((1<<Np)-1) -#define Nh 16 -#define Nb 16 -#define Nhxn 14 -#define Nhg (Nh-Nhxn) -#define NLpScl 13 - -/* Description of constants: - * - * Npc - is the number of look-up values available for the lowpass filter - * between the beginning of its impulse response and the "cutoff time" - * of the filter. The cutoff time is defined as the reciprocal of the - * lowpass-filter cut off frequence in Hz. For example, if the - * lowpass filter were a sinc function, Npc would be the index of the - * impulse-response lookup-table corresponding to the first zero- - * crossing of the sinc function. (The inverse first zero-crossing - * time of a sinc function equals its nominal cutoff frequency in Hz.) - * Npc must be a power of 2 due to the details of the current - * implementation. The default value of 512 is sufficiently high that - * using linear interpolation to fill in between the table entries - * gives approximately 16-bit accuracy in filter coefficients. - * - * Nhc - is log base 2 of Npc. - * - * Na - is the number of bits devoted to linear interpolation of the - * filter coefficients. - * - * Np - is Na + Nhc, the number of bits to the right of the binary point - * in the integer "time" variable. To the left of the point, it indexes - * the input array (X), and to the right, it is interpreted as a number - * between 0 and 1 sample of the input X. Np must be less than 16 in - * this implementation. - * - * Nh - is the number of bits in the filter coefficients. The sum of Nh and - * the number of bits in the input data (typically 16) cannot exceed 32. - * Thus Nh should be 16. The largest filter coefficient should nearly - * fill 16 bits (32767). - * - * Nb - is the number of bits in the input data. The sum of Nb and Nh cannot - * exceed 32. - * - * Nhxn - is the number of bits to right shift after multiplying each input - * sample times a filter coefficient. It can be as great as Nh and as - * small as 0. Nhxn = Nh-2 gives 2 guard bits in the multiply-add - * accumulation. If Nhxn=0, the accumulation will soon overflow 32 bits. - * - * Nhg - is the number of guard bits in mpy-add accumulation (equal to Nh-Nhxn) - * - * NLpScl - is the number of bits allocated to the unity-gain normalization - * factor. The output of the lowpass filter is multiplied by LpScl and - * then right-shifted NLpScl bits. To avoid overflow, we must have - * Nb+Nhg+NLpScl < 32. - */ - - -#ifdef _MSC_VER -# pragma warning(push, 3) -//# pragma warning(disable: 4245) // Conversion from uint to ushort -# pragma warning(disable: 4244) // Conversion from double to uint -# pragma warning(disable: 4146) // unary minus operator applied to unsigned type, result still unsigned -# pragma warning(disable: 4761) // integral size mismatch in argument; conversion supplied -#endif - -#if defined(PJMEDIA_HAS_SMALL_FILTER) && PJMEDIA_HAS_SMALL_FILTER!=0 -# include "smallfilter.h" -#else -# define SMALL_FILTER_NMULT 0 -# define SMALL_FILTER_SCALE 0 -# define SMALL_FILTER_NWING 0 -# define SMALL_FILTER_IMP NULL -# define SMALL_FILTER_IMPD NULL -#endif - -#if defined(PJMEDIA_HAS_LARGE_FILTER) && PJMEDIA_HAS_LARGE_FILTER!=0 -# include "largefilter.h" -#else -# define LARGE_FILTER_NMULT 0 -# define LARGE_FILTER_SCALE 0 -# define LARGE_FILTER_NWING 0 -# define LARGE_FILTER_IMP NULL -# define LARGE_FILTER_IMPD NULL -#endif - - -#undef INLINE -#define INLINE -#define HAVE_FILTER 0 - -#ifndef NULL -# define NULL 0 -#endif - - -static INLINE RES_HWORD WordToHword(RES_WORD v, int scl) -{ - RES_HWORD out; - RES_WORD llsb = (1<<(scl-1)); - v += llsb; /* round */ - v >>= scl; - if (v>MAX_HWORD) { - v = MAX_HWORD; - } else if (v < MIN_HWORD) { - v = MIN_HWORD; - } - out = (RES_HWORD) v; - return out; -} +#if defined(PJMEDIA_HAS_LIBRESAMPLE) && PJMEDIA_HAS_LIBRESAMPLE != 0 -/* Sampling rate conversion using linear interpolation for maximum speed. - */ -static int - SrcLinear(const RES_HWORD X[], RES_HWORD Y[], double pFactor, RES_UHWORD nx) -{ - RES_HWORD iconst; - RES_UWORD time = 0; - const RES_HWORD *xp; - RES_HWORD *Ystart, *Yend; - RES_WORD v,x1,x2; - - double dt; /* Step through input signal */ - RES_UWORD dtb; /* Fixed-point version of Dt */ - RES_UWORD endTime; /* When time reaches EndTime, return to user */ - - dt = 1.0/pFactor; /* Output sampling period */ - dtb = dt*(1<<Np) + 0.5; /* Fixed-point representation */ - - Ystart = Y; - Yend = Ystart + (unsigned)(nx * pFactor); - endTime = time + (1<<Np)*(RES_WORD)nx; - while (time < endTime) - { - iconst = (time) & Pmask; - xp = &X[(time)>>Np]; /* Ptr to current input sample */ - x1 = *xp++; - x2 = *xp; - x1 *= ((1<<Np)-iconst); - x2 *= iconst; - v = x1 + x2; - *Y++ = WordToHword(v,Np); /* Deposit output */ - time += dtb; /* Move to next sample by time increment */ - } - return (Y - Ystart); /* Return number of output samples */ -} +#include <third_party/resample/include/resamplesubs.h> -static RES_WORD FilterUp(const RES_HWORD Imp[], const RES_HWORD ImpD[], - RES_UHWORD Nwing, RES_BOOL Interp, - const RES_HWORD *Xp, RES_HWORD Ph, RES_HWORD Inc) -{ - const RES_HWORD *Hp; - const RES_HWORD *Hdp = NULL; - const RES_HWORD *End; - RES_HWORD a = 0; - RES_WORD v, t; - - v=0; - Hp = &Imp[Ph>>Na]; - End = &Imp[Nwing]; - if (Interp) { - Hdp = &ImpD[Ph>>Na]; - a = Ph & Amask; - } - if (Inc == 1) /* If doing right wing... */ - { /* ...drop extra coeff, so when Ph is */ - End--; /* 0.5, we don't do too many mult's */ - if (Ph == 0) /* If the phase is zero... */ - { /* ...then we've already skipped the */ - Hp += Npc; /* first sample, so we must also */ - Hdp += Npc; /* skip ahead in Imp[] and ImpD[] */ - } - } - if (Interp) - while (Hp < End) { - t = *Hp; /* Get filter coeff */ - t += (((RES_WORD)*Hdp)*a)>>Na; /* t is now interp'd filter coeff */ - Hdp += Npc; /* Filter coeff differences step */ - t *= *Xp; /* Mult coeff by input sample */ - if (t & (1<<(Nhxn-1))) /* Round, if needed */ - t += (1<<(Nhxn-1)); - t >>= Nhxn; /* Leave some guard bits, but come back some */ - v += t; /* The filter output */ - Hp += Npc; /* Filter coeff step */ - - Xp += Inc; /* Input signal step. NO CHECK ON BOUNDS */ - } - else - while (Hp < End) { - t = *Hp; /* Get filter coeff */ - t *= *Xp; /* Mult coeff by input sample */ - if (t & (1<<(Nhxn-1))) /* Round, if needed */ - t += (1<<(Nhxn-1)); - t >>= Nhxn; /* Leave some guard bits, but come back some */ - v += t; /* The filter output */ - Hp += Npc; /* Filter coeff step */ - Xp += Inc; /* Input signal step. NO CHECK ON BOUNDS */ - } - return(v); -} - - -static RES_WORD FilterUD(const RES_HWORD Imp[], const RES_HWORD ImpD[], - RES_UHWORD Nwing, RES_BOOL Interp, - const RES_HWORD *Xp, RES_HWORD Ph, RES_HWORD Inc, RES_UHWORD dhb) -{ - RES_HWORD a; - const RES_HWORD *Hp, *Hdp, *End; - RES_WORD v, t; - RES_UWORD Ho; - - v=0; - Ho = (Ph*(RES_UWORD)dhb)>>Np; - End = &Imp[Nwing]; - if (Inc == 1) /* If doing right wing... */ - { /* ...drop extra coeff, so when Ph is */ - End--; /* 0.5, we don't do too many mult's */ - if (Ph == 0) /* If the phase is zero... */ - Ho += dhb; /* ...then we've already skipped the */ - } /* first sample, so we must also */ - /* skip ahead in Imp[] and ImpD[] */ - if (Interp) - while ((Hp = &Imp[Ho>>Na]) < End) { - t = *Hp; /* Get IR sample */ - Hdp = &ImpD[Ho>>Na]; /* get interp (lower Na) bits from diff table*/ - a = Ho & Amask; /* a is logically between 0 and 1 */ - t += (((RES_WORD)*Hdp)*a)>>Na; /* t is now interp'd filter coeff */ - t *= *Xp; /* Mult coeff by input sample */ - if (t & 1<<(Nhxn-1)) /* Round, if needed */ - t += 1<<(Nhxn-1); - t >>= Nhxn; /* Leave some guard bits, but come back some */ - v += t; /* The filter output */ - Ho += dhb; /* IR step */ - Xp += Inc; /* Input signal step. NO CHECK ON BOUNDS */ - } - else - while ((Hp = &Imp[Ho>>Na]) < End) { - t = *Hp; /* Get IR sample */ - t *= *Xp; /* Mult coeff by input sample */ - if (t & 1<<(Nhxn-1)) /* Round, if needed */ - t += 1<<(Nhxn-1); - t >>= Nhxn; /* Leave some guard bits, but come back some */ - v += t; /* The filter output */ - Ho += dhb; /* IR step */ - Xp += Inc; /* Input signal step. NO CHECK ON BOUNDS */ - } - return(v); -} - -/* Sampling rate up-conversion only subroutine; - * Slightly faster than down-conversion; - */ -static int SrcUp(const RES_HWORD X[], RES_HWORD Y[], double pFactor, - RES_UHWORD nx, RES_UHWORD pNwing, RES_UHWORD pLpScl, - const RES_HWORD pImp[], const RES_HWORD pImpD[], RES_BOOL Interp) -{ - const RES_HWORD *xp; - RES_HWORD *Ystart, *Yend; - RES_WORD v; - - double dt; /* Step through input signal */ - RES_UWORD dtb; /* Fixed-point version of Dt */ - RES_UWORD time = 0; - RES_UWORD endTime; /* When time reaches EndTime, return to user */ - - dt = 1.0/pFactor; /* Output sampling period */ - dtb = dt*(1<<Np) + 0.5; /* Fixed-point representation */ - - Ystart = Y; - Yend = Ystart + (unsigned)(nx * pFactor); - endTime = time + (1<<Np)*(RES_WORD)nx; - while (time < endTime) - { - xp = &X[time>>Np]; /* Ptr to current input sample */ - /* Perform left-wing inner product */ - v = 0; - v = FilterUp(pImp, pImpD, pNwing, Interp, xp, (RES_HWORD)(time&Pmask),-1); - - /* Perform right-wing inner product */ - v += FilterUp(pImp, pImpD, pNwing, Interp, xp+1, (RES_HWORD)((-time)&Pmask),1); - - v >>= Nhg; /* Make guard bits */ - v *= pLpScl; /* Normalize for unity filter gain */ - *Y++ = WordToHword(v,NLpScl); /* strip guard bits, deposit output */ - time += dtb; /* Move to next sample by time increment */ - } - return (Y - Ystart); /* Return the number of output samples */ -} +#define THIS_FILE "resample.c" -/* Sampling rate conversion subroutine */ - -static int SrcUD(const RES_HWORD X[], RES_HWORD Y[], double pFactor, - RES_UHWORD nx, RES_UHWORD pNwing, RES_UHWORD pLpScl, - const RES_HWORD pImp[], const RES_HWORD pImpD[], RES_BOOL Interp) -{ - const RES_HWORD *xp; - RES_HWORD *Ystart, *Yend; - RES_WORD v; - - double dh; /* Step through filter impulse response */ - double dt; /* Step through input signal */ - RES_UWORD time = 0; - RES_UWORD endTime; /* When time reaches EndTime, return to user */ - RES_UWORD dhb, dtb; /* Fixed-point versions of Dh,Dt */ - - dt = 1.0/pFactor; /* Output sampling period */ - dtb = dt*(1<<Np) + 0.5; /* Fixed-point representation */ - - dh = MIN(Npc, pFactor*Npc); /* Filter sampling period */ - dhb = dh*(1<<Na) + 0.5; /* Fixed-point representation */ - - Ystart = Y; - Yend = Ystart + (unsigned)(nx * pFactor); - endTime = time + (1<<Np)*(RES_WORD)nx; - while (time < endTime) - { - xp = &X[time>>Np]; /* Ptr to current input sample */ - v = FilterUD(pImp, pImpD, pNwing, Interp, xp, (RES_HWORD)(time&Pmask), - -1, dhb); /* Perform left-wing inner product */ - v += FilterUD(pImp, pImpD, pNwing, Interp, xp+1, (RES_HWORD)((-time)&Pmask), - 1, dhb); /* Perform right-wing inner product */ - v >>= Nhg; /* Make guard bits */ - v *= pLpScl; /* Normalize for unity filter gain */ - *Y++ = WordToHword(v,NLpScl); /* strip guard bits, deposit output */ - time += dtb; /* Move to next sample by time increment */ - } - return (Y - Ystart); /* Return the number of output samples */ -} - - -/* *************************************************************************** - * - * PJMEDIA RESAMPLE - * - * *************************************************************************** - */ struct pjmedia_resample { @@ -503,31 +73,6 @@ PJ_DEF(pj_status_t) pjmedia_resample_create( pj_pool_t *pool, //high_quality = 0; } -#if !defined(PJMEDIA_HAS_LARGE_FILTER) || PJMEDIA_HAS_LARGE_FILTER==0 - /* - * If large filter is excluded in the build, then prevent application - * from using it. - */ - if (high_quality && large_filter) { - large_filter = PJ_FALSE; - PJ_LOG(5,(THIS_FILE, - "Resample uses small filter because large filter is " - "disabled")); - } -#endif - -#if !defined(PJMEDIA_HAS_SMALL_FILTER) || PJMEDIA_HAS_SMALL_FILTER==0 - /* - * If small filter is excluded in the build and application wants to - * use it, then drop to linear conversion. - */ - if (high_quality && large_filter == 0) { - high_quality = PJ_FALSE; - PJ_LOG(4,(THIS_FILE, - "Resample uses linear because small filter is disabled")); - } -#endif - resample->factor = rate_out * 1.0 / rate_in; resample->large_filter = large_filter; resample->high_quality = high_quality; @@ -540,13 +85,7 @@ PJ_DEF(pj_status_t) pjmedia_resample_create( pj_pool_t *pool, * of Macadamian dot com. * resample->xoff = large_filter ? 32 : 6; */ - if (large_filter) - resample->xoff = (LARGE_FILTER_NMULT + 1) / 2.0 * - MAX(1.0, 1.0/resample->factor); - else - resample->xoff = (SMALL_FILTER_NMULT + 1) / 2.0 * - MAX(1.0, 1.0/resample->factor); - + resample->xoff = res_GetXOFF(resample->factor, (char)large_filter); size = (samples_per_frame + 2*resample->xoff) * sizeof(pj_int16_t); resample->buffer = pj_pool_alloc(pool, size); @@ -649,53 +188,18 @@ PJ_DEF(void) pjmedia_resample_run( pjmedia_resample *resample, */ dst_buf = resample->buffer + resample->xoff*2; pjmedia_copy_samples(dst_buf, input, resample->frame_size); - - if (resample->factor >= 1) { - - if (resample->large_filter) { - SrcUp(resample->buffer + resample->xoff, output, - resample->factor, resample->frame_size, - LARGE_FILTER_NWING, LARGE_FILTER_SCALE, - LARGE_FILTER_IMP, LARGE_FILTER_IMPD, - PJ_TRUE); - } else { - SrcUp(resample->buffer + resample->xoff, output, - resample->factor, resample->frame_size, - SMALL_FILTER_NWING, SMALL_FILTER_SCALE, - SMALL_FILTER_IMP, SMALL_FILTER_IMPD, - PJ_TRUE); - } - - } else { - - if (resample->large_filter) { - - SrcUD( resample->buffer + resample->xoff, output, - resample->factor, resample->frame_size, - LARGE_FILTER_NWING, - LARGE_FILTER_SCALE * resample->factor + 0.5, - LARGE_FILTER_IMP, LARGE_FILTER_IMPD, - PJ_TRUE); - - } else { - - SrcUD( resample->buffer + resample->xoff, output, - resample->factor, resample->frame_size, - SMALL_FILTER_NWING, - SMALL_FILTER_SCALE * resample->factor + 0.5, - SMALL_FILTER_IMP, SMALL_FILTER_IMPD, - PJ_TRUE); - - } - - } + + res_Resample(resample->buffer + resample->xoff, output, + resample->factor, (pj_uint16_t)resample->frame_size, + (char)resample->large_filter, (char)PJ_TRUE); dst_buf = resample->buffer; src_buf = input + resample->frame_size - resample->xoff*2; pjmedia_copy_samples(dst_buf, src_buf, resample->xoff * 2); } else { - SrcLinear( input, output, resample->factor, resample->frame_size); + res_SrcLinear( input, output, resample->factor, + (pj_uint16_t)resample->frame_size); } } @@ -709,3 +213,11 @@ PJ_DEF(void) pjmedia_resample_destroy(pjmedia_resample *resample) { PJ_UNUSED_ARG(resample); } + + +#else /* PJMEDIA_HAS_LIBRESAMPLE */ + +int pjmedia_resample_resample_excluded; + +#endif /* PJMEDIA_HAS_LIBRESAMPLE */ + diff --git a/pjmedia/src/pjmedia/resample_speex.c b/pjmedia/src/pjmedia/resample_speex.c index 447d3f6a..fcc42115 100644 --- a/pjmedia/src/pjmedia/resample_speex.c +++ b/pjmedia/src/pjmedia/resample_speex.c @@ -16,16 +16,17 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - #include <pjmedia/resample.h> #include <pjmedia/errno.h> #include <pj/assert.h> #include <pj/log.h> #include <pj/pool.h> +#if defined(PJMEDIA_HAS_SPEEX_RESAMPLE) && PJMEDIA_HAS_SPEEX_RESAMPLE != 0 + #include <speex/speex_resampler.h> -#define THIS_FILE "resample.c" +#define THIS_FILE "resample_speex.c" struct pjmedia_resample @@ -117,3 +118,9 @@ PJ_DEF(void) pjmedia_resample_destroy(pjmedia_resample *resample) } } +#else /* PJMEDIA_HAS_SPEEX_RESAMPLE */ + +int pjmedia_resample_speex_excluded; + +#endif /* PJMEDIA_HAS_SPEEX_RESAMPLE */ + |