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

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

?? siprtp.c

?? 基于sip協議的網絡電話源碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
#if defined(PJ_WIN32) && PJ_WIN32 != 0#include <windows.h>static void boost_priority(void){    SetPriorityClass( GetCurrentProcess(), REALTIME_PRIORITY_CLASS);    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);}#elif defined(PJ_LINUX) && PJ_LINUX != 0#include <pthread.h>static void boost_priority(void){#define POLICY	SCHED_FIFO    struct sched_param tp;    int max_prio;    int policy;    int rc;    if (sched_get_priority_min(POLICY) < sched_get_priority_max(POLICY))	max_prio = sched_get_priority_max(POLICY)-1;    else	max_prio = sched_get_priority_max(POLICY)+1;    /*     * Adjust process scheduling algorithm and priority     */    rc = sched_getparam(0, &tp);    if (rc != 0) {	app_perror( THIS_FILE, "sched_getparam error",		    PJ_RETURN_OS_ERROR(rc));	return;    }    tp.__sched_priority = max_prio;    rc = sched_setscheduler(0, POLICY, &tp);    if (rc != 0) {	app_perror( THIS_FILE, "sched_setscheduler error",		    PJ_RETURN_OS_ERROR(rc));    }    PJ_LOG(4, (THIS_FILE, "New process policy=%d, priority=%d",	      policy, tp.__sched_priority));    /*     * Adjust thread scheduling algorithm and priority     */    rc = pthread_getschedparam(pthread_self(), &policy, &tp);    if (rc != 0) {	app_perror( THIS_FILE, "pthread_getschedparam error",		    PJ_RETURN_OS_ERROR(rc));	return;    }    PJ_LOG(4, (THIS_FILE, "Old thread policy=%d, priority=%d",	      policy, tp.__sched_priority));    policy = POLICY;    tp.__sched_priority = max_prio;    rc = pthread_setschedparam(pthread_self(), policy, &tp);    if (rc != 0) {	app_perror( THIS_FILE, "pthread_setschedparam error",		    PJ_RETURN_OS_ERROR(rc));	return;    }    PJ_LOG(4, (THIS_FILE, "New thread policy=%d, priority=%d",	      policy, tp.__sched_priority));}#else#  define boost_priority()#endif/* * 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){    struct media_stream *strm;    pj_status_t status;    const pjmedia_rtp_hdr *hdr;    const void *payload;    unsigned payload_len;    strm = user_data;    /* Discard packet if media is inactive */    if (!strm->active)	return;    /* Check for errors */    if (size < 0) {	app_perror(THIS_FILE, "RTP recv() error", -size);	return;    }    /* Decode RTP packet. */    status = pjmedia_rtp_decode_rtp(&strm->in_sess, 				    pkt, size, 				    &hdr, &payload, &payload_len);    if (status != PJ_SUCCESS) {	app_perror(THIS_FILE, "RTP decode error", status);	return;    }    //PJ_LOG(4,(THIS_FILE, "Rx seq=%d", pj_ntohs(hdr->seq)));    /* Update the RTCP session. */    pjmedia_rtcp_rx_rtp(&strm->rtcp, pj_ntohs(hdr->seq),			pj_ntohl(hdr->ts), payload_len);    /* Update RTP session */    pjmedia_rtp_session_update(&strm->in_sess, hdr, NULL);}/* * 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){    struct media_stream *strm;    strm = user_data;    /* Discard packet if media is inactive */    if (!strm->active)	return;    /* Check for errors */    if (size < 0) {	app_perror(THIS_FILE, "Error receiving RTCP packet", -size);	return;    }    /* Update RTCP session */    pjmedia_rtcp_rx_rtcp(&strm->rtcp, pkt, size);}/*  * Media thread  * * This is the thread to send and receive both RTP and RTCP packets. */static int media_thread(void *arg){    enum { RTCP_INTERVAL = 5000, RTCP_RAND = 2000 };    struct media_stream *strm = arg;    char packet[1500];    unsigned msec_interval;    pj_timestamp freq, next_rtp, next_rtcp;    /* Boost thread priority if necessary */    boost_priority();    /* Let things settle */    pj_thread_sleep(100);    msec_interval = strm->samples_per_frame * 1000 / strm->clock_rate;    pj_get_timestamp_freq(&freq);    pj_get_timestamp(&next_rtp);    next_rtp.u64 += (freq.u64 * msec_interval / 1000);    next_rtcp = next_rtp;    next_rtcp.u64 += (freq.u64 * (RTCP_INTERVAL+(pj_rand()%RTCP_RAND)) / 1000);    while (!strm->thread_quit_flag) {	pj_timestamp now, lesser;	pj_time_val timeout;	pj_bool_t send_rtp, send_rtcp;	send_rtp = send_rtcp = PJ_FALSE;	/* Determine how long to sleep */	if (next_rtp.u64 < next_rtcp.u64) {	    lesser = next_rtp;	    send_rtp = PJ_TRUE;	} else {	    lesser = next_rtcp;	    send_rtcp = PJ_TRUE;	}	pj_get_timestamp(&now);	if (lesser.u64 <= now.u64) {	    timeout.sec = timeout.msec = 0;	    //printf("immediate "); fflush(stdout);	} else {	    pj_uint64_t tick_delay;	    tick_delay = lesser.u64 - now.u64;	    timeout.sec = 0;	    timeout.msec = (pj_uint32_t)(tick_delay * 1000 / freq.u64);	    pj_time_val_normalize(&timeout);	    //printf("%d:%03d ", timeout.sec, timeout.msec); fflush(stdout);	}	/* Wait for next interval */	//if (timeout.sec!=0 && timeout.msec!=0) {	    pj_thread_sleep(PJ_TIME_VAL_MSEC(timeout));	    if (strm->thread_quit_flag)		break;	//}	pj_get_timestamp(&now);	if (send_rtp || next_rtp.u64 <= now.u64) {	    /*	     * Time to send RTP packet.	     */	    pj_status_t status;	    const void *p_hdr;	    const pjmedia_rtp_hdr *hdr;	    pj_ssize_t size;	    int hdrlen;	    /* Format RTP header */	    status = pjmedia_rtp_encode_rtp( &strm->out_sess, strm->si.tx_pt,					     0, /* marker bit */					     strm->bytes_per_frame, 					     strm->samples_per_frame,					     &p_hdr, &hdrlen);	    if (status == PJ_SUCCESS) {		//PJ_LOG(4,(THIS_FILE, "\t\tTx seq=%d", pj_ntohs(hdr->seq)));				hdr = (const pjmedia_rtp_hdr*) p_hdr;		/* Copy RTP header to packet */		pj_memcpy(packet, hdr, hdrlen);		/* Zero the payload */		pj_bzero(packet+hdrlen, strm->bytes_per_frame);		/* Send RTP packet */		size = hdrlen + strm->bytes_per_frame;		status = pjmedia_transport_send_rtp(strm->transport, 						    packet, size);		if (status != PJ_SUCCESS)		    app_perror(THIS_FILE, "Error sending RTP packet", status);	    } else {		pj_assert(!"RTP encode() error");	    }	    /* Update RTCP SR */	    pjmedia_rtcp_tx_rtp( &strm->rtcp, (pj_uint16_t)strm->bytes_per_frame);	    /* Schedule next send */	    next_rtp.u64 += (msec_interval * freq.u64 / 1000);	}	if (send_rtcp || next_rtcp.u64 <= now.u64) {	    /*	     * Time to send RTCP packet.	     */	    pjmedia_rtcp_pkt *rtcp_pkt;	    int rtcp_len;	    pj_ssize_t size;	    pj_status_t status;	    /* Build RTCP packet */	    pjmedia_rtcp_build_rtcp(&strm->rtcp, &rtcp_pkt, &rtcp_len);    	    /* Send packet */	    size = rtcp_len;	    status = pjmedia_transport_send_rtcp(strm->transport,						 rtcp_pkt, size);	    if (status != PJ_SUCCESS) {		app_perror(THIS_FILE, "Error sending RTCP packet", status);	    }	    	    /* Schedule next send */    	    next_rtcp.u64 += (freq.u64 * (RTCP_INTERVAL+(pj_rand()%RTCP_RAND)) /			      1000);	}    }    return 0;}/* 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){    struct call *call;    pj_pool_t *pool;    struct media_stream *audio;    const pjmedia_sdp_session *local_sdp, *remote_sdp;    struct codec *codec_desc = NULL;    unsigned i;    call = inv->mod_data[mod_siprtp.id];    pool = inv->dlg->pool;    audio = &call->media[0];    /* If this is a mid-call media update, then destroy existing media */    if (audio->thread != NULL)	destroy_call_media(call->index);    /* Do nothing if media negotiation has failed */    if (status != PJ_SUCCESS) {	app_perror(THIS_FILE, "SDP negotiation failed", status);	return;    }        /* Capture stream definition from the SDP */    pjmedia_sdp_neg_get_active_local(inv->neg, &local_sdp);    pjmedia_sdp_neg_get_active_remote(inv->neg, &remote_sdp);    status = pjmedia_stream_info_from_sdp(&audio->si, inv->pool, app.med_endpt,					  local_sdp, remote_sdp, 0);    if (status != PJ_SUCCESS) {	app_perror(THIS_FILE, "Error creating stream info from SDP", status);	return;    }    /* Get the remainder of codec information from codec descriptor */    if (audio->si.fmt.pt == app.audio_codec.pt)	codec_desc = &app.audio_codec;    else {	/* Find the codec description in codec array */	for (i=0; i<PJ_ARRAY_SIZE(audio_codecs); ++i) {	    if (audio_codecs[i].pt == audio->si.fmt.pt) {		codec_desc = &audio_codecs[i];		break;	    }	}	if (codec_desc == NULL) {	    PJ_LOG(3, (THIS_FILE, "Error: Invalid codec payload type"));	    return;	}    }    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;    pjmedia_rtp_session_init(&audio->out_sess, audio->si.tx_pt, 			     pj_rand());    pjmedia_rtp_session_init(&audio->in_sess, audio->si.fmt.pt, 0);    pjmedia_rtcp_init(&audio->rtcp, "rtcp", audio->clock_rate, 		      audio->samples_per_frame, 0);    /* Attach media to transport */    status = pjmedia_transport_attach(audio->transport, audio, 				      &audio->si.rem_addr, 				      &audio->si.rem_rtcp, 				      sizeof(pj_sockaddr_in),				      &on_rx_rtp,				      &on_rx_rtcp);    if (status != PJ_SUCCESS) {	app_perror(THIS_FILE, "Error on pjmedia_transport_attach()", status);	return;    }    /* Start media thread. */    audio->thread_quit_flag = 0;    status = pj_thread_create( inv->pool, "media", &media_thread, audio,			       0, 0, &audio->thread);    if (status != PJ_SUCCESS) {	app_perror(THIS_FILE, "Error creating media thread", status);	return;    }    /* Set the media as active */    audio->active = PJ_TRUE;}/* Destroy call's media */static void destroy_call_media(unsigned call_index){    struct media_stream *audio = &app.call[call_index].media[0];    if (audio) {	audio->active = PJ_FALSE;	if (audio->thread) {	    audio->thread_quit_flag = 1;	    pj_thread_join(audio->thread);	    pj_thread_destroy(audio->thread);	    audio->thread = NULL;	    audio->thread_quit_flag = 0;	}	pjmedia_transport_detach(audio->transport, audio);    }} /***************************************************************************** * USER INTERFACE STUFFS */static void call_get_duration(int call_index, pj_time_val *dur){    struct call *call = &app.call[call_index];    pjsip_inv_session *inv;    dur->sec = dur->msec = 0;    if (!call)	return;    inv = call->inv;    if (!inv)	return;    if (inv->state >= PJSIP_INV_STATE_CONFIRMED && call->connect_time.sec) {	pj_gettimeofday(dur);	PJ_TIME_VAL_SUB((*dur), call->connect_time);    }}static const char *good_number(char *buf, pj_int32_t val){    if (val < 1000) {	pj_ansi_sprintf(buf, "%d", val);    } else if (val < 1000000) {	pj_ansi_sprintf(buf, "%d.%02dK", 			val / 1000,			(val % 1000) / 100);    } else {	pj_ansi_sprintf(buf, "%d.%02dM", 			val / 1000000,			(val % 1000000) / 10000);    }    return buf;}static void print_avg_stat(void){#define MIN_(var,val)	   if ((int)val < (int)var) var = val#define MAX_(var,val)	   if ((int)val > (int)var) var = val#define AVG_(var,val)	   var = ( ((var * count) + val) / (count+1) )#define BIGVAL		    0x7FFFFFFFL    struct stat_entry    {	int min, avg, max;    };    struct stat_entry call_dur, call_pdd;    pjmedia_rtcp_stat min_stat, avg_stat, max_stat;    char srx_min[16], srx_avg[16], srx_max[16];    char brx_min[16], brx_avg[16], brx_max[16];    char stx_min[16], stx_avg[16], stx_max[16];    char btx_min[16], btx_avg[16], btx_max[16];    unsigned i, count;    pj_bzero(&call_dur, sizeof(call_dur));     call_dur.min = BIGVAL;    pj_bzero(&call_pdd, sizeof(call_pdd));     call_pdd.min = BIGVAL;    pj_bzero(&min_stat, sizeof(min_stat));    min_stat.rx.pkt = min_stat.tx.pkt = BIGVAL;    min_stat.rx.bytes = min_stat.tx.bytes = BIGVAL;    min_stat.rx.loss = min_stat.tx.loss = BIGVAL;    min_stat.rx.dup = min_stat.tx.dup = BIGVAL;    min_stat.rx.reorder = min_stat.tx.reorder = BIGVAL;    min_stat.rx.jitter.min = min_stat.tx.jitter.min = BIGVAL;    min_stat.rtt.min = BIGVAL;    pj_bzero(&avg_stat, sizeof(avg_stat));    pj_bzero(&max_stat, sizeof(max_stat));    for (i=0, count=0; i<app.max_calls; ++i) {	struct call *call = &app.call[i];	struct media_stream *audio = &call->media[0];	pj_time_val dur;	unsigned msec_dur;	if (call->inv == NULL || 	    call->inv->state < PJSIP_INV_STATE_CONFIRMED ||	    call->connect_time.sec == 0) 	{	    continue;	}	/* Duration */	call_get_duration(i, &dur);	msec_dur = PJ_TIME_VAL_MSEC(dur);	MIN_(call_dur.min, msec_dur);	MAX_(call_dur.max, msec_dur);	AVG_(call_dur.avg, msec_dur);	/* Connect delay */	if (call->connect_time.sec) {	    pj_time_val t = call->connect_time;	    PJ_TIME_VAL_SUB(t, call->start_time);	    msec_dur = PJ_TIME_VAL_MSEC(t);	} else {	    msec_dur = 10;	}	MIN_(call_pdd.min, msec_dur);	MAX_(call_pdd.max, msec_dur);	AVG_(call_pdd.avg, msec_dur);	/* RX Statistisc: */	/* Packets */	MIN_(min_stat.rx.pkt, audio->rtcp.stat.rx.pkt);	MAX_(max_stat.rx.pkt, audio->rtcp.stat.rx.pkt);	AVG_(avg_stat.rx.pkt, audio->rtcp.stat.rx.pkt);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品电影在线| 一区二区三区影院| 国产一区二三区| 久久综合国产精品| 国产福利一区二区三区视频在线| 国产日韩在线不卡| 99热99精品| 午夜欧美大尺度福利影院在线看| 555夜色666亚洲国产免| 久久av中文字幕片| 欧美国产日本韩| 欧美系列日韩一区| 全国精品久久少妇| 国产欧美日韩不卡免费| 色婷婷av一区| 捆绑调教一区二区三区| 欧美激情一区不卡| 欧美亚洲国产一区二区三区va| 日本 国产 欧美色综合| 国产视频一区不卡| 欧美性大战久久| 韩国午夜理伦三级不卡影院| 最新日韩在线视频| 欧美高清一级片在线观看| av在线不卡网| 日日欢夜夜爽一区| 中文字幕高清不卡| 欧美日本一区二区在线观看| 国产一区二区在线视频| 夜夜精品浪潮av一区二区三区| 26uuu精品一区二区| 欧美影院一区二区| 国产成a人亚洲精| 天堂在线亚洲视频| 国产精品传媒视频| 精品成人佐山爱一区二区| 91蜜桃在线观看| 国产精品一品二品| 三级欧美在线一区| 中文字幕在线一区免费| 日韩欧美国产成人一区二区| 91成人免费网站| 岛国av在线一区| 久久疯狂做爰流白浆xx| 一区二区三区欧美日| 国产拍揄自揄精品视频麻豆| 3d动漫精品啪啪| 日本乱人伦aⅴ精品| 福利一区福利二区| 精品亚洲porn| 日韩国产精品大片| 亚洲一区二区视频在线| 国产精品久久久久久亚洲毛片| 欧美一区二区视频在线观看2020 | 亚洲视频一二区| 欧美精品一区二区三区高清aⅴ| 91精品福利视频| 成人免费av资源| 国产美女久久久久| 国产麻豆9l精品三级站| 日本成人在线看| 婷婷六月综合网| 亚洲成人在线网站| 一区二区三区在线播| 亚洲欧美日韩中文字幕一区二区三区| 久久久高清一区二区三区| 欧美变态tickling挠脚心| 日韩欧美国产电影| 日韩欧美一区在线| 日韩视频免费观看高清完整版在线观看 | 91小视频在线免费看| 国产jizzjizz一区二区| 粉嫩av一区二区三区| 国产成人免费视频网站| 国产成人在线影院| 懂色av一区二区夜夜嗨| 成人黄色大片在线观看| a级精品国产片在线观看| 不卡一区在线观看| 91麻豆国产自产在线观看| 91视频xxxx| 欧洲国内综合视频| 欧美日韩一二三| 91精品国产综合久久精品麻豆 | 久久久www成人免费毛片麻豆| 精品美女在线观看| 久久这里只有精品首页| 国产欧美日韩另类视频免费观看| 国产日韩欧美电影| 亚洲人精品午夜| 亚洲一区免费在线观看| 日韩电影免费一区| 久久99国产精品久久| 国产99久久久国产精品潘金 | 极品少妇xxxx精品少妇偷拍| 国内精品第一页| 不卡电影免费在线播放一区| 91丨porny丨首页| 欧美日韩一本到| 亚洲精品一区二区三区蜜桃下载| 国产日产亚洲精品系列| 国产精品久久看| 亚洲二区在线视频| 国产呦萝稀缺另类资源| 99精品在线免费| 欧美高清视频不卡网| 日韩欧美一级精品久久| 中文字幕精品一区二区精品绿巨人| 亚洲免费在线播放| 美日韩一级片在线观看| 不卡的av电影| 欧美妇女性影城| 中文字幕欧美日韩一区| 亚洲福利一区二区三区| 国产美女久久久久| 欧美日韩一级视频| 久久久久亚洲蜜桃| 亚洲国产日韩a在线播放性色| 久久精品久久久精品美女| 99久久er热在这里只有精品15| 欧美欧美欧美欧美| 国产精品久久久久国产精品日日| 日韩精品成人一区二区三区| 成人性生交大片| 欧美精品 国产精品| 国产精品久久久久7777按摩| 久久国产尿小便嘘嘘| 欧美四级电影在线观看| 国产精品网站一区| 日本va欧美va瓶| 色视频成人在线观看免| 国产日韩欧美精品一区| 蜜桃视频第一区免费观看| 色婷婷精品大在线视频| 国产三级一区二区三区| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | ㊣最新国产の精品bt伙计久久| 蜜臀a∨国产成人精品| 在线观看亚洲a| 中文字幕综合网| 国产精品中文有码| 日韩三级精品电影久久久 | 日韩和欧美一区二区三区| 99视频精品全部免费在线| 久久久噜噜噜久久人人看| 日韩中文字幕区一区有砖一区 | 日本一区二区不卡视频| 乱中年女人伦av一区二区| 欧美猛男超大videosgay| 一区二区三区在线视频免费| 成人高清视频在线观看| 久久这里只有精品首页| 久久精品国产在热久久| 日韩欧美你懂的| 日韩1区2区3区| 欧美日韩国产中文| 亚洲福利视频三区| 91国在线观看| 一个色在线综合| 91官网在线免费观看| 日韩码欧中文字| 色综合中文综合网| 日日夜夜免费精品| 在线播放91灌醉迷j高跟美女| 亚洲一二三四在线| 在线观看免费视频综合| 一区二区日韩电影| 欧美色图天堂网| 亚洲成av人片| 91精品国产欧美一区二区 | 国产伦精品一区二区三区免费| 精品久久一二三区| 国产精品夜夜嗨| 亚洲国产成人在线| 成人精品视频一区| 自拍偷在线精品自拍偷无码专区| 91麻豆国产香蕉久久精品| 一区二区三区日韩欧美| 欧美日韩一卡二卡| 麻豆极品一区二区三区| 国产偷v国产偷v亚洲高清| 成人美女视频在线看| 一区二区三区四区激情| 欧美一区日本一区韩国一区| 国模娜娜一区二区三区| 欧美激情一区二区三区蜜桃视频| 99精品视频一区| 亚洲国产一二三| 精品国产伦一区二区三区免费| 欧美日韩精品是欧美日韩精品| 美国一区二区三区在线播放| 国产午夜精品久久久久久免费视 | 91亚洲永久精品| 亚洲国产日韩综合久久精品| 日韩一级二级三级| 粉嫩av亚洲一区二区图片| 亚洲综合一区二区| 日韩欧美成人激情| 91在线视频18| 六月丁香综合在线视频|