亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? siprtp.c

?? 基于sip協議的網絡電話源碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
/* $Id: siprtp.c 974 2007-02-19 01:13:53Z bennylp $ *//*  * Copyright (C) 2003-2007 Benny Prijono <benny@prijono.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  *//* Usage */static const char *USAGE = " PURPOSE:								    \n""   This program establishes SIP INVITE session and media, and calculate    \n""   the media quality (packet lost, jitter, rtt, etc.). Unlike normal	    \n""   pjmedia applications, this program bypasses all pjmedia stream	    \n""   framework and transmit encoded RTP packets manually using own thread.   \n""\n"" USAGE:\n""   siprtp [options]        => to start in server mode\n""   siprtp [options] URL    => to start in client mode\n""\n"" Program options:\n""   --count=N,        -c    Set number of calls to create (default:1) \n""   --duration=SEC,   -d    Set maximum call duration (default:unlimited) \n""   --auto-quit,      -q    Quit when calls have been completed (default:no)\n""\n"" Address and ports options:\n""   --local-port=PORT,-p    Set local SIP port (default: 5060)\n""   --rtp-port=PORT,  -r    Set start of RTP port (default: 4000)\n""   --ip-addr=IP,     -i    Set local IP address to use (otherwise it will\n""                           try to determine local IP address from hostname)\n""\n"" Logging Options:\n""   --log-level=N,    -l    Set log verbosity level (default=5)\n""   --app-log-level=N       Set app screen log verbosity (default=3)\n""   --log-file=FILE         Write log to file FILE\n""   --report-file=FILE      Write report to file FILE\n""\n"/* Don't support this anymore, because codec is properly examined in   pjmedia_session_info_from_sdp() function." Codec Options:\n""   --a-pt=PT               Set audio payload type to PT (default=0)\n""   --a-name=NAME           Set audio codec name to NAME (default=pcmu)\n""   --a-clock=RATE          Set audio codec rate to RATE Hz (default=8000Hz)\n""   --a-bitrate=BPS         Set audio codec bitrate to BPS (default=64000bps)\n""   --a-ptime=MS            Set audio frame time to MS msec (default=20ms)\n"*/;/* Include all headers. */#include <pjsip.h>#include <pjmedia.h>#include <pjmedia-codec.h>#include <pjsip_ua.h>#include <pjsip_simple.h>#include <pjlib-util.h>#include <pjlib.h>#include <stdlib.h>#if PJ_HAS_HIGH_RES_TIMER==0#   error "High resolution timer is needed for this sample"#endif#define THIS_FILE	"siprtp.c"#define MAX_CALLS	1024#define RTP_START_PORT	4000/* Codec descriptor: */struct codec{    unsigned	pt;    char*	name;    unsigned	clock_rate;    unsigned	bit_rate;    unsigned	ptime;    char*	description;};/* A bidirectional media stream created when the call is active. */struct media_stream{    /* Static: */    unsigned		 call_index;	    /* Call owner.		*/    unsigned		 media_index;	    /* Media index in call.	*/    pjmedia_transport   *transport;	    /* To send/recv RTP/RTCP	*/    /* Active? */    pj_bool_t		 active;	    /* Non-zero if is in call.	*/    /* Current stream info: */    pjmedia_stream_info	 si;		    /* Current stream info.	*/    /* More info: */    unsigned		 clock_rate;	    /* clock rate		*/    unsigned		 samples_per_frame; /* samples per frame	*/    unsigned		 bytes_per_frame;   /* frame size.		*/    /* RTP session: */    pjmedia_rtp_session	 out_sess;	    /* outgoing RTP session	*/    pjmedia_rtp_session	 in_sess;	    /* incoming RTP session	*/    /* RTCP stats: */    pjmedia_rtcp_session rtcp;		    /* incoming RTCP session.	*/    /* Thread: */    pj_bool_t		 thread_quit_flag;  /* Stop media thread.	*/    pj_thread_t		*thread;	    /* Media thread.		*/};/* This is a call structure that is created when the application starts * and only destroyed when the application quits. */struct call{    unsigned		 index;    pjsip_inv_session	*inv;    unsigned		 media_count;    struct media_stream	 media[1];    pj_time_val		 start_time;    pj_time_val		 response_time;    pj_time_val		 connect_time;    pj_timer_entry	 d_timer;	    /**< Disconnect timer.	*/};/* Application's global variables */static struct app{    unsigned		 max_calls;    unsigned		 uac_calls;    unsigned		 duration;    pj_bool_t		 auto_quit;    unsigned		 thread_count;    int			 sip_port;    int			 rtp_start_port;    pj_str_t		 local_addr;    pj_str_t		 local_uri;    pj_str_t		 local_contact;        int			 app_log_level;    int			 log_level;    char		*log_filename;    char		*report_filename;    struct codec	 audio_codec;    pj_str_t		 uri_to_call;    pj_caching_pool	 cp;    pj_pool_t		*pool;    pjsip_endpoint	*sip_endpt;    pj_bool_t		 thread_quit;    pj_thread_t		*sip_thread[1];    pjmedia_endpt	*med_endpt;    struct call		 call[MAX_CALLS];} app;/* * Prototypes: *//* Callback to be called when SDP negotiation is done in the call: */static void call_on_media_update( pjsip_inv_session *inv,				  pj_status_t status);/* Callback to be called when invite session's state has changed: */static void call_on_state_changed( pjsip_inv_session *inv, 				   pjsip_event *e);/* Callback to be called when dialog has forked: */static void call_on_forked(pjsip_inv_session *inv, pjsip_event *e);/* Callback to be called to handle incoming requests outside dialogs: */static pj_bool_t on_rx_request( pjsip_rx_data *rdata );/* Worker thread prototype */static int sip_worker_thread(void *arg);/* Create SDP for call */static pj_status_t create_sdp( pj_pool_t *pool,			       struct call *call,			       pjmedia_sdp_session **p_sdp);/* Hangup call */static void hangup_call(unsigned index);/* Destroy the call's media */static void destroy_call_media(unsigned call_index);/* Destroy media. */static void destroy_media();/* This callback is called by media transport on receipt of RTP packet. */static void on_rx_rtp(void *user_data, const void *pkt, pj_ssize_t size);/* This callback is called by media transport on receipt of RTCP packet. */static void on_rx_rtcp(void *user_data, const void *pkt, pj_ssize_t size);/* Display error */static void app_perror(const char *sender, const char *title, 		       pj_status_t status);/* Print call */static void print_call(int call_index);/* This is a PJSIP module to be registered by application to handle * incoming requests outside any dialogs/transactions. The main purpose * here is to handle incoming INVITE request message, where we will * create a dialog and INVITE session for it. */static pjsip_module mod_siprtp ={    NULL, NULL,			    /* prev, next.		*/    { "mod-siprtpapp", 13 },	    /* Name.			*/    -1,				    /* Id			*/    PJSIP_MOD_PRIORITY_APPLICATION, /* Priority			*/    NULL,			    /* load()			*/    NULL,			    /* start()			*/    NULL,			    /* stop()			*/    NULL,			    /* unload()			*/    &on_rx_request,		    /* on_rx_request()		*/    NULL,			    /* on_rx_response()		*/    NULL,			    /* on_tx_request.		*/    NULL,			    /* on_tx_response()		*/    NULL,			    /* on_tsx_state()		*/};/* Codec constants */struct codec audio_codecs[] = {    { 0,  "PCMU", 8000, 64000, 20, "G.711 ULaw" },    { 3,  "GSM",  8000, 13200, 20, "GSM" },    { 4,  "G723", 8000, 6400,  30, "G.723.1" },    { 8,  "PCMA", 8000, 64000, 20, "G.711 ALaw" },    { 18, "G729", 8000, 8000,  20, "G.729" },};/* * Init SIP stack */static pj_status_t init_sip(){    unsigned i;    pj_status_t status;    /* init PJLIB-UTIL: */    status = pjlib_util_init();    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);    /* Must create a pool factory before we can allocate any memory. */    pj_caching_pool_init(&app.cp, &pj_pool_factory_default_policy, 0);    /* Create application pool for misc. */    app.pool = pj_pool_create(&app.cp.factory, "app", 1000, 1000, NULL);    /* Create the endpoint: */    status = pjsip_endpt_create(&app.cp.factory, pj_gethostname()->ptr, 				&app.sip_endpt);    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);    /* Add UDP transport. */    {	pj_sockaddr_in addr;	pjsip_host_port addrname;	pjsip_transport *tp;	pj_bzero(&addr, sizeof(addr));	addr.sin_family = PJ_AF_INET;	addr.sin_addr.s_addr = 0;	addr.sin_port = pj_htons((pj_uint16_t)app.sip_port);	if (app.local_addr.slen) {	    addrname.host = app.local_addr;	    addrname.port = app.sip_port;	    status = pj_sockaddr_in_init(&addr, &app.local_addr, 					 (pj_uint16_t)app.sip_port);	    if (status != PJ_SUCCESS) {		app_perror(THIS_FILE, "Unable to resolve IP interface", status);		return status;	    }	}	status = pjsip_udp_transport_start( app.sip_endpt, &addr, 					    (app.local_addr.slen ? &addrname:NULL),					    1, &tp);	if (status != PJ_SUCCESS) {	    app_perror(THIS_FILE, "Unable to start UDP transport", status);	    return status;	}	PJ_LOG(3,(THIS_FILE, "SIP UDP listening on %.*s:%d",		  (int)tp->local_name.host.slen, tp->local_name.host.ptr,		  tp->local_name.port));    }    /*      * Init transaction layer.     * This will create/initialize transaction hash tables etc.     */    status = pjsip_tsx_layer_init_module(app.sip_endpt);    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);    /*  Initialize UA layer. */    status = pjsip_ua_init_module( app.sip_endpt, NULL );    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);    /*  Init invite session module. */    {	pjsip_inv_callback inv_cb;	/* Init the callback for INVITE session: */	pj_bzero(&inv_cb, sizeof(inv_cb));	inv_cb.on_state_changed = &call_on_state_changed;	inv_cb.on_new_session = &call_on_forked;	inv_cb.on_media_update = &call_on_media_update;	/* Initialize invite session module:  */	status = pjsip_inv_usage_init(app.sip_endpt, &inv_cb);	PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);    }    /* Register our module to receive incoming requests. */    status = pjsip_endpt_register_module( app.sip_endpt, &mod_siprtp);    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);    /* Init calls */    for (i=0; i<app.max_calls; ++i)	app.call[i].index = i;    /* Done */    return PJ_SUCCESS;}/* * Destroy SIP */static void destroy_sip(){    unsigned i;    app.thread_quit = 1;    for (i=0; i<app.thread_count; ++i) {	if (app.sip_thread[i]) {	    pj_thread_join(app.sip_thread[i]);	    pj_thread_destroy(app.sip_thread[i]);	    app.sip_thread[i] = NULL;	}    }    if (app.sip_endpt) {	pjsip_endpt_destroy(app.sip_endpt);	app.sip_endpt = NULL;    }}/* * Init media stack. */static pj_status_t init_media(){    unsigned	i, count;    pj_uint16_t	rtp_port;    pj_status_t	status;    /* Initialize media endpoint so that at least error subsystem is properly     * initialized.     */    status = pjmedia_endpt_create(&app.cp.factory, NULL, 1, &app.med_endpt);    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);    /* Must register codecs to be supported */#if defined(PJMEDIA_HAS_G711_CODEC) && PJMEDIA_HAS_G711_CODEC!=0    pjmedia_codec_g711_init(app.med_endpt);#endif    /* RTP port counter */    rtp_port = (pj_uint16_t)(app.rtp_start_port & 0xFFFE);    /* Init media transport for all calls. */    for (i=0, count=0; i<app.max_calls; ++i, ++count) {	unsigned j;	/* Create transport for each media in the call */	for (j=0; j<PJ_ARRAY_SIZE(app.call[0].media); ++j) {	    /* Repeat binding media socket to next port when fails to bind	     * to current port number.	     */	    int retry;	    app.call[i].media[j].call_index = i;	    app.call[i].media[j].media_index = j;	    status = -1;	    for (retry=0; retry<100; ++retry,rtp_port+=2)  {		struct media_stream *m = &app.call[i].media[j];				status = pjmedia_transport_udp_create2(app.med_endpt, 						       "siprtp",						       &app.local_addr,						       rtp_port, 0, 						       &m->transport);		if (status == PJ_SUCCESS) {		    rtp_port += 2;		    break;		}	    }	}	if (status != PJ_SUCCESS)	    goto on_error;    }    /* Done */    return PJ_SUCCESS;on_error:    destroy_media();    return status;}/* * Destroy media. */static void destroy_media(){    unsigned i;    for (i=0; i<app.max_calls; ++i) {	unsigned j;	for (j=0; j<PJ_ARRAY_SIZE(app.call[0].media); ++j) {	    struct media_stream *m = &app.call[i].media[j];	    if (m->transport) {		pjmedia_transport_close(m->transport);		m->transport = NULL;	    }	}    }    if (app.med_endpt) {	pjmedia_endpt_destroy(app.med_endpt);	app.med_endpt = NULL;    }}/* * Make outgoing call. */static pj_status_t make_call(const pj_str_t *dst_uri){    unsigned i;    struct call *call;    pjsip_dialog *dlg;    pjmedia_sdp_session *sdp;    pjsip_tx_data *tdata;    pj_status_t status;    /* Find unused call slot */    for (i=0; i<app.max_calls; ++i) {	if (app.call[i].inv == NULL)	    break;    }    if (i == app.max_calls)	return PJ_ETOOMANY;    call = &app.call[i];    /* Create UAC dialog */    status = pjsip_dlg_create_uac( pjsip_ua_instance(), 				   &app.local_uri,	/* local URI	    */				   &app.local_contact,	/* local Contact    */				   dst_uri,		/* remote URI	    */				   dst_uri,		/* remote target    */				   &dlg);		/* dialog	    */    if (status != PJ_SUCCESS) {	++app.uac_calls;	return status;    }    /* Create SDP */    create_sdp( dlg->pool, call, &sdp);    /* Create the INVITE session. */    status = pjsip_inv_create_uac( dlg, sdp, 0, &call->inv);    if (status != PJ_SUCCESS) {	pjsip_dlg_terminate(dlg);	++app.uac_calls;	return status;    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕欧美激情一区| 视频一区视频二区中文| 精品日韩一区二区三区免费视频| 国产视频一区二区三区在线观看| 久久久久综合网| 亚洲视频你懂的| 日韩精品视频网站| 高清不卡一区二区在线| 在线观看视频一区二区| 91精品中文字幕一区二区三区| 337p日本欧洲亚洲大胆色噜噜| 精品国内二区三区| 亚洲综合久久久| 大胆欧美人体老妇| 欧美一区二区三区免费在线看| 国产亚洲短视频| 日韩成人精品在线| 91网站在线播放| 欧美成人精品3d动漫h| 日韩福利电影在线观看| av中文字幕不卡| 欧美成人伊人久久综合网| 亚洲午夜视频在线观看| 成人av在线看| 国产精品天天看| 成人av电影在线观看| 国产精品久久久久久亚洲毛片 | 在线播放亚洲一区| 亚洲精品中文字幕乱码三区| 99国产精品国产精品久久| 久久五月婷婷丁香社区| 国产一区二区在线免费观看| 欧美成人a视频| 国产精品资源在线看| 久久日韩精品一区二区五区| 日韩电影免费在线看| 欧美性猛交xxxx乱大交退制版 | 国产精品一区三区| 91精品国产综合久久婷婷香蕉| 一区二区三区色| 在线电影一区二区三区| 日韩av中文字幕一区二区三区| 欧美日韩欧美一区二区| 美女在线视频一区| 精品人在线二区三区| 国产伦精品一区二区三区免费| 欧美国产禁国产网站cc| 99re成人精品视频| 一区二区国产视频| 在线播放欧美女士性生活| 久草中文综合在线| 国产欧美精品一区| 99精品视频一区二区| 婷婷久久综合九色综合绿巨人| 欧美大胆一级视频| 波多野洁衣一区| 亚洲123区在线观看| 精品国产百合女同互慰| 粉嫩av一区二区三区在线播放| 中文字幕免费一区| 日韩欧美自拍偷拍| 国产精品18久久久久久久久久久久| 国产精品久久久久久久久晋中| 欧美视频在线一区| 国产一区二区不卡| 一区二区三区四区在线免费观看 | 最新成人av在线| 亚洲国产人成综合网站| 国产成人亚洲综合a∨婷婷| 99精品欧美一区| 91精品中文字幕一区二区三区| www国产成人免费观看视频 深夜成人网| 国产精品你懂的| 国产乱码字幕精品高清av | 久久99国产精品麻豆| 国产一区999| 欧美一级夜夜爽| 一区二区成人在线| 久久99久久99精品免视看婷婷| 一本大道av一区二区在线播放| 中文乱码免费一区二区| 国产a区久久久| 久久成人久久鬼色| 日本不卡视频一二三区| 亚洲成人你懂的| 亚洲亚洲精品在线观看| 欧美亚洲精品一区| 亚洲色图制服诱惑| 婷婷中文字幕综合| 欧美精品久久一区| 奇米综合一区二区三区精品视频| 精品国产污污免费网站入口| 日韩视频永久免费| 欧美一区二区福利视频| 亚洲欧美激情一区二区| 久久嫩草精品久久久精品| 欧美日韩高清在线播放| 色噜噜狠狠成人中文综合| 成人午夜在线免费| 久久爱另类一区二区小说| 亚洲韩国一区二区三区| 中文字幕日韩精品一区| 久久精品亚洲麻豆av一区二区| 欧美日本不卡视频| 欧美精品一级二级三级| 欧美日韩精品一区二区三区四区| 色综合天天综合网国产成人综合天| 韩日av一区二区| 狠狠色丁香婷综合久久| 国产在线观看一区二区| 精品一区二区在线看| 韩国v欧美v日本v亚洲v| 激情国产一区二区| 国产精品夜夜嗨| 国产精品综合在线视频| 狠狠色狠狠色合久久伊人| 久久成人免费网| 国产一区日韩二区欧美三区| 国产一区欧美二区| 国产精品一区二区视频| 成人少妇影院yyyy| 91麻豆免费在线观看| 在线观看91视频| 欧美日韩国产高清一区二区| 91麻豆精品国产91久久久久| 日韩三级免费观看| 欧美mv日韩mv国产网站| 国产日产精品一区| 中文字幕一区二区三区视频| 亚洲精品国产品国语在线app| 亚洲国产一区二区在线播放| 日本亚洲天堂网| 国产精品正在播放| 91首页免费视频| 欧美日韩在线观看一区二区| 51午夜精品国产| 久久蜜桃av一区精品变态类天堂 | 91 com成人网| 精品国产三级电影在线观看| 欧美精品一区在线观看| 亚洲色图制服丝袜| 午夜成人在线视频| 成人一区二区视频| 欧美色图12p| 精品人在线二区三区| 亚洲天堂久久久久久久| 亚洲成人午夜影院| 国产91精品露脸国语对白| 欧美亚洲动漫另类| 精品处破学生在线二十三| 亚洲欧美日韩综合aⅴ视频| 免费精品视频最新在线| 成人激情免费视频| 欧美一区二区三区喷汁尤物| 国产精品久久久久精k8| 免费高清成人在线| 97se亚洲国产综合在线| 日韩欧美一区在线观看| 亚洲摸摸操操av| 国产一区欧美日韩| 欧美日韩另类一区| 国产精品热久久久久夜色精品三区| 亚洲综合清纯丝袜自拍| 成人久久18免费网站麻豆| 91精品国产麻豆| 一区二区三区91| 成人毛片老司机大片| 欧美成人性福生活免费看| 日本三级亚洲精品| 不卡视频在线观看| 久久精品男人的天堂| 秋霞电影网一区二区| 色婷婷精品大在线视频| 国产精品热久久久久夜色精品三区 | eeuss鲁一区二区三区| 欧美第一区第二区| 亚洲国产另类精品专区| 成人美女在线视频| 91精品国产综合久久久久久漫画 | 午夜精品福利在线| 色婷婷精品久久二区二区蜜臂av| 久久久久久一二三区| 精品一区二区三区日韩| 91麻豆精品国产91久久久 | 久久久99久久精品欧美| 男女视频一区二区| 91麻豆精品国产91久久久久| 久久国产视频网| 国产精品视频观看| 97精品视频在线观看自产线路二| 精品成人一区二区三区四区| 蓝色福利精品导航| 亚洲精品在线一区二区| 成人天堂资源www在线| 国产精品国产精品国产专区不片| 一本高清dvd不卡在线观看| 一区二区三区高清在线| 一区二区国产视频| 日本va欧美va瓶| 日韩精品一二区|