From 9fd0e939e50e39d7f98d0dfb73091851ba571781 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Tue, 4 Mar 2008 16:23:42 +0000 Subject: 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 --- pjmedia/src/pjmedia-codec/gsm.c | 4 +- pjmedia/src/pjmedia/g711.c | 4 +- pjmedia/src/pjmedia/plc_common.c | 96 +++++++++++++--------------------------- 3 files changed, 35 insertions(+), 69 deletions(-) (limited to 'pjmedia') 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 #include +#include #include #include #include -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> 1); - } else { - pj_bzero(frame, o->size); - } + pjmedia_wsola_generate(o->wsola, frame); + o->prev_lost = PJ_TRUE; } - -- cgit v1.2.3