From ccc07a592e872946cd1e07677cd767f7448bc979 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Thu, 27 Apr 2006 22:37:08 +0000 Subject: Initial support for stereo codecs, and added L16 codecs. Also better handling for case remote media is restarted git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@412 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip-apps/build/Samples-vc.mak | 4 +- pjsip-apps/src/samples/confsample.c | 5 +- pjsip-apps/src/samples/level.c | 5 +- pjsip-apps/src/samples/playfile.c | 8 ++- pjsip-apps/src/samples/playsine.c | 6 +- pjsip-apps/src/samples/recfile.c | 4 +- pjsip-apps/src/samples/resampleplay.c | 10 ++-- pjsip-apps/src/samples/simpleua.c | 10 +++- pjsip-apps/src/samples/siprtp.c | 2 +- pjsip-apps/src/samples/sndinfo.c | 26 +++++--- pjsip-apps/src/samples/streamutil.c | 110 ++++++++++++++++++---------------- 11 files changed, 110 insertions(+), 80 deletions(-) (limited to 'pjsip-apps') diff --git a/pjsip-apps/build/Samples-vc.mak b/pjsip-apps/build/Samples-vc.mak index 1aa5d9ac..857f0c15 100644 --- a/pjsip-apps/build/Samples-vc.mak +++ b/pjsip-apps/build/Samples-vc.mak @@ -5,9 +5,9 @@ CC_NAME = vc6-$(BUILD_MODE) LIBEXT = .lib !if "$(BUILD_MODE)" == "debug" -BUILD_FLAGS = /MTd /Od /Zi +BUILD_FLAGS = /MTd /Od /Zi /W4 !else -BUILD_FLAGS = /Ox /MD /DNDEBUG +BUILD_FLAGS = /Ox /MD /DNDEBUG /W4 !endif PJLIB_LIB = ..\..\pjlib\lib\pjlib-$(MACHINE_NAME)-$(OS_NAME)-$(CC_NAME)$(LIBEXT) diff --git a/pjsip-apps/src/samples/confsample.c b/pjsip-apps/src/samples/confsample.c index 843b99fa..539a2c05 100644 --- a/pjsip-apps/src/samples/confsample.c +++ b/pjsip-apps/src/samples/confsample.c @@ -184,7 +184,7 @@ int main(int argc, char *argv[]) } #if RECORDER - status = pjmedia_file_writer_port_create( pool, "confrecord.wav", + status = pjmedia_wav_writer_port_create( pool, "confrecord.wav", clock_rate, channel_count, samples_per_frame, bits_per_sample, 0, 0, NULL, @@ -204,9 +204,10 @@ int main(int argc, char *argv[]) for (i=0; iinfo.sample_rate, /* clock rate. */ + file_port->info.clock_rate, /* clock rate. */ file_port->info.channel_count, /* # of channels. */ file_port->info.samples_per_frame, /* samples per frame. */ file_port->info.bits_per_sample, /* bits per sample. */ diff --git a/pjsip-apps/src/samples/playsine.c b/pjsip-apps/src/samples/playsine.c index 2e83221d..931f9123 100644 --- a/pjsip-apps/src/samples/playsine.c +++ b/pjsip-apps/src/samples/playsine.c @@ -48,6 +48,8 @@ static int app_perror( const char *sender, const char *title, { char errmsg[PJ_ERR_MSG_SIZE]; + PJ_UNUSED_ARG(sender); + pj_strerror(status, errmsg, sizeof(errmsg)); printf("%s: %s [code=%d]\n", title, errmsg, status); @@ -127,7 +129,7 @@ static pj_status_t create_sine_port(pj_pool_t *pool, port->info.name = pj_str("sine generator"); port->info.need_info = 0; port->info.pt = 0xFF; - port->info.sample_rate = sampling_rate; + port->info.clock_rate = sampling_rate; port->info.samples_per_frame = sampling_rate * 20 / 1000 * channel_count; port->info.bytes_per_frame = port->info.samples_per_frame * 2; port->info.type = PJMEDIA_TYPE_AUDIO; @@ -229,7 +231,7 @@ int main(int argc, char *argv[]) status = pjmedia_snd_port_create_player( pool, /* pool */ -1, /* use default dev. */ - sine_port->info.sample_rate, /* clock rate. */ + sine_port->info.clock_rate, /* clock rate. */ sine_port->info.channel_count, /* # of channels. */ sine_port->info.samples_per_frame, /* samples per frame. */ sine_port->info.bits_per_sample, /* bits per sample. */ diff --git a/pjsip-apps/src/samples/recfile.c b/pjsip-apps/src/samples/recfile.c index 3fd96125..2236dcad 100644 --- a/pjsip-apps/src/samples/recfile.c +++ b/pjsip-apps/src/samples/recfile.c @@ -104,7 +104,7 @@ int main(int argc, char *argv[]) ); /* Create WAVE file writer port. */ - status = pjmedia_file_writer_port_create( pool, argv[1], + status = pjmedia_wav_writer_port_create( pool, argv[1], CLOCK_RATE, NCHANNELS, SAMPLES_PER_FRAME, @@ -120,7 +120,7 @@ int main(int argc, char *argv[]) status = pjmedia_snd_port_create_rec( pool, /* pool */ -1, /* use default dev. */ - file_port->info.sample_rate, /* clock rate. */ + file_port->info.clock_rate, /* clock rate. */ file_port->info.channel_count, /* # of channels. */ file_port->info.samples_per_frame, /* samples per frame. */ file_port->info.bits_per_sample, /* bits per sample. */ diff --git a/pjsip-apps/src/samples/resampleplay.c b/pjsip-apps/src/samples/resampleplay.c index 62b6761d..e4440e15 100644 --- a/pjsip-apps/src/samples/resampleplay.c +++ b/pjsip-apps/src/samples/resampleplay.c @@ -108,8 +108,8 @@ int main(int argc, char *argv[]) ); /* Create the file port. */ - status = pjmedia_file_player_port_create( pool, argv[pj_optind], 0, - 0, 0, &file_port); + status = pjmedia_wav_player_port_create( pool, argv[pj_optind], 0, 0, + 0, 0, &file_port); if (status != PJ_SUCCESS) { app_perror(THIS_FILE, "Unable to open file", status); return 1; @@ -128,12 +128,12 @@ int main(int argc, char *argv[]) /* Create the resample port. */ status = pjmedia_resample_port_create( pool, 1, 1, - file_port->info.sample_rate, + file_port->info.clock_rate, sampling_rate, channel_count, (unsigned)( samples_per_frame * 1.0 * - file_port->info.sample_rate / + file_port->info.clock_rate / sampling_rate), &resample_port); if (status != PJ_SUCCESS) { @@ -186,7 +186,7 @@ int main(int argc, char *argv[]) printf("Playing %s at sampling rate %d (original file sampling rate=%d)\n", - argv[pj_optind], sampling_rate, file_port->info.sample_rate); + argv[pj_optind], sampling_rate, file_port->info.clock_rate); puts(""); puts("Press to stop playing and quit"); diff --git a/pjsip-apps/src/samples/simpleua.c b/pjsip-apps/src/samples/simpleua.c index 8079225d..59991af7 100644 --- a/pjsip-apps/src/samples/simpleua.c +++ b/pjsip-apps/src/samples/simpleua.c @@ -419,6 +419,8 @@ int main(int argc, char *argv[]) static void call_on_state_changed( pjsip_inv_session *inv, pjsip_event *e) { + PJ_UNUSED_ARG(e); + if (inv->state == PJSIP_INV_STATE_DISCONNECTED) { PJ_LOG(3,(THIS_FILE, "Call DISCONNECTED [reason=%d (%s)]", @@ -441,6 +443,8 @@ static void call_on_state_changed( pjsip_inv_session *inv, static void call_on_forked(pjsip_inv_session *inv, pjsip_event *e) { /* To be done... */ + PJ_UNUSED_ARG(inv); + PJ_UNUSED_ARG(e); } @@ -633,7 +637,7 @@ static void call_on_media_update( pjsip_inv_session *inv, status = pjmedia_snd_port_create_player( inv->pool, /* pool */ -1, /* sound dev id */ - media_port->info.sample_rate, /* clock rate */ + media_port->info.clock_rate, /* clock rate */ media_port->info.channel_count, /* channel count */ media_port->info.samples_per_frame, /* samples per frame*/ media_port->info.bits_per_sample, /* bits per sample */ @@ -642,7 +646,7 @@ static void call_on_media_update( pjsip_inv_session *inv, if (status != PJ_SUCCESS) { app_perror( THIS_FILE, "Unable to create sound player", status); PJ_LOG(3,(THIS_FILE, "%d %d %d %d", - media_port->info.sample_rate, /* clock rate */ + media_port->info.clock_rate, /* clock rate */ media_port->info.channel_count, /* channel count */ media_port->info.samples_per_frame, /* samples per frame*/ media_port->info.bits_per_sample /* bits per sample */ @@ -659,7 +663,7 @@ static void call_on_media_update( pjsip_inv_session *inv, status = pjmedia_snd_port_create_rec( inv->pool, /* pool */ -1, /* sound dev id */ - media_port->info.sample_rate, /* clock rate */ + media_port->info.clock_rate, /* clock rate */ media_port->info.channel_count, /* channel count */ media_port->info.samples_per_frame, /* samples per frame*/ media_port->info.bits_per_sample, /* bits per sample */ diff --git a/pjsip-apps/src/samples/siprtp.c b/pjsip-apps/src/samples/siprtp.c index ed14154f..6d1b1dcc 100644 --- a/pjsip-apps/src/samples/siprtp.c +++ b/pjsip-apps/src/samples/siprtp.c @@ -1238,7 +1238,7 @@ static void call_on_media_update( pjsip_inv_session *inv, } } - audio->clock_rate = audio->si.fmt.sample_rate; + audio->clock_rate = audio->si.fmt.clock_rate; audio->samples_per_frame = audio->clock_rate * codec_desc->ptime / 1000; audio->bytes_per_frame = codec_desc->bit_rate * codec_desc->ptime / 1000 / 8; diff --git a/pjsip-apps/src/samples/sndinfo.c b/pjsip-apps/src/samples/sndinfo.c index ee9a385c..3a184164 100644 --- a/pjsip-apps/src/samples/sndinfo.c +++ b/pjsip-apps/src/samples/sndinfo.c @@ -73,10 +73,10 @@ static void enum_devices(void) puts("Run with -h to get more options"); } -static int clock_rate; -static int play_counter; -static int rec_counter; -static int min_delay = 0xFFFF, max_delay; +static unsigned clock_rate; +static unsigned play_counter; +static unsigned rec_counter; +static unsigned min_delay = 0xFFFF, max_delay; static char play_delays[1000]; static pj_uint32_t last_play_timestamp, last_rec_timestamp; @@ -85,6 +85,12 @@ static pj_status_t play_cb(void *user_data, pj_uint32_t timestamp, { static pj_timestamp last_cb; + + PJ_UNUSED_ARG(user_data); + PJ_UNUSED_ARG(output); + PJ_UNUSED_ARG(size); + + ++play_counter; last_play_timestamp = timestamp; @@ -92,7 +98,7 @@ static pj_status_t play_cb(void *user_data, pj_uint32_t timestamp, pj_get_timestamp(&last_cb); } else if (play_counter <= PJ_ARRAY_SIZE(play_delays)) { pj_timestamp now; - int delay; + unsigned delay; pj_get_timestamp(&now); @@ -104,7 +110,7 @@ static pj_status_t play_cb(void *user_data, pj_uint32_t timestamp, last_cb = now; - play_delays[play_counter-1] = delay; + play_delays[play_counter-1] = (char)delay; } return PJ_SUCCESS; @@ -113,6 +119,12 @@ static pj_status_t play_cb(void *user_data, pj_uint32_t timestamp, static pj_status_t rec_cb(void *user_data, pj_uint32_t timestamp, const void *input, unsigned size) { + + PJ_UNUSED_ARG(size); + PJ_UNUSED_ARG(input); + PJ_UNUSED_ARG(user_data); + + ++rec_counter; if (timestamp - last_rec_timestamp >= clock_rate) { @@ -248,7 +260,7 @@ int main(int argc, char *argv[]) } else if (argc == 6) { int dev_id; - pjmedia_dir dir; + pjmedia_dir dir = PJMEDIA_DIR_NONE; int nchannel; int bits; diff --git a/pjsip-apps/src/samples/streamutil.c b/pjsip-apps/src/samples/streamutil.c index 8c412c83..686a2efe 100644 --- a/pjsip-apps/src/samples/streamutil.c +++ b/pjsip-apps/src/samples/streamutil.c @@ -31,9 +31,7 @@ static const char *desc = "\n" "\n" " Options:\n" - " --codec=CODEC Set the codec name. Valid codec names are: \n" - " pcma, pcmu, gsm, speexnb, speexwb, speexuwb. \n" - " (default: pcma). \n" + " --codec=CODEC Set the codec name. \n" " --local-port=PORT Set local RTP port (default=4000) \n" " --remote=IP:PORT Set the remote peer. If this option is set, \n" " the program will transmit RTP audio to the \n" @@ -64,22 +62,6 @@ static const char *desc = #define THIS_FILE "stream.c" -struct codec -{ - char *name; - char *encoding_name; - int pt; - int clock_rate; -} codec[] = -{ - { "pcma", "pcma", PJMEDIA_RTP_PT_PCMA, 8000 }, - { "pcmu", "pcmu", PJMEDIA_RTP_PT_PCMU, 8000 }, - { "gsm", "gsm", PJMEDIA_RTP_PT_GSM, 8000 }, - { "speexnb", "speex", 120, 8000 }, - { "speexwb", "speex", 121, 16000 }, - { "speexuwb", "speex", 122, 32000 }, -}; - /* Prototype */ static void print_stream_stat(pjmedia_stream *stream); @@ -101,6 +83,9 @@ static pj_status_t init_codecs(pjmedia_endpt *med_endpt) status = pjmedia_codec_speex_init(med_endpt, 0, -1, -1); PJ_ASSERT_RETURN(status == PJ_SUCCESS, status); + status = pjmedia_codec_l16_init(med_endpt, 0); + PJ_ASSERT_RETURN(status == PJ_SUCCESS, status); + return PJ_SUCCESS; } @@ -110,7 +95,7 @@ static pj_status_t init_codecs(pjmedia_endpt *med_endpt) */ static pj_status_t create_stream( pj_pool_t *pool, pjmedia_endpt *med_endpt, - unsigned codec_index, + const pjmedia_codec_info *codec_info, pjmedia_dir dir, pj_uint16_t local_port, const pj_sockaddr_in *rem_addr, @@ -127,11 +112,8 @@ static pj_status_t create_stream( pj_pool_t *pool, /* Initialize stream info formats */ info.type = PJMEDIA_TYPE_AUDIO; info.dir = dir; - info.fmt.encoding_name = pj_str(codec[codec_index].encoding_name); - info.fmt.type = PJMEDIA_TYPE_AUDIO; - info.fmt.sample_rate = codec[codec_index].clock_rate; - info.fmt.pt = codec[codec_index].pt; - info.tx_pt = codec[codec_index].pt; + pj_memcpy(&info.fmt, codec_info, sizeof(pjmedia_codec_info)); + info.tx_pt = codec_info->pt; info.ssrc = pj_rand(); @@ -199,6 +181,14 @@ static pj_status_t create_stream( pj_pool_t *pool, } +/* + * usage() + */ +static void usage() +{ + puts(desc); +} + /* * main() */ @@ -217,10 +207,11 @@ int main(int argc, char *argv[]) /* Default values */ - int codec_index = 0; + const pjmedia_codec_info *codec_info; pjmedia_dir dir = PJMEDIA_DIR_DECODING; pj_sockaddr_in remote_addr; pj_uint16_t local_port = 4000; + char *codec_id = NULL; char *rec_file = NULL; char *play_file = NULL; @@ -233,6 +224,7 @@ int main(int argc, char *argv[]) OPT_SEND_RECV = 'b', OPT_SEND_ONLY = 's', OPT_RECV_ONLY = 'i', + OPT_HELP = 'h', }; struct pj_getopt_option long_options[] = { @@ -244,6 +236,7 @@ int main(int argc, char *argv[]) { "send-recv", 0, 0, OPT_SEND_RECV }, { "send-only", 0, 0, OPT_SEND_ONLY }, { "recv-only", 0, 0, OPT_RECV_ONLY }, + { "help", 0, 0, OPT_HELP }, { NULL, 0, 0, 0 }, }; @@ -261,25 +254,11 @@ int main(int argc, char *argv[]) /* Parse arguments */ pj_optind = 0; - while((c=pj_getopt_long(argc,argv, "", long_options, &option_index))!=-1) { + while((c=pj_getopt_long(argc,argv, "h", long_options, &option_index))!=-1) { switch (c) { case OPT_CODEC: - { - unsigned i; - for (i=0; iinfo.samples_per_frame * 1000 / + stream_port->info.clock_rate; + status = pjmedia_wav_player_port_create(pool, play_file, wav_ptime, + 0, -1, NULL, &play_file_port); if (status != PJ_SUCCESS) { app_perror(THIS_FILE, "Unable to use file", status); goto on_exit; @@ -409,21 +413,21 @@ int main(int argc, char *argv[]) /* Create sound device port. */ if (dir == PJMEDIA_DIR_ENCODING_DECODING) status = pjmedia_snd_port_create(pool, -1, -1, - stream_port->info.sample_rate, + stream_port->info.clock_rate, stream_port->info.channel_count, stream_port->info.samples_per_frame, stream_port->info.bits_per_sample, 0, &snd_port); else if (dir == PJMEDIA_DIR_ENCODING) status = pjmedia_snd_port_create_rec(pool, -1, - stream_port->info.sample_rate, + stream_port->info.clock_rate, stream_port->info.channel_count, stream_port->info.samples_per_frame, stream_port->info.bits_per_sample, 0, &snd_port); else status = pjmedia_snd_port_create_player(pool, -1, - stream_port->info.sample_rate, + stream_port->info.clock_rate, stream_port->info.channel_count, stream_port->info.samples_per_frame, stream_port->info.bits_per_sample, @@ -576,12 +580,12 @@ static void print_stream_stat(pjmedia_stream *stream) printf(" Info: audio %.*s@%dHz, %dms/frame, %sB/s (%sB/s +IP hdr)\n", (int)port->info.encoding_name.slen, port->info.encoding_name.ptr, - port->info.sample_rate, - port->info.samples_per_frame * 1000 / port->info.sample_rate, - good_number(bps, port->info.bytes_per_frame * port->info.sample_rate / - port->info.sample_rate), + port->info.clock_rate, + port->info.samples_per_frame * 1000 / port->info.clock_rate, + good_number(bps, port->info.bytes_per_frame * port->info.clock_rate / + port->info.samples_per_frame), good_number(ipbps, (port->info.bytes_per_frame+32) * - port->info.sample_rate / port->info.sample_rate)); + port->info.clock_rate / port->info.clock_rate)); if (stat.rx.update_cnt == 0) strcpy(last_update, "never"); -- cgit v1.2.3