summaryrefslogtreecommitdiff
path: root/pjmedia/src
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-04-09 07:06:08 +0000
committerBenny Prijono <bennylp@teluu.com>2007-04-09 07:06:08 +0000
commite58d19666ee71630cbc267928b4f9cac1fa09580 (patch)
treeaa496409ed53905d577503117b3cf7a94598e461 /pjmedia/src
parentcf6e8a6e1d79d98378427ee60dfa099808517732 (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.c25
-rw-r--r--pjmedia/src/pjmedia/g711.c30
-rw-r--r--pjmedia/src/pjmedia/resample_resample.c526
-rw-r--r--pjmedia/src/pjmedia/resample_speex.c11
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 */
+