亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
成人高清伦理免费影院在线观看| 亚洲午夜免费视频| 国产aⅴ精品一区二区三区色成熟| 久久亚洲精品国产精品紫薇| 激情综合网av| 久久麻豆一区二区| 丁香亚洲综合激情啪啪综合| 中文字幕av资源一区| 91碰在线视频| 视频精品一区二区| 日韩免费视频一区二区| 国产乱码精品一品二品| 中文字幕亚洲电影| 欧美日韩电影一区| 久久不见久久见免费视频1| 国产午夜亚洲精品理论片色戒| 不卡的av在线播放| 亚洲一二三四在线观看| 日韩一区二区不卡| 波多野结衣91| 日韩专区一卡二卡| 国产婷婷一区二区| 日本韩国欧美国产| 精品一区二区三区视频在线观看| 久久久久一区二区三区四区| 色播五月激情综合网| 奇米888四色在线精品| 国产欧美一区二区三区鸳鸯浴| 99久久99久久综合| 毛片一区二区三区| 国产精品国产三级国产普通话蜜臀 | 欧美大尺度电影在线| 国产成人免费视频网站高清观看视频| 亚洲人成亚洲人成在线观看图片| 欧美一级理论性理论a| 99天天综合性| 精品一区二区影视| 亚洲国产精品麻豆| 国产精品日日摸夜夜摸av| 在线成人av影院| av日韩在线网站| 激情五月播播久久久精品| 亚洲在线中文字幕| 国产视频一区二区在线| 欧美日韩第一区日日骚| 欧美一级高清片在线观看| 成人黄色大片在线观看| 日本va欧美va精品发布| 中文字幕亚洲视频| 国产日韩欧美不卡| 精品国产成人在线影院| 欧美狂野另类xxxxoooo| 91亚洲国产成人精品一区二三| 久久精品99国产精品日本| 天堂av在线一区| 亚洲资源中文字幕| 亚洲免费三区一区二区| 国产精品国产三级国产三级人妇 | 国产一二三精品| 五月天精品一区二区三区| 国产精品国产精品国产专区不蜜 | 久久理论电影网| 日韩三级中文字幕| 欧美人体做爰大胆视频| 在线一区二区视频| 一本色道久久加勒比精品| 成人免费高清视频| 国产宾馆实践打屁股91| 国产老肥熟一区二区三区| 欧美96一区二区免费视频| 五月天网站亚洲| 午夜精品在线视频一区| 亚洲五码中文字幕| 亚洲不卡一区二区三区| 亚洲午夜电影网| 亚洲成人动漫一区| 日韩中文字幕一区二区三区| 亚洲成人动漫av| 日韩精品一二三四| 奇米色一区二区三区四区| 麻豆免费精品视频| 黄色小说综合网站| 国产麻豆午夜三级精品| 国产精品亚洲成人| 国产sm精品调教视频网站| 成人免费高清在线| 色成年激情久久综合| 欧美性感一区二区三区| 在线播放国产精品二区一二区四区 | 欧美午夜影院一区| 欧美人狂配大交3d怪物一区| 欧美日本乱大交xxxxx| 欧美日韩色综合| 欧美另类变人与禽xxxxx| 亚洲天堂成人在线观看| 亚洲欧美日韩电影| 婷婷六月综合网| 老汉av免费一区二区三区| 国产精品一区二区三区四区| 99精品视频在线观看| 日本乱人伦aⅴ精品| 777色狠狠一区二区三区| 精品乱码亚洲一区二区不卡| 中日韩av电影| 一区二区三区电影在线播| 日本在线观看不卡视频| 高清不卡一二三区| 欧美视频在线不卡| 久久麻豆一区二区| 亚洲综合激情网| 激情深爱一区二区| 91亚洲精华国产精华精华液| 制服.丝袜.亚洲.另类.中文| 国产女人水真多18毛片18精品视频| 亚洲另类春色国产| 精品一区二区三区免费| 91视频一区二区| 精品国产凹凸成av人导航| 亚洲免费观看高清完整版在线 | 久久精品日产第一区二区三区高清版 | 国产精品中文字幕欧美| 91丨九色丨国产丨porny| 欧美日韩国产片| 国产欧美视频一区二区| 亚洲国产精品久久久久秋霞影院 | zzijzzij亚洲日本少妇熟睡| 欧美视频在线不卡| 中文字幕免费不卡在线| 性做久久久久久免费观看| 国产高清不卡二三区| 91精品国产欧美一区二区成人| 亚洲国产精品t66y| 精品一区二区三区在线视频| 欧美日韩中文国产| 国产精品激情偷乱一区二区∴| 老司机免费视频一区二区三区| 91香蕉视频黄| 国产日韩成人精品| 理论电影国产精品| 欧美精品久久99| 亚洲乱码中文字幕| 国产成人av一区二区三区在线观看| 欧美精选午夜久久久乱码6080| 日韩美女视频一区二区| 国产在线不卡一区| 欧美久久婷婷综合色| 夜色激情一区二区| 91亚洲男人天堂| 国产精品久久久久久久久免费樱桃 | 欧美精品色一区二区三区| 国产精品久久久久久户外露出| 狠狠色丁香九九婷婷综合五月| 91超碰这里只有精品国产| 国产成人综合网| 精品少妇一区二区三区视频免付费| 亚洲一区二区三区自拍| 一本一道综合狠狠老| 国产精品二区一区二区aⅴ污介绍| 狠狠色丁香久久婷婷综合_中| 日韩无一区二区| 日韩电影在线看| 91精品国产麻豆国产自产在线 | 蜜臀av一级做a爰片久久| 欧美日韩国产综合一区二区 | 一区二区三区产品免费精品久久75| 国产91丝袜在线观看| 欧美韩日一区二区三区| 成人av集中营| 国产精品理论在线观看| jizzjizzjizz欧美| 亚洲色图视频网站| 在线精品视频一区二区| 亚洲成人免费观看| 欧美一区二区精美| 久国产精品韩国三级视频| 精品欧美黑人一区二区三区| 国产中文字幕精品| 国产午夜一区二区三区| 不卡一区二区中文字幕| 亚洲色图一区二区| 欧美日韩国产美| 美女视频黄久久| 久久女同精品一区二区| 99国产精品99久久久久久| 亚洲欧美一区二区三区国产精品 | 91小视频在线| 亚洲成av人综合在线观看| 日韩欧美国产高清| 国产v综合v亚洲欧| 一级日本不卡的影视| 欧美一区二区福利视频| 国产成人夜色高潮福利影视| 亚洲美女一区二区三区| 欧美一区二区网站| 国产成人啪午夜精品网站男同| 亚洲欧洲日韩av| 欧美精品一卡两卡| 国产成人av影院| 午夜欧美大尺度福利影院在线看| 欧美精品一区二区久久久|