Home --> Documentations --> PJMEDIA Reference
This example mainly demonstrates how to stream media file to remote peer using RTP.
This file is pjsip-apps/src/samples/streamutil.c
33#include <pjlib-util.h>
47#define HAVE_MULTICAST 1
49static const char *desc =
53 " Demonstrate how to use pjmedia stream component to transmit/receive \n"
54 " RTP packets to/from sound device. \n"
58 " streamutil [options] \n"
62 " --codec=CODEC Set the codec name. \n"
63 " --local-port=PORT Set local RTP port (default=4000) \n"
64 " --remote=IP:PORT Set the remote peer. If this option is set, \n"
65 " the program will transmit RTP audio to the \n"
66 " specified address. (default: recv only) \n"
68 " --mcast-add=IP Joins the multicast group as specified by \n"
69 " the address. Sample usage: \n"
71 " streamutil --remote=[multicast_addr]:[port] \n"
73 " streamutil --local-port=[port] \n"
74 " --mcast-add=[multicast_addr] \n"
76 " --play-file=WAV Send audio from the WAV file instead of from \n"
77 " the sound device. \n"
78 " --record-file=WAV Record incoming audio to WAV file instead of \n"
79 " playing it to sound device. \n"
80 " --send-recv Set stream direction to bidirectional. \n"
81 " --send-only Set stream direction to send only \n"
82 " --recv-only Set stream direction to recv only (default) \n"
84#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
85 " --use-srtp[=NAME] Enable SRTP with crypto suite NAME \n"
86 " e.g: AES_CM_128_HMAC_SHA1_80 (default), \n"
87 " AES_CM_128_HMAC_SHA1_32 \n"
88 " Use this option along with the TX & RX keys, \n"
89 " formated of 60 hex digits (e.g: E148DA..) \n"
90 " --srtp-tx-key SRTP key for transmiting \n"
91 " --srtp-rx-key SRTP key for receiving \n"
92 " --srtp-dtls-client Use DTLS for SRTP keying, as DTLS client \n"
93 " --srtp-dtls-server Use DTLS for SRTP keying, as DTLS server \n"
102#define THIS_FILE "stream.c"
107static void print_stream_stat(pjmedia_stream * stream,
111int my_hex_string_to_octet_string( char *raw, char *hex, int len)
114 for (i = 0; i < len; i+=2) {
120 raw[i/2] = (char)(tmp & 0xFF);
145# if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
153 pjmedia_stream **p_stream )
158#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
175#if PJMEDIA_HAS_RTCP_XR && PJMEDIA_STREAM_ENABLE_XR
177 info.rtcp_xr_enabled = PJ_TRUE;
252 imr.imr_multiaddr.s_addr = mcast_addr-> sin_addr.s_addr;
253 imr.imr_interface.s_addr = pj_htonl(PJ_INADDR_ANY);
289#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
297 if (is_dtls_client || is_dtls_server) {
303 PJ_LOG(3, (THIS_FILE, "Local cert fingerprint: %s", fp));
305 pj_bzero(&dtls_param, sizeof(dtls_param));
319 tx_plc. key = *srtp_tx_key;
320 tx_plc. name = *crypto_suite;
321 rx_plc. key = *srtp_rx_key;
322 rx_plc. name = *crypto_suite;
342 app_perror(THIS_FILE, "Error creating stream", status);
366int main( int argc, char *argv[])
371 pjmedia_port *rec_file_port = NULL, *play_file_port = NULL;
374 pjmedia_stream * stream = NULL;
380#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
387 pj_str_t srtp_crypto_suite = {NULL, 0};
400 char *codec_id = NULL;
401 char *rec_file = NULL;
402 char *play_file = NULL;
407 OPT_LOCAL_PORT = 'p',
411 OPT_RECORD_FILE = 'R',
415#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
418 OPT_SRTP_TX_KEY = 'x',
419 OPT_SRTP_RX_KEY = 'y',
420 OPT_SRTP_DTLS_CLIENT = 'd',
421 OPT_SRTP_DTLS_SERVER = 'D',
426 { "codec", 1, 0, OPT_CODEC },
427 { "local-port", 1, 0, OPT_LOCAL_PORT },
428 { "remote", 1, 0, OPT_REMOTE },
429 { "mcast-add", 1, 0, OPT_MCAST },
430 { "play-file", 1, 0, OPT_PLAY_FILE },
431 { "record-file", 1, 0, OPT_RECORD_FILE },
432 { "send-recv", 0, 0, OPT_SEND_RECV },
433 { "send-only", 0, 0, OPT_SEND_ONLY },
434 { "recv-only", 0, 0, OPT_RECV_ONLY },
435#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
436 { "use-srtp", 2, 0, OPT_USE_SRTP },
437 { "srtp-tx-key", 1, 0, OPT_SRTP_TX_KEY },
438 { "srtp-rx-key", 1, 0, OPT_SRTP_RX_KEY },
439 { "srtp-dtls-client", 0, 0, OPT_SRTP_DTLS_CLIENT },
440 { "srtp-dtls-server", 0, 0, OPT_SRTP_DTLS_SERVER },
442 { "help", 0, 0, OPT_HELP },
450 pj_bzero(&remote_addr, sizeof(remote_addr));
460 while((c=pj_getopt_long(argc,argv, "h", long_options, &option_index))!=-1) {
464 codec_id = pj_optarg;
469 if (local_port < 1) {
470 printf( "Error: invalid local port %s\n", pj_optarg);
482 app_perror(THIS_FILE, "Invalid remote address", status);
495 app_perror(THIS_FILE, "Invalid mcast address", status);
502 play_file = pj_optarg;
505 case OPT_RECORD_FILE:
506 rec_file = pj_optarg;
521#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
525 pj_strset(&srtp_crypto_suite, pj_optarg, strlen(pj_optarg));
527 srtp_crypto_suite = pj_str( "AES_CM_128_HMAC_SHA1_80");
531 case OPT_SRTP_TX_KEY:
532 tmp_key_len = my_hex_string_to_octet_string(tmp_tx_key, pj_optarg,
533 ( int)strlen(pj_optarg));
534 pj_strset(&srtp_tx_key, tmp_tx_key, tmp_key_len/2);
537 case OPT_SRTP_RX_KEY:
538 tmp_key_len = my_hex_string_to_octet_string(tmp_rx_key, pj_optarg,
539 ( int)strlen(pj_optarg));
540 pj_strset(&srtp_rx_key, tmp_rx_key, tmp_key_len/2);
542 case OPT_SRTP_DTLS_CLIENT:
544 if (is_dtls_server) {
545 printf( "Error: Cannot be as both DTLS server & client\n");
549 case OPT_SRTP_DTLS_SERVER:
551 if (is_dtls_client) {
552 printf( "Error: Cannot be as both DTLS server & client\n");
563 printf( "Invalid options %s\n", argv[pj_optind]);
572# if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
573 || is_dtls_client || is_dtls_server
576 if (remote_addr. sin_addr.s_addr == 0) {
577 printf( "Error: remote address must be set\n");
583 printf( "Direction is set to --send-only because of --play-file\n");
587#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
590 if (!is_dtls_client && !is_dtls_server &&
591 (!srtp_tx_key. slen || !srtp_rx_key. slen))
593 printf( "Error: Key for each SRTP stream direction must be set\n");
619 status = init_codecs(med_endpt);
629 &str_codec_id, &count,
632 printf( "Error: unable to find codec %s\n", codec_id);
647 status = create_stream(pool, med_endpt, codec_info, dir, local_port,
648 &remote_addr, mcast, &mcast_addr,
649# if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
650 use_srtp, &srtp_crypto_suite,
651 &srtp_tx_key, &srtp_rx_key,
652 is_dtls_client, is_dtls_server,
676 0, -1, &play_file_port);
678 app_perror(THIS_FILE, "Unable to use file", status);
685 app_perror(THIS_FILE, "Unable to create master port", status);
691 app_perror(THIS_FILE, "Error starting master port", status);
695 printf( "Playing from WAV file %s..\n", play_file);
697 } else if (rec_file) {
704 0, 0, &rec_file_port);
706 app_perror(THIS_FILE, "Unable to use file", status);
713 app_perror(THIS_FILE, "Unable to create master port", status);
719 app_perror(THIS_FILE, "Error starting master port", status);
723 printf( "Recording to WAV file %s..\n", rec_file);
752 app_perror(THIS_FILE, "Unable to create sound port", status);
769 printf( "Stream is active, dir is recv-only, local port is %d\n",
772 printf( "Stream is active, dir is send-only, sending to %s:%d\n",
777 printf( "Stream is active, send/recv, local port is %d, "
778 "sending to %s:%d\n",
789 puts( " s Display media statistics");
793 printf( "Command: "); fflush(stdout);
795 if (fgets(tmp, sizeof(tmp), stdin) == NULL) {
796 puts( "EOF while reading stdin, will quit now..");
801 print_stream_stat( stream, &codec_param);
802 else if (tmp[0] == 'q')
824 play_file_port = NULL;
867static const char *good_number( char *buf, pj_int32_t val)
870 pj_ansi_sprintf(buf, "%d", val);
871 } else if (val < 1000000) {
872 pj_ansi_sprintf(buf, "%d.%dK",
876 pj_ansi_sprintf(buf, "%d.%02dM",
878 (val % 1000000) / 10000);
885#define SAMPLES_TO_USEC(usec, samples, clock_rate) \
887 if (samples <= 4294) \
888 usec = samples * 1000000 / clock_rate; \
890 usec = samples * 1000 / clock_rate; \
895#define PRINT_VOIP_MTC_VAL(s, v) \
897 sprintf(s, "(na)"); \
905static void print_stream_stat(pjmedia_stream * stream,
908 char duration[80], last_update[80];
909 char bps[16], ipbps[16], packets[16], bytes[16], ipbytes[16];
919 puts( "Stream statistics:");
923 sprintf(duration, " Duration: %02ld:%02ld:%02ld.%03ld",
925 (now. sec % 3600) / 60,
930 printf( " Info: audio %dHz, %dms/frame, %sB/s (%sB/s +IP hdr)\n",
934 good_number(ipbps, ((codec_param-> info. avg_bps+7)/8) +
940 strcpy(last_update, "never");
944 sprintf(last_update, "%02ldh:%02ldm:%02ld.%03lds ago",
946 (now. sec % 3600) / 60,
951 printf( " RX stat last update: %s\n"
952 " total %s packets %sB received (%sB +IP hdr)%s\n"
953 " pkt loss=%d (%3.1f%%), dup=%d (%3.1f%%), reorder=%d (%3.1f%%)%s\n"
954 " (msec) min avg max last dev\n"
955 " loss period: %7.3f %7.3f %7.3f %7.3f %7.3f%s\n"
956 " jitter : %7.3f %7.3f %7.3f %7.3f %7.3f%s\n",
958 good_number(packets, stat. rx. pkt),
959 good_number(bytes, stat. rx. bytes),
985 strcpy(last_update, "never");
989 sprintf(last_update, "%02ldh:%02ldm:%02ld.%03lds ago",
991 (now. sec % 3600) / 60,
996 printf( " TX stat last update: %s\n"
997 " total %s packets %sB sent (%sB +IP hdr)%s\n"
998 " pkt loss=%d (%3.1f%%), dup=%d (%3.1f%%), reorder=%d (%3.1f%%)%s\n"
999 " (msec) min avg max last dev\n"
1000 " loss period: %7.3f %7.3f %7.3f %7.3f %7.3f%s\n"
1001 " jitter : %7.3f %7.3f %7.3f %7.3f %7.3f%s\n",
1003 good_number(packets, stat. tx. pkt),
1004 good_number(bytes, stat. tx. bytes),
1005 good_number(ipbytes, stat. tx. bytes + stat. tx. pkt * 32),
1029 printf( " RTT delay : %7.3f %7.3f %7.3f %7.3f %7.3f%s\n",
1038#if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0)
1041 char loss[16], dup[16];
1044 char plc[16], jba[16], jbr[16];
1045 char signal_lvl[16], noise_lvl[16], rerl[16];
1046 char r_factor[16], ext_r_factor[16], mos_lq[16], mos_cq[16];
1052 puts( "\nExtended reports:");
1055 puts( " Statistics Summary");
1057 if (xr_stat. rx.stat_sum. l)
1058 sprintf(loss, "%d", xr_stat. rx.stat_sum. lost);
1060 sprintf(loss, "(na)");
1062 if (xr_stat. rx.stat_sum. d)
1063 sprintf(dup, "%d", xr_stat. rx.stat_sum. dup);
1065 sprintf(dup, "(na)");
1067 if (xr_stat. rx.stat_sum. j) {
1068 unsigned jmin, jmax, jmean, jdev;
1070 SAMPLES_TO_USEC(jmin, xr_stat. rx.stat_sum. jitter. min,
1072 SAMPLES_TO_USEC(jmax, xr_stat. rx.stat_sum. jitter. max,
1074 SAMPLES_TO_USEC(jmean, xr_stat. rx.stat_sum. jitter. mean,
1076 SAMPLES_TO_USEC(jdev,
1079 sprintf(jitter, "%7.3f %7.3f %7.3f %7.3f",
1080 jmin/1000.0, jmean/1000.0, jmax/1000.0, jdev/1000.0);
1082 sprintf(jitter, "(report not available)");
1084 if (xr_stat. rx.stat_sum. t) {
1085 sprintf(toh, "%11d %11d %11d %11d",
1091 sprintf(toh, "(report not available)");
1094 strcpy(last_update, "never");
1098 sprintf(last_update, "%02ldh:%02ldm:%02ld.%03lds ago",
1100 (now. sec % 3600) / 60,
1105 printf( " RX last update: %s\n"
1106 " begin seq=%d, end seq=%d%s\n"
1107 " pkt loss=%s, dup=%s%s\n"
1108 " (msec) min avg max dev\n"
1120 if (xr_stat. tx.stat_sum. l)
1121 sprintf(loss, "%d", xr_stat. tx.stat_sum. lost);
1123 sprintf(loss, "(na)");
1125 if (xr_stat. tx.stat_sum. d)
1126 sprintf(dup, "%d", xr_stat. tx.stat_sum. dup);
1128 sprintf(dup, "(na)");
1130 if (xr_stat. tx.stat_sum. j) {
1131 unsigned jmin, jmax, jmean, jdev;
1133 SAMPLES_TO_USEC(jmin, xr_stat. tx.stat_sum. jitter. min,
1135 SAMPLES_TO_USEC(jmax, xr_stat. tx.stat_sum. jitter. max,
1137 SAMPLES_TO_USEC(jmean, xr_stat. tx.stat_sum. jitter. mean,
1139 SAMPLES_TO_USEC(jdev,
1142 sprintf(jitter, "%7.3f %7.3f %7.3f %7.3f",
1143 jmin/1000.0, jmean/1000.0, jmax/1000.0, jdev/1000.0);
1145 sprintf(jitter, "(report not available)");
1147 if (xr_stat. tx.stat_sum. t) {
1148 sprintf(toh, "%11d %11d %11d %11d",
1154 sprintf(toh, "(report not available)");
1157 strcpy(last_update, "never");
1161 sprintf(last_update, "%02ldh:%02ldm:%02ld.%03lds ago",
1163 (now. sec % 3600) / 60,
1168 printf( " TX last update: %s\n"
1169 " begin seq=%d, end seq=%d%s\n"
1170 " pkt loss=%s, dup=%s%s\n"
1171 " (msec) min avg max dev\n"
1184 puts( " VoIP Metrics");
1186 PRINT_VOIP_MTC_VAL(signal_lvl, xr_stat. rx.voip_mtc. signal_lvl);
1187 PRINT_VOIP_MTC_VAL(noise_lvl, xr_stat. rx.voip_mtc. noise_lvl);
1188 PRINT_VOIP_MTC_VAL(rerl, xr_stat. rx.voip_mtc. rerl);
1189 PRINT_VOIP_MTC_VAL(r_factor, xr_stat. rx.voip_mtc. r_factor);
1190 PRINT_VOIP_MTC_VAL(ext_r_factor, xr_stat. rx.voip_mtc. ext_r_factor);
1191 PRINT_VOIP_MTC_VAL(mos_lq, xr_stat. rx.voip_mtc. mos_lq);
1192 PRINT_VOIP_MTC_VAL(mos_cq, xr_stat. rx.voip_mtc. mos_cq);
1195 case PJMEDIA_RTCP_XR_PLC_DIS:
1196 sprintf(plc, "DISABLED");
1198 case PJMEDIA_RTCP_XR_PLC_ENH:
1199 sprintf(plc, "ENHANCED");
1201 case PJMEDIA_RTCP_XR_PLC_STD:
1202 sprintf(plc, "STANDARD");
1204 case PJMEDIA_RTCP_XR_PLC_UNK:
1206 sprintf(plc, "UNKNOWN");
1211 case PJMEDIA_RTCP_XR_JB_FIXED:
1212 sprintf(jba, "FIXED");
1214 case PJMEDIA_RTCP_XR_JB_ADAPTIVE:
1215 sprintf(jba, "ADAPTIVE");
1218 sprintf(jba, "UNKNOWN");
1222 sprintf(jbr, "%d", xr_stat. rx.voip_mtc. rx_config & 0x0F);
1225 strcpy(last_update, "never");
1229 sprintf(last_update, "%02ldh:%02ldm:%02ld.%03lds ago",
1231 (now. sec % 3600) / 60,
1236 printf( " RX last update: %s\n"
1237 " packets : loss rate=%d (%.2f%%), discard rate=%d (%.2f%%)\n"
1238 " burst : density=%d (%.2f%%), duration=%d%s\n"
1239 " gap : density=%d (%.2f%%), duration=%d%s\n"
1240 " delay : round trip=%d%s, end system=%d%s\n"
1241 " level : signal=%s%s, noise=%s%s, RERL=%s%s\n"
1242 " quality : R factor=%s, ext R factor=%s\n"
1243 " MOS LQ=%s, MOS CQ=%s\n"
1244 " config : PLC=%s, JB=%s, JB rate=%s, Gmin=%d\n"
1245 " JB delay : cur=%d%s, max=%d%s, abs max=%d%s\n",
1264 r_factor, ext_r_factor, mos_lq, mos_cq,
1266 plc, jba, jbr, xr_stat. rx.voip_mtc. gmin,
1273 PRINT_VOIP_MTC_VAL(signal_lvl, xr_stat. tx.voip_mtc. signal_lvl);
1274 PRINT_VOIP_MTC_VAL(noise_lvl, xr_stat. tx.voip_mtc. noise_lvl);
1275 PRINT_VOIP_MTC_VAL(rerl, xr_stat. tx.voip_mtc. rerl);
1276 PRINT_VOIP_MTC_VAL(r_factor, xr_stat. tx.voip_mtc. r_factor);
1277 PRINT_VOIP_MTC_VAL(ext_r_factor, xr_stat. tx.voip_mtc. ext_r_factor);
1278 PRINT_VOIP_MTC_VAL(mos_lq, xr_stat. tx.voip_mtc. mos_lq);
1279 PRINT_VOIP_MTC_VAL(mos_cq, xr_stat. tx.voip_mtc. mos_cq);
1282 case PJMEDIA_RTCP_XR_PLC_DIS:
1283 sprintf(plc, "DISABLED");
1285 case PJMEDIA_RTCP_XR_PLC_ENH:
1286 sprintf(plc, "ENHANCED");
1288 case PJMEDIA_RTCP_XR_PLC_STD:
1289 sprintf(plc, "STANDARD");
1291 case PJMEDIA_RTCP_XR_PLC_UNK:
1293 sprintf(plc, "unknown");
1298 case PJMEDIA_RTCP_XR_JB_FIXED:
1299 sprintf(jba, "FIXED");
1301 case PJMEDIA_RTCP_XR_JB_ADAPTIVE:
1302 sprintf(jba, "ADAPTIVE");
1305 sprintf(jba, "unknown");
1309 sprintf(jbr, "%d", xr_stat. tx.voip_mtc. rx_config & 0x0F);
1312 strcpy(last_update, "never");
1316 sprintf(last_update, "%02ldh:%02ldm:%02ld.%03lds ago",
1318 (now. sec % 3600) / 60,
1323 printf( " TX last update: %s\n"
1324 " packets : loss rate=%d (%.2f%%), discard rate=%d (%.2f%%)\n"
1325 " burst : density=%d (%.2f%%), duration=%d%s\n"
1326 " gap : density=%d (%.2f%%), duration=%d%s\n"
1327 " delay : round trip=%d%s, end system=%d%s\n"
1328 " level : signal=%s%s, noise=%s%s, RERL=%s%s\n"
1329 " quality : R factor=%s, ext R factor=%s\n"
1330 " MOS LQ=%s, MOS CQ=%s\n"
1331 " config : PLC=%s, JB=%s, JB rate=%s, Gmin=%d\n"
1332 " JB delay : cur=%d%s, max=%d%s, abs max=%d%s\n",
1351 r_factor, ext_r_factor, mos_lq, mos_cq,
1353 plc, jba, jbr, xr_stat. tx.voip_mtc. gmin,
1362 printf( " (msec) min avg max last dev\n");
1363 printf( " RTT delay : %7.3f %7.3f %7.3f %7.3f %7.3f%s\n",
1364 xr_stat. rtt. min / 1000.0,
1366 xr_stat. rtt. max / 1000.0,
pj_status_t pjmedia_endpt_create(pj_pool_factory *pf, pj_ioqueue_t *ioqueue, unsigned worker_cnt, pjmedia_endpt **p_endpt) Definition: endpoint.h:127
pj_status_t pjmedia_endpt_destroy(pjmedia_endpt *endpt) Definition: endpoint.h:168
pjmedia_codec_mgr * pjmedia_endpt_get_codec_mgr(pjmedia_endpt *endpt)
pj_status_t pjmedia_snd_port_connect(pjmedia_snd_port *snd_port, pjmedia_port *port)
pj_status_t pjmedia_snd_port_create_player(pj_pool_t *pool, int index, unsigned clock_rate, unsigned channel_count, unsigned samples_per_frame, unsigned bits_per_sample, unsigned options, pjmedia_snd_port **p_port)
pj_status_t pjmedia_snd_port_create(pj_pool_t *pool, int rec_id, int play_id, unsigned clock_rate, unsigned channel_count, unsigned samples_per_frame, unsigned bits_per_sample, unsigned options, pjmedia_snd_port **p_port)
pj_status_t pjmedia_snd_port_destroy(pjmedia_snd_port *snd_port)
pj_status_t pjmedia_snd_port_create_rec(pj_pool_t *pool, int index, unsigned clock_rate, unsigned channel_count, unsigned samples_per_frame, unsigned bits_per_sample, unsigned options, pjmedia_snd_port **p_port)
struct pjmedia_snd_port pjmedia_snd_port Definition: sound_port.h:145
pj_status_t pjmedia_stream_get_stat(const pjmedia_stream *stream, pjmedia_rtcp_stat *stat)
pj_status_t pjmedia_stream_create(pjmedia_endpt *endpt, pj_pool_t *pool, const pjmedia_stream_info *info, pjmedia_transport *tp, void *user_data, pjmedia_stream **p_stream)
pj_status_t pjmedia_stream_start(pjmedia_stream *stream)
pj_status_t pjmedia_stream_destroy(pjmedia_stream *stream)
pj_status_t pjmedia_stream_get_port(pjmedia_stream *stream, pjmedia_port **p_port)
pjmedia_transport * pjmedia_stream_get_transport(pjmedia_stream *st)
pj_status_t pj_init(void)
unsigned short pj_uint16_t
void pj_caching_pool_destroy(pj_caching_pool *ch_pool)
void pj_caching_pool_init(pj_caching_pool *ch_pool, const pj_pool_factory_policy *policy, pj_size_t max_capacity)
#define PJ_LOG(level, arg)
pj_pool_factory_policy pj_pool_factory_default_policy
pj_pool_t * pj_pool_create(pj_pool_factory *factory, const char *name, pj_size_t initial_size, pj_size_t increment_size, pj_pool_callback *callback)
void pj_pool_release(pj_pool_t *pool)
void * pj_memcpy(void *dst, const void *src, pj_size_t size)
pj_str_t pj_str(char *str)
pj_str_t * pj_strset(pj_str_t *str, char *ptr, pj_size_t length)
void * pj_memset(void *dst, int c, pj_size_t size)
void pj_bzero(void *dst, pj_size_t size)
pj_status_t pj_sockaddr_init(int af, pj_sockaddr *addr, const pj_str_t *cp, pj_uint16_t port)
pj_status_t pj_sock_bind(pj_sock_t sockfd, const pj_sockaddr_t *my_addr, int addrlen)
pj_uint16_t pj_sockaddr_get_port(const pj_sockaddr_t *addr)
#define PJ_INET_ADDRSTRLEN
pj_status_t pj_sockaddr_set_port(pj_sockaddr *addr, pj_uint16_t hostport)
pj_uint32_t pj_htonl(pj_uint32_t hostlong)
pj_uint16_t pj_ntohs(pj_uint16_t netshort)
#define pj_IP_ADD_MEMBERSHIP()
pj_status_t pj_sock_setsockopt(pj_sock_t sockfd, pj_uint16_t level, pj_uint16_t optname, const void *optval, int optlen)
#define pj_SO_REUSEADDR()
#define PJ_INVALID_SOCKET
#define pj_IP_MULTICAST_LOOP()
unsigned pj_sockaddr_get_len(const pj_sockaddr_t *addr)
pj_status_t pj_sockaddr_in_init(pj_sockaddr_in *addr, const pj_str_t *cp, pj_uint16_t port)
void pj_sockaddr_cp(pj_sockaddr_t *dst, const pj_sockaddr_t *src)
pj_status_t pj_sock_socket(int family, int type, int protocol, pj_sock_t *sock)
char * pj_inet_ntop2(int af, const void *src, char *dst, int size)
pj_status_t pj_gettimeofday(pj_time_val *tv)
#define PJ_TIME_VAL_SUB(t1, t2)
#define PJ_ASSERT_RETURN(expr, retval)
unsigned pj_hex_digit_to_val(unsigned char c)
int pj_isxdigit(unsigned char c)
unsigned pj_math_stat_get_stddev(const pj_math_stat *stat)
Secure RTP (SRTP) transport.
PJMEDIA small footprint Open Source media stack
Copyright (C) 2006-2008 Teluu Inc.
|