⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtp_server.c

📁 RTP Proxy,用于Voip网络数据的代理传递
💻 C
字号:
/* * Copyright (c) 2004-2006 Maxim Sobolev <sobomax@FreeBSD.org> * Copyright (c) 2006-2007 Sippy Software, Inc., http://www.sippysoft.com * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: rtp_server.c,v 1.6.2.1 2008/06/16 22:20:28 sobomax Exp $ * */#include <sys/types.h>#include <sys/time.h>#include <sys/uio.h>#include <netinet/in.h>#include <fcntl.h>#include <limits.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include "rtp_server.h"#include "rtpp_util.h"#include "rtp.h"struct rtp_server *rtp_server_new(const char *name, rtp_type_t codec, int loop){    struct rtp_server *rp;    int fd;    char path[PATH_MAX + 1];    sprintf(path, "%s.%d", name, codec);    fd = open(path, O_RDONLY);    if (fd == -1)	return NULL;    rp = malloc(sizeof(*rp));    if (rp == NULL)	return NULL;    memset(rp, 0, sizeof(*rp));    seedrandom();    rp->btime = -1;    rp->fd = fd;    rp->loop = (loop > 0) ? loop - 1 : loop;    rp->rtp = (rtp_hdr_t *)rp->buf;    rp->rtp->version = 2;    rp->rtp->p = 0;    rp->rtp->x = 0;    rp->rtp->cc = 0;    rp->rtp->m = 1;    rp->rtp->pt = codec;    rp->rtp->ts = 0;    rp->rtp->seq = 0;    rp->rtp->ssrc = random();    rp->pload = rp->buf + RTP_HDR_LEN(rp->rtp);    return rp;}voidrtp_server_free(struct rtp_server *rp){    close(rp->fd);    free(rp);}intrtp_server_get(struct rtp_server *rp, double ctime){    uint32_t ts;    int rlen, rticks, bytes_per_frame, ticks_per_frame, number_of_frames;    if (rp->btime == -1)	rp->btime = ctime;    ts = ntohl(rp->rtp->ts);    if (rp->btime + ((double)ts / RTPS_SRATE) > ctime)	return RTPS_LATER;    switch (rp->rtp->pt) {    case RTP_PCMU:    case RTP_PCMA:	bytes_per_frame = 8;	ticks_per_frame = 1;	break;    case RTP_G729:	/* 10 ms per 8 kbps G.729 frame */	bytes_per_frame = 10;	ticks_per_frame = 10;	break;    case RTP_G723:	/* 30 ms per 6.3 kbps G.723 frame */	bytes_per_frame = 24;	ticks_per_frame = 30;	break;    case RTP_GSM:	/* 20 ms per 13 kbps GSM frame */	bytes_per_frame = 33;	ticks_per_frame = 20;	break;    default:	return RTPS_ERROR;    }    number_of_frames = RTPS_TICKS_MIN / ticks_per_frame;    if (RTPS_TICKS_MIN % ticks_per_frame != 0)	number_of_frames++;    rlen = bytes_per_frame * number_of_frames;    rticks = ticks_per_frame * number_of_frames;    if (read(rp->fd, rp->pload, rlen) != rlen) {	if (rp->loop == 0 || lseek(rp->fd, 0, SEEK_SET) == -1 ||	  read(rp->fd, rp->pload, rlen) != rlen)	    return RTPS_EOF;	if (rp->loop != -1)	    rp->loop -= 1;    }    if (rp->rtp->m != 0 && ntohs(rp->rtp->seq) != 0) {	rp->rtp->m = 0;    }    rp->rtp->ts = htonl(ts + (RTPS_SRATE * rticks / 1000));    rp->rtp->seq = htons(ntohs(rp->rtp->seq) + 1);    return (rp->pload - rp->buf) + rlen;}voidappend_server(struct cfg *cf, struct rtpp_session *sp){    if (sp->rtps[0] != NULL || sp->rtps[1] != NULL) {	if (sp->sridx == -1) {	    cf->rtp_servers[cf->rtp_nsessions] = sp;	    sp->sridx = cf->rtp_nsessions;	    cf->rtp_nsessions++;	}    } else {	sp->sridx = -1;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -