summaryrefslogtreecommitdiff
path: root/pjmedia
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2008-03-04 16:23:42 +0000
committerBenny Prijono <bennylp@teluu.com>2008-03-04 16:23:42 +0000
commit9fd0e939e50e39d7f98d0dfb73091851ba571781 (patch)
tree5c1c3eee7e008f6c6eb3ad262ca69a3b6a8bc310 /pjmedia
parent6f9ff9fd66675c7a2582cfd772c2d04eb0b25153 (diff)
Ticket #502: New packet lost concealment (PLC) implementation and enable PLC on G711 and GSM codec
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1846 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia')
-rw-r--r--pjmedia/src/pjmedia-codec/gsm.c4
-rw-r--r--pjmedia/src/pjmedia/g711.c4
-rw-r--r--pjmedia/src/pjmedia/plc_common.c96
3 files changed, 35 insertions, 69 deletions
diff --git a/pjmedia/src/pjmedia-codec/gsm.c b/pjmedia/src/pjmedia-codec/gsm.c
index c1e769bc..8bc33bb4 100644
--- a/pjmedia/src/pjmedia-codec/gsm.c
+++ b/pjmedia/src/pjmedia-codec/gsm.c
@@ -34,8 +34,8 @@
*/
#if defined(PJMEDIA_HAS_GSM_CODEC) && PJMEDIA_HAS_GSM_CODEC != 0
-/* We removed PLC in 0.6 */
-#define PLC_DISABLED 1
+/* We removed PLC in 0.6 (and re-enabled it again in 0.9!) */
+#define PLC_DISABLED 0
/* Prototypes for GSM factory */
diff --git a/pjmedia/src/pjmedia/g711.c b/pjmedia/src/pjmedia/g711.c
index 3997da5c..afc4a1db 100644
--- a/pjmedia/src/pjmedia/g711.c
+++ b/pjmedia/src/pjmedia/g711.c
@@ -32,8 +32,8 @@
#if defined(PJMEDIA_HAS_G711_CODEC) && PJMEDIA_HAS_G711_CODEC!=0
-/* We removed PLC in 0.6 */
-#define PLC_DISABLED 1
+/* We removed PLC in 0.6 (and re-enabled it again in 0.9!) */
+#define PLC_DISABLED 0
#define G711_BPS 64000
diff --git a/pjmedia/src/pjmedia/plc_common.c b/pjmedia/src/pjmedia/plc_common.c
index 764ad0af..df49644f 100644
--- a/pjmedia/src/pjmedia/plc_common.c
+++ b/pjmedia/src/pjmedia/plc_common.c
@@ -18,19 +18,15 @@
*/
#include <pjmedia/plc.h>
#include <pjmedia/errno.h>
+#include <pjmedia/wsola.h>
#include <pj/assert.h>
#include <pj/pool.h>
#include <pj/string.h>
-static void* plc_replay_create(pj_pool_t*, unsigned c, unsigned f);
-static void plc_replay_save(void*, pj_int16_t*);
-static void plc_replay_generate(void*, pj_int16_t*);
-
-extern void* pjmedia_plc_steveu_create(pj_pool_t*, unsigned c, unsigned f);
-extern void pjmedia_plc_steveu_save(void*, pj_int16_t*);
-extern void pjmedia_plc_steveu_generate(void*, pj_int16_t*);
-
+static void* plc_wsola_create(pj_pool_t*, unsigned c, unsigned f);
+static void plc_wsola_save(void*, pj_int16_t*);
+static void plc_wsola_generate(void*, pj_int16_t*);
/**
* This struct is used internally to represent a PLC backend.
@@ -43,21 +39,11 @@ struct plc_alg
};
-#if defined(PJMEDIA_HAS_STEVEU_PLC) && PJMEDIA_HAS_STEVEU_PLC!=0
-static struct plc_alg plc_steveu =
-{
- &pjmedia_plc_steveu_create,
- &pjmedia_plc_steveu_save,
- &pjmedia_plc_steveu_generate
-};
-#endif
-
-
-static struct plc_alg plc_replay =
+static struct plc_alg plc_wsola =
{
- &plc_replay_create,
- &plc_replay_save,
- &plc_replay_generate
+ &plc_wsola_create,
+ &plc_wsola_save,
+ &plc_wsola_generate
};
@@ -88,15 +74,7 @@ PJ_DEF(pj_status_t) pjmedia_plc_create( pj_pool_t *pool,
plc = PJ_POOL_ZALLOC_T(pool, pjmedia_plc);
- if (0)
- ;
-#if defined(PJMEDIA_HAS_STEVEU_PLC) && PJMEDIA_HAS_STEVEU_PLC!=0
- else if (clock_rate == 8000)
- plc->op = &plc_steveu;
-#endif
- else
- plc->op = &plc_replay;
-
+ plc->op = &plc_wsola;
plc->obj = plc->op->plc_create(pool, clock_rate, samples_per_frame);
*p_plc = plc;
@@ -133,59 +111,47 @@ PJ_DEF(pj_status_t) pjmedia_plc_generate( pjmedia_plc *plc,
//////////////////////////////////////////////////////////////////////////////
/*
- * Simple replay based plc
+ * Packet loss concealment based on WSOLA
*/
-struct replay_plc
+struct wsola_plc
{
- unsigned size;
- unsigned replay_cnt;
- pj_int16_t *frame;
+ pjmedia_wsola *wsola;
+ pj_bool_t prev_lost;
};
-static void* plc_replay_create(pj_pool_t *pool, unsigned clock_rate,
- unsigned samples_per_frame)
+static void* plc_wsola_create(pj_pool_t *pool, unsigned clock_rate,
+ unsigned samples_per_frame)
{
- struct replay_plc *o;
+ struct wsola_plc *o;
+ pj_status_t status;
PJ_UNUSED_ARG(clock_rate);
- o = PJ_POOL_ALLOC_T(pool, struct replay_plc);
- o->size = samples_per_frame * 2;
- o->replay_cnt = 0;
- o->frame = (pj_int16_t*) pj_pool_zalloc(pool, o->size);
+ o = PJ_POOL_ALLOC_T(pool, struct wsola_plc);
+
+ status = pjmedia_wsola_create(pool, clock_rate, samples_per_frame, 1,
+ PJMEDIA_WSOLA_NO_DISCARD, &o->wsola);
+ if (status != PJ_SUCCESS)
+ return NULL;
return o;
}
-static void plc_replay_save(void *plc, pj_int16_t *frame)
+static void plc_wsola_save(void *plc, pj_int16_t *frame)
{
- struct replay_plc *o = (struct replay_plc*) plc;
+ struct wsola_plc *o = (struct wsola_plc*) plc;
- pj_memcpy(o->frame, frame, o->size);
- o->replay_cnt = 0;
+ pjmedia_wsola_save(o->wsola, frame, o->prev_lost);
+ o->prev_lost = PJ_FALSE;
}
-static void plc_replay_generate(void *plc, pj_int16_t *frame)
+static void plc_wsola_generate(void *plc, pj_int16_t *frame)
{
- struct replay_plc *o = (struct replay_plc*) plc;
- unsigned i, count;
- pj_int16_t *samp;
-
- ++o->replay_cnt;
-
- if (o->replay_cnt < 16) {
- pj_memcpy(frame, o->frame, o->size);
+ struct wsola_plc *o = (struct wsola_plc*) plc;
-
- count = o->size / 2;
- samp = o->frame;
- for (i=0; i<count; ++i)
- samp[i] = (pj_int16_t)(samp[i] >> 1);
- } else {
- pj_bzero(frame, o->size);
- }
+ pjmedia_wsola_generate(o->wsola, frame);
+ o->prev_lost = PJ_TRUE;
}
-