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

📄 payloadtype.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
字号:
/*  The oRTP library is an RTP (Realtime Transport Protocol - rfc3550) 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"#include "utils.h"char *payload_type_get_rtpmap(PayloadType *pt){	int len=(int)strlen(pt->mime_type)+15;	char *rtpmap=(char *) ortp_malloc(len);	if (pt->channels>0)		snprintf(rtpmap,len,"%s/%i/%i",pt->mime_type,pt->clock_rate,pt->channels);	else		 snprintf(rtpmap,len,"%s/%i",pt->mime_type,pt->clock_rate);	return rtpmap;}PayloadType *payload_type_new(){	PayloadType *newpayload=(PayloadType *)ortp_new0(PayloadType,1);	newpayload->flags|=PAYLOAD_TYPE_ALLOCATED;	return newpayload;}PayloadType *payload_type_clone(PayloadType *payload){	PayloadType *newpayload=(PayloadType *)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;}/** * Sets a recv parameters (fmtp) for the PayloadType. * This method is provided for applications using RTP with SDP, but * actually the ftmp information is not used for RTP processing.**/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;	}}/** * Sets a send parameters (fmtp) for the PayloadType. * This method is provided for applications using RTP with SDP, but * actually the ftmp information is not used for RTP processing.**/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_append_recv_fmtp(PayloadType *pt, const char *fmtp){	if (canWrite(pt)){		if (pt->recv_fmtp==NULL)			pt->recv_fmtp=ortp_strdup(fmtp);		else{			char *tmp=ortp_strdup_printf("%s;%s",pt->recv_fmtp,fmtp);			ortp_free(pt->recv_fmtp);			pt->recv_fmtp=tmp;		}	}}void payload_type_append_send_fmtp(PayloadType *pt, const char *fmtp){	if (canWrite(pt)){		if (pt->send_fmtp==NULL)			pt->send_fmtp=ortp_strdup(fmtp);		else{			char *tmp=ortp_strdup_printf("%s;%s",pt->send_fmtp,fmtp);			ortp_free(pt->send_fmtp);			pt->send_fmtp=tmp;		}	}}/** * Frees a PayloadType.**/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);}/** * Parses a fmtp string such as "profile=0;level=10", finds the value matching * parameter param_name, and writes it into result.  * Despite fmtp strings are not used anywhere within oRTP, this function can * be useful for people using RTP streams described from SDP. * @param fmtp the fmtp line (format parameters) * @param param_name the parameter to search for * @param result the value given for the parameter (if found) * @param result_len the size allocated to hold the result string * @return TRUE if the parameter was found, else FALSE.**/ bool_t fmtp_get_value(const char *fmtp, const char *param_name, char *result, size_t result_len){	const char *pos=strstr(fmtp,param_name);	if (pos){		const char *equal=strchr(pos,'=');		if (equal){			int copied;			const char *end=strchr(equal+1,';');			if (end==NULL) end=fmtp+strlen(fmtp); /*assuming this is the last param */			copied=MIN(result_len-1,end-(equal+1));			strncpy(result,equal+1,copied);			result[copied]='\0';			return TRUE;		}	}	return FALSE;}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 channels){	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 &&			    (pt->channels==channels || channels<=0 || pt->channels<=0)) {				/*we don't look at channels if it is undefined				ie a negative or zero value*/							return i;			}		}	}	return -1;}int rtp_profile_get_payload_number_from_rtpmap(RtpProfile *profile,const char *rtpmap){	int clock_rate, channels, ret;	char* subtype = ortp_strdup( rtpmap );	char* rate_str = NULL;	char* chan_str = NULL;			/* find the slash after the subtype */	rate_str = strchr(subtype, '/');	if (rate_str && strlen(rate_str)>1) {		*rate_str = 0;		rate_str++;				/* Look for another slash */		chan_str = strchr(rate_str, '/');		if (chan_str && strlen(chan_str)>1) {			*chan_str = 0;			chan_str++;		} else {			chan_str = NULL;		}	} else {		rate_str = NULL;	}		// Use default clock rate if none given		if (rate_str) clock_rate = atoi(rate_str);	else clock_rate = 8000;	// Use default number of channels if none given		if (chan_str) channels = atoi(chan_str);	else channels = -1;	//printf("Searching for payload %s at freq %i with %i channels\n",subtype,clock_rate,ch1annels);	ret=rtp_profile_find_payload_number(profile,subtype,clock_rate,channels);	ortp_free(subtype);	return ret;}PayloadType * rtp_profile_find_payload(RtpProfile *prof,const char *mime,int rate,int channels){	int i;	i=rtp_profile_find_payload_number(prof,mime,rate,channels);	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 = 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=(RtpProfile*)ortp_new0(RtpProfile,1);	rtp_profile_set_name(prof,name);	return prof;}/** *	Assign payload type number index to payload type desribed in pt for the RTP profile profile. * @param profile a RTP profile * @param idx the payload type number * @param pt the payload type description ***/void rtp_profile_set_payload(RtpProfile *prof, int idx, PayloadType *pt){	if (idx<0 || idx>=RTP_PROFILE_MAX_PAYLOADS) {		ortp_error("Bad index %i",idx);		return;	}	prof->payload[idx]=pt;}/** * Initialize the profile to the empty profile (all payload type are unassigned). *@param profile a RTP profile ***/void rtp_profile_clear_all(RtpProfile *obj){	int i;	for (i=0;i<RTP_PROFILE_MAX_PAYLOADS;i++){		obj->payload[i]=0;	}}/** * Set a name to the rtp profile. (This is not required) * @param profile a rtp profile object * @param nm a string ***/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);		prof->name = NULL;	}	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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -