Updated encdec sample to support PLC etc

git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@1679 74dad513-b988-da41-8d7b-12977e46ad98
This commit is contained in:
Benny Prijono 2008-01-11 16:30:22 +00:00
parent 06e62d76f6
commit 4c5351f3ac
1 changed files with 59 additions and 15 deletions

View File

@ -52,12 +52,22 @@ static const char *desc =
"\n"
;
#define HAS_G729_CODEC 0
#if HAS_G729_CODEC
#include "keystream_g729ab.h"
#ifndef HAS_G729_CODEC
# define HAS_G729_CODEC 0
#endif
#if 0
#if HAS_G729_CODEC
#include <keystream_g729ab.h>
#endif
//#undef PJ_TRACE
//#define PJ_TRACE 1
#ifndef PJ_TRACE
# define PJ_TRACE 0
#endif
#if PJ_TRACE
# define TRACE_(expr) PJ_LOG(4,expr)
#else
# define TRACE_(expr)
@ -90,17 +100,26 @@ static pj_status_t enc_dec_test(const char *codec_id,
pj_pool_t *pool;
pjmedia_codec_mgr *cm;
pjmedia_codec *codec;
pjmedia_codec_info *pci;
const pjmedia_codec_info *pci;
pjmedia_codec_param param;
unsigned cnt, samples_per_frame;
pj_str_t tmp;
pjmedia_port *wavin, *wavout;
unsigned lost_pct;
pj_status_t status;
#define T file_msec_duration/1000, file_msec_duration%1000
pool = pjmedia_endpt_create_pool(mept, "encdec", 1000, 1000);
cm = pjmedia_endpt_get_codec_mgr(mept);
#ifdef LOST_PCT
lost_pct = LOST_PCT;
#else
lost_pct = 0;
#endif
cnt = 1;
CHECK( pjmedia_codec_mgr_find_codecs_by_id(cm, pj_cstr(&tmp, codec_id),
&cnt, &pci, NULL) );
@ -109,7 +128,7 @@ static pj_status_t enc_dec_test(const char *codec_id,
samples_per_frame = param.info.clock_rate * param.info.frm_ptime / 1000;
/* Control VAD */
param.setting.vad = 0;
param.setting.vad = 1;
/* Open wav for reading */
CHECK( pjmedia_wav_player_port_create(pool, filein,
@ -143,11 +162,31 @@ static pj_status_t enc_dec_test(const char *codec_id,
if (frm_pcm.type != PJMEDIA_FRAME_TYPE_AUDIO)
break;;
/* Update duration */
file_msec_duration += samples_per_frame * 1000 /
param.info.clock_rate;
/* Encode */
frm_bit.buf = bitstream;
frm_bit.size = sizeof(bitstream);
CHECK(codec->op->encode(codec, &frm_pcm, sizeof(bitstream), &frm_bit));
/* On DTX, write zero frame to wavout to maintain duration */
if (frm_bit.size == 0 || frm_bit.type != PJMEDIA_FRAME_TYPE_AUDIO) {
out_frm.buf = (char*)pcmbuf;
out_frm.size = 160;
CHECK( pjmedia_port_put_frame(wavout, &out_frm) );
TRACE_((THIS_FILE, "%d.%03d read: %u, enc: %u",
T, frm_pcm.size, frm_bit.size));
continue;
}
/* Simulate jitter buffer bug */
if (pci->pt==PJMEDIA_RTP_PT_G729 && frm_bit.size == 2) {
TRACE_((THIS_FILE, "%d.%03d G729 SID frame masqueraded", T));
frm_bit.size = 10;
}
/* Parse the bitstream (not really necessary for this case
* since we always decode 1 frame, but it's still good
* for testing)
@ -158,20 +197,25 @@ static pj_status_t enc_dec_test(const char *codec_id,
frames) );
CHECK( (cnt==1 ? PJ_SUCCESS : -1) );
/* Decode */
/* Decode or simulate packet loss */
out_frm.buf = (char*)pcmbuf;
out_frm.size = sizeof(pcmbuf);
CHECK( codec->op->decode(codec, &frames[0], sizeof(pcmbuf),
&out_frm) );
if ((pj_rand() % 100) < lost_pct) {
/* Simulate loss */
CHECK( codec->op->recover(codec, sizeof(pcmbuf), &out_frm) );
TRACE_((THIS_FILE, "%d.%03d Packet lost", T));
} else {
/* Decode */
CHECK( codec->op->decode(codec, &frames[0], sizeof(pcmbuf),
&out_frm) );
}
/* Write to WAV */
CHECK( pjmedia_port_put_frame(wavout, &out_frm) );
file_msec_duration += samples_per_frame * 1000 /
param.info.clock_rate;
TRACE_((THIS_FILE, "Bytes read: %u, encode: %u, decode/write: %u",
frm_pcm.size, frm_bit.size, out_frm.size));
TRACE_((THIS_FILE, "%d.%03d read: %u, enc: %u, dec/write: %u",
T, frm_pcm.size, frm_bit.size, out_frm.size));
}
/* Close wavs */
@ -237,7 +281,7 @@ int main(int argc, char *argv[])
puts("Success");
printf("Duration: %ds.%03d\n", file_msec_duration/1000,
file_msec_duration%1000);
printf("Time: %ds.%03d\n", t1.sec, t1.msec);
printf("Time: %lds.%03ld\n", t1.sec, t1.msec);
}
return 0;