payloadtype.c

来自「linphone源码-1.3.5.tar.gz,linphone源码-1.3.5」· C语言 代码 · 共 298 行

C
298
字号
/*  The oRTP library is an RTP (Realtime Transport Protocol - rfc1889) stack.  Copyright (C) 2001  Simon MORLAT simon.morlat@linphone.org  This library is free software; you can redistribute it and/or  modify it under the terms of the GNU Lesser General Public  License as published by the Free Software Foundation; either  version 2.1 of the License, or (at your option) any later version.  This library 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  Lesser General Public License for more details.  You should have received a copy of the GNU Lesser General Public  License along with this library; if not, write to the Free Software  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*/#include "ortp/ortp.h"#include "ortp/payloadtype.h"/** *rtp_profile_clear_all: *@profile: an RTP profile (#RtpProfile object) * *	Initialize the profile to the empty profile (all payload type are unassigned). ***//** *rtp_profile_set_name: *@profile: 	a rtp profile object (#RtpProfile) *@nm:			a string * *	Set a name to the rtp profile. (This is not required) ***//** *rtp_profile_get_name: *@profile:		a rtp profile object (#RtpProfile) * *Returns:	the name of the rtp profile. May be NULL.**//** *rtp_profile_set_payload: *@profile: an RTP profile (a #RtpProfile object) *@index:	the payload type number *@pt:		the payload type description (a #PayloadType object ) * *	Assign payload type number @index to payload type desribed in @pt for the RTP profile *	@profile. ***//** *rtp_profile_get_payload: *@profile:	an RTP profile (a #RtpProfile object) *@index:	the payload type number * *	Gets the payload description of the payload type @index in the profile @profile. * *Returns: the payload description (a #PayloadType object)**//** *rtp_profile_clear_payload: *@profile:	an RTP profile (a #RtpProfile object) *@index:	the payload type number * *	Set payload type number @index unassigned in profile @profile. ***/char *payload_type_get_rtpmap(PayloadType *pt){	int len=(int)strlen(pt->mime_type)+15;	char *rtpmap=(char *) ortp_malloc(len);	snprintf(rtpmap,len,"%s/%i/1",pt->mime_type,pt->clock_rate);	return rtpmap;}PayloadType *payload_type_new(){	PayloadType *newpayload=ortp_new0(PayloadType,1);	newpayload->flags|=PAYLOAD_TYPE_ALLOCATED;	return newpayload;}PayloadType *payload_type_clone(PayloadType *payload){	PayloadType *newpayload=ortp_new0(PayloadType,1);	memcpy(newpayload,payload,sizeof(PayloadType));	newpayload->mime_type=ortp_strdup(payload->mime_type);	if (payload->recv_fmtp!=NULL) newpayload->recv_fmtp=ortp_strdup(payload->recv_fmtp);	if (payload->send_fmtp!=NULL) newpayload->send_fmtp=ortp_strdup(payload->send_fmtp);	newpayload->flags|=PAYLOAD_TYPE_ALLOCATED;	return newpayload;}static bool_t canWrite(PayloadType *pt){	if (!(pt->flags & PAYLOAD_TYPE_ALLOCATED)) {		ortp_error("Cannot change parameters of statically defined payload types: make your"			" own copy using payload_type_clone() first.");		return FALSE;	}	return TRUE;}void payload_type_set_recv_fmtp(PayloadType *pt, const char *fmtp){	if (canWrite(pt)){		if (pt->recv_fmtp!=NULL) ortp_free(pt->recv_fmtp);		if (fmtp!=NULL) pt->recv_fmtp=ortp_strdup(fmtp);		else pt->recv_fmtp=NULL;	}}	void payload_type_set_send_fmtp(PayloadType *pt, const char *fmtp){	if (canWrite(pt)){		if (pt->send_fmtp!=NULL) ortp_free(pt->send_fmtp);		if (fmtp!=NULL) pt->send_fmtp=ortp_strdup(fmtp);		else pt->send_fmtp=NULL;	}}void payload_type_destroy(PayloadType *pt){	if (pt->mime_type) ortp_free(pt->mime_type);	if (pt->recv_fmtp) ortp_free(pt->recv_fmtp);	if (pt->send_fmtp) ortp_free(pt->send_fmtp);	ortp_free(pt);}int rtp_profile_get_payload_number_from_mime(RtpProfile *profile,const char *mime){	PayloadType *pt;	int i;	for (i=0;i<RTP_PROFILE_MAX_PAYLOADS;i++)	{		pt=rtp_profile_get_payload(profile,i);		if (pt!=NULL)		{			if (strcasecmp(pt->mime_type,mime)==0){				return i;			}		}	}	return -1;}int rtp_profile_find_payload_number(RtpProfile*profile,const char *mime,int rate){	int i;	PayloadType *pt;	for (i=0;i<RTP_PROFILE_MAX_PAYLOADS;i++)	{		pt=rtp_profile_get_payload(profile,i);		if (pt!=NULL)		{			if (strcasecmp(pt->mime_type,mime)==0 && pt->clock_rate==rate){							return i;			}		}	}	return -1;}int rtp_profile_get_payload_number_from_rtpmap(RtpProfile *profile,const char *rtpmap){	int clock_rate,ret;	char *p,*mime,*tmp,*c;		/* parse the rtpmap */	tmp=ortp_strdup(rtpmap);	p=strchr(tmp,'/');	if (p!=NULL){		mime=tmp;		*p='\0';		c=p+1;		p=strchr(c,'/');		if (p!=NULL) *p='\0';		clock_rate=atoi(c);	}else return -1;		//printf("Searching for payload %s at freq %i",mime,clock_rate);	ret=rtp_profile_find_payload_number(profile,mime,clock_rate);	ortp_free(tmp);	return ret;}PayloadType * rtp_profile_find_payload(RtpProfile *prof,const char *mime,int rate){	int i;	i=rtp_profile_find_payload_number(prof,mime,rate);	if (i>=0) return rtp_profile_get_payload(prof,i);	return NULL;}PayloadType * rtp_profile_get_payload_from_mime(RtpProfile *profile,const char *mime){	int pt;	pt=rtp_profile_get_payload_number_from_mime(profile,mime);	if (pt==-1) return NULL;	else return rtp_profile_get_payload(profile,pt);}PayloadType * rtp_profile_get_payload_from_rtpmap(RtpProfile *profile, const char *rtpmap){	int pt;	pt=rtp_profile_get_payload_number_from_rtpmap(profile,rtpmap);	if (pt==-1) return NULL;	else return rtp_profile_get_payload(profile,pt);}int rtp_profile_move_payload(RtpProfile *prof,int oldpos,int newpos){	prof->payload[newpos]=prof->payload[oldpos];	prof->payload[oldpos]=NULL;	return 0;}RtpProfile * rtp_profile_new(const char *name){	RtpProfile *prof=ortp_new0(RtpProfile,1);	rtp_profile_set_name(prof,name);	return prof;}void rtp_profile_set_payload(RtpProfile *prof, int index, PayloadType *pt){	if (index<0 || index>=RTP_PROFILE_MAX_PAYLOADS) {		ortp_error("Bad index %i",index);		return;	}	prof->payload[index]=pt;}void rtp_profile_clear_all(RtpProfile *obj){	int i;	for (i=0;i<RTP_PROFILE_MAX_PAYLOADS;i++){		obj->payload[i]=0;	}}void rtp_profile_set_name(RtpProfile *obj, const char *name){	if (obj->name!=NULL) ortp_free(obj->name);	obj->name=ortp_strdup(name);}/* ! payload are not cloned*/RtpProfile * rtp_profile_clone(RtpProfile *prof){	int i;	PayloadType *pt;	RtpProfile *newprof=rtp_profile_new(prof->name);	for (i=0;i<RTP_PROFILE_MAX_PAYLOADS;i++){		pt=rtp_profile_get_payload(prof,i);		if (pt!=NULL){			rtp_profile_set_payload(newprof,i,pt);		}	}	return newprof;}/*clone a profile and its payloads */RtpProfile * rtp_profile_clone_full(RtpProfile *prof){	int i;	PayloadType *pt;	RtpProfile *newprof=rtp_profile_new(prof->name);	for (i=0;i<RTP_PROFILE_MAX_PAYLOADS;i++){		pt=rtp_profile_get_payload(prof,i);		if (pt!=NULL){			rtp_profile_set_payload(newprof,i,payload_type_clone(pt));		}	}	return newprof;}void rtp_profile_destroy(RtpProfile *prof){	int i;	PayloadType *payload;	if (prof->name) ortp_free(prof->name);	for (i=0;i<RTP_PROFILE_MAX_PAYLOADS;i++)	{		payload=rtp_profile_get_payload(prof,i);		if (payload!=NULL && (payload->flags & PAYLOAD_TYPE_ALLOCATED))			payload_type_destroy(payload);	}	ortp_free(prof);}

⌨️ 快捷键说明

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