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

📄 rvsdpmedia.c

📁 h.248协议源码
💻 C
字号:
/******************************************************************************
Filename    :rvsdpmedia.c
Description : Access functions for SDP Media descriptor
******************************************************************************
                Copyright (c) 1999 RADVision Inc.
************************************************************************
NOTICE:
This document contains information that is proprietary to RADVision LTD.
No part of this publication may be reproduced in any form whatsoever 
without written prior approval by RADVision LTD..

RADVision LTD. reserves the right to revise this publication and make 
changes without obligation to notify any person of such revisions or 
changes.
******************************************************************************
$Revision:1.0$
$Date:12/20/99$
$Author:Dan Elbert$
******************************************************************************/
#include <stdio.h>

#include "rvtypes.h"
#include "rvsdpmsg.h"
#include "rvalloc.h"
#include "rvdefalloc.h"
#include "rvsdpobjs.h"
#include "rvsdpmedia.h"

#define RV_SDPVERSION "0"


/******* List declarations *****************************/
rvDefineList(RvSdpMediaDescr)
rvDefineListAt(RvSdpMediaDescr)
rvDefineListAllocBack(RvSdpMediaDescr)

rvDefineList(RvString)
rvDefineListAt(RvString)
rvDefineListAllocBack(RvString)

void rvSdpMediaConstruct(RvSdpMedia	* m,RvSdpMediaType media_type,int port,RvSdpProtocol protocol,RvAlloc * a) {
	m->media_type = media_type ;
#ifdef RV_SDPSYMB_USESTRING
	rvStringConstruct(&m->media_type_str,"",a);
#endif
	rvStringConstruct(&m->control_method, "", a);
	m->port = port;
	m->num_of_ports = RV_SDPFIELD_NOTSET;
	m->protocol= protocol;
#ifdef RV_SDPSYMB_USESTRING
	rvStringConstruct(&m->protocol_str,"",a);
#endif
	rvListConstruct(RvString)(&m->fmt_list, a);

	/* vcId */
	rvListConstruct(RvString)(&m->vcid_value, a);
}

void rvSdpMediaDestruct(RvSdpMedia	* m) {
#ifdef RV_SDPSYMB_USESTRING
	rvStringDestruct(&m->media_type_str);
#endif
	rvStringDestruct(&m->control_method);
#ifdef RV_SDPSYMB_USESTRING
	rvStringDestruct(&m->protocol_str);
#endif
	rvListDestruct(RvString)(&m->fmt_list);
	rvListDestruct(RvString)(&m->vcid_value);
}

RvSdpMediaDescr* rvSdpMediaDescrConstructA(RvSdpMediaDescr* descr,RvSdpMediaType media_type,int port,RvSdpProtocol protocol,RvAlloc * a) {
	rvSdpMediaConstruct(&descr->media,media_type,port,protocol,a);
	rvSdpCommonFieldsConstruct(&descr->fields,a);
	descr->alloc=a;
	return descr;
}

void rvSdpMediaDescrDestruct(RvSdpMediaDescr * descr) {
	rvSdpMediaDestruct(&descr->media);
	rvSdpCommonFieldsDestruct(&descr->fields,descr->alloc);	
}

RvSdpMediaDescr* rvSdpMediaDescrConstructCopyA(RvSdpMediaDescr* d,const RvSdpMediaDescr* s,RvAlloc * a) {
	RvSdpConnection * s_conn;
	RvSdpKey * key;
	RvSdpBandwidth * bandwidth;
	size_t i;
	RvSdpAttribute * attr;
	RvSdpRtpMap * map,* new_map;

	d->sdp = s->sdp;
	d->alloc = a;

	rvSdpMediaDescrConstructA(d,rvSdpMediaDescrGetMediaType(s),rvSdpMediaDescrGetPort(s),rvSdpMediaDescrGetProtocol(s),a);
	if(rvSdpMediaDescrGetMediaType(s)==RV_SDPMEDIATYPE_UNKNOWN)
		rvSdpMediaDescrSetMediaTypeStr(d,rvSdpMediaDescrGetMediaTypeStr(s));
	if(rvSdpMediaDescrGetProtocol(s)==RV_SDPPROTOCOL_UNKNOWN)
		rvSdpMediaDescrSetProtocolStr(d,rvSdpMediaDescrGetProtocolStr(s));

	rvSdpMediaDescrSetNASCtrlMethod(d,rvSdpMediaDescrGetNASCtrlMethod(s));
	rvSdpMediaDescrSetNumOfPorts(d,rvSdpMediaDescrGetNumOfPorts(s));
	rvListCopy(RvString)(&d->media.fmt_list,&s->media.fmt_list);

	for (i=0;i<4;i++)
		d->media.vcid_type[i] = s->media.vcid_type[i];
	rvListCopy(RvString)(&d->media.vcid_value,&s->media.vcid_value);

	rvSdpMediaDescrSetInformation(d,rvSdpMediaDescrGetInformation(s));

	if( (s_conn = rvSdpMediaDescrGetConnection(s))!=NULL ) {
		d->fields.connection = (RvSdpConnection *)rvAllocAllocate(d->alloc,sizeof(RvSdpConnection));
		rvSdpConnectionConstructCopyA(d->fields.connection,s_conn,d->alloc);	
	}
	
	if( (key = rvSdpMediaDescrGetKey(s))!=NULL )
		rvSdpCommonFieldsSetKeyCopy(&d->fields,key,d->alloc);

	if( (bandwidth = rvSdpMediaDescrGetBandwidth(s))!=NULL )
		rvSdpMediaDescrSetBandwidth(d,rvSdpBandwidthGetType(bandwidth),rvSdpBandwidthGetValue(bandwidth));

	for(i=0;i<rvSdpMediaDescrGetNumOfAttr(s);i++) {
		attr = rvSdpMediaDescrGetAttribute(s,i);
		rvSdpMediaDescrAddAttr(d,rvSdpAttributeGetName(attr),rvSdpAttributeGetValue(attr));
	}

	for(i=0;i<rvSdpMediaDescrGetNumOfRtpMap(s);i++) {	
		map = rvSdpMediaDescrGetRtpMap(s,i);
		new_map = rvSdpMediaDescrAddRtpMap(d,rvSdpRtpMapGetPayload(map),rvSdpRtpMapGetEncodingName(map),
										rvSdpRtpMapGetClockRate(map));
		rvSdpRtpMapSetEncodingParameters(new_map,rvSdpRtpMapGetEncodingParameters(map));
	}

	rvSdpMediaDescrSetConnectionMode(d,rvSdpMediaDescrGetConnectionMode(s));

	return d;
}

RvSdpMediaDescr* rvSdpMediaDescrConstructCopy(RvSdpMediaDescr *d,const RvSdpMediaDescr *s) {
	return rvSdpMediaDescrConstructCopyA(d,s,&rvDefaultAlloc);
}

RvSdpMediaDescr * rvSdpMediaDescrCopy(RvSdpMediaDescr * d,const RvSdpMediaDescr * s) {
	rvSdpMediaDescrDestruct(d);
	return rvSdpMediaDescrConstructCopyA(d,s,d->alloc);
}


/********************************************************************/
/*  Media description access  functions								*/
/********************************************************************/

void rvSdpMediaDescrSetNASCtrlMethod(RvSdpMediaDescr* descr, const char* cm) {
	rvStringAssign(&descr->media.control_method,cm);
}

void rvSdpMediaDescrSetCtrlMethodN(RvSdpMediaDescr* descr, const char * ctrl_method, int len)  {
	rvStringAssignN(&descr->media.control_method, ctrl_method, len);
}

void rvSdpMediaDescrAddFormat(RvSdpMediaDescr* descr,const char* fmt) {
	RvString * str = rvListAllocBack(RvString)(&descr->media.fmt_list);
	rvStringConstructA(str, fmt, rvListGetAllocator(&descr->media.fmt_list));
}

size_t rvSdpMediaDescrGetNumOfFormats(const RvSdpMediaDescr* descr) {
	return (rvListSize(&descr->media.fmt_list));
}
const char *rvSdpMediaDescrGetFormat(RvSdpMediaDescr* descr, size_t index) {
	return rvStringGetData(rvListAt(RvString)(&descr->media.fmt_list,index));
}
void rvSdpMediaDescrRemoveFormat(RvSdpMediaDescr* descr, size_t index) {
	size_t j;
	RvListIter(RvString) iter = rvListBegin(&descr->media.fmt_list);
	if (index < rvListSize(&descr->media.fmt_list)) {
		for (j = 0; j < index; ++j)
			iter = rvListIterNext(iter);
		rvListErase(RvString)(&descr->media.fmt_list, iter);
	}
}

void rvSdpMediaDescrAddFormatN(RvSdpMediaDescr* descr,const char* fmt,int len) {
	RvString * str = rvListAllocBack(RvString)(&descr->media.fmt_list);
	rvStringConstructN(str, fmt,len, rvListGetAllocator(&descr->media.fmt_list));
}

void rvSdpMediaDescrClearFormat(RvSdpMediaDescr* descr) {
	rvListClear(RvString)(&descr->media.fmt_list);
}
size_t rvSdpMediaDescrGetNumOfPayloads(const RvSdpMediaDescr* descr) {
	return rvListSize(&descr->media.fmt_list);
}
int rvSdpMediaDescrGetPayloadNumber(RvSdpMediaDescr* descr, size_t index) {
	return atoi(*rvListAt(RvString)(&descr->media.fmt_list,index));
}
void rvSdpMediaDescrAddPayloadNumber(RvSdpMediaDescr* descr,int payload) {
	char payload_str[32];
	RvString * str;
	sprintf(payload_str,"%d",payload);
	str = rvListAllocBack(RvString)(&descr->media.fmt_list);
	rvStringConstructA(str, payload_str, rvListGetAllocator(&descr->media.fmt_list));
}

size_t rvSdpMediaDescrGetNumOfAttr(const RvSdpMediaDescr* descr) {
	return rvListSize(&descr->fields.attr_list);
}

RvSdpAttribute* rvSdpMediaDescrGetAttribute(const RvSdpMediaDescr* descr,size_t i) {
	return rvListAt(RvSdpAttribute)(&descr->fields.attr_list,i);
}

void rvSdpMediaDescrRemoveAttr(RvSdpMediaDescr* descr,size_t i) {
	size_t j;
	RvListIter(RvSdpAttribute) iter = rvListBegin(&(descr->fields.attr_list));
	if (i < rvListSize(&(descr->fields.attr_list))) {
		for (j = 0; j < i ;j++)
			iter = rvListIterNext(iter);
		rvListErase(RvSdpAttribute)(&(descr->fields.attr_list), iter);
	}
}

void rvSdpMediaDescrClearAttr(RvSdpMediaDescr* descr) {
	rvListClear(RvSdpAttribute)(&descr->fields.attr_list);
}

size_t rvSdpMediaDescrGetNumOfRtpMap(const RvSdpMediaDescr* descr) {
	return rvListSize(&descr->fields.rtp_map_list);
}
RvSdpRtpMap* rvSdpMediaDescrGetRtpMap(const RvSdpMediaDescr* descr,size_t index) {
	return rvListAt(RvSdpRtpMap)(&descr->fields.rtp_map_list,index);
}

void rvSdpMediaDescrRemoveRtpMap(RvSdpMediaDescr* descr, size_t index) {
	size_t j;
	RvListIter(RvSdpRtpMap) iter = rvListBegin(&descr->fields.rtp_map_list);
	if (index < rvListSize(&descr->fields.rtp_map_list)) {
		for (j = 0; j < index ;j++)
			iter = rvListIterNext(iter);
		rvListErase(RvSdpRtpMap)(&descr->fields.rtp_map_list, iter);
	}
}

void rvSdpMediaDescrClearRtpMap(RvSdpMediaDescr* x) {
	rvListClear(RvSdpRtpMap)(&(x)->fields.rtp_map_list);
}

void rvSdpMediaDescrSetMediaTypeStrN(RvSdpMediaDescr* descr,const char * type,size_t n) {
#ifdef RV_SDPSYMB_USESTRING
	rvSdpMediaDescrSetMediaType(descr,RV_SDPMEDIATYPE_UNKNOWN);
	rvStringAssignN(&descr->media.media_type_str,type,n);
#endif
}
void rvSdpMediaDescrSetMediaTypeStr(RvSdpMediaDescr* descr,const char * type) {
#ifdef RV_SDPSYMB_USESTRING
	rvSdpMediaDescrSetMediaType(descr,RV_SDPMEDIATYPE_UNKNOWN);
	rvStringAssign(&(descr)->media.media_type_str,type);
#endif
}

const char * rvSdpMediaDescrGetMediaTypeStr(const RvSdpMediaDescr* descr) {
#ifdef RV_SDPSYMB_USESTRING
	return  rvStringGetData(&(descr)->media.media_type_str);
#else
	return empty_str;
#endif
}

void rvSdpMediaDescrSetProtocolStr(RvSdpMediaDescr* descr,const char * protocol) {
#ifdef RV_SDPSYMB_USESTRING
	rvSdpMediaDescrSetProtocol(descr,RV_SDPPROTOCOL_UNKNOWN);
	rvStringAssign(&(descr)->media.protocol_str,protocol);
#endif
}

void rvSdpMediaDescrSetProtocolStrN(RvSdpMediaDescr* descr,const char * protocol,size_t n) {
#ifdef RV_SDPSYMB_USESTRING
	rvSdpMediaDescrSetProtocol(descr,RV_SDPPROTOCOL_UNKNOWN);
	rvStringAssignN(&(descr)->media.protocol_str,protocol,n);
#endif
}

const char * rvSdpMediaDescrGetProtocolStr(const RvSdpMediaDescr* descr) {
#ifdef RV_SDPSYMB_USESTRING
	return  rvStringGetData(&(descr)->media.protocol_str);
#else
	return empty_str;
#endif
}

/* ------- VcId Field --------*/
void rvSdpMediaDescrAddVcIdN(RvSdpMediaDescr* descr,int type,const char* value,int len) {
	RvString * str = rvListAllocBack(RvString)(&descr->media.vcid_value);
	rvStringConstructN(str, value,len, rvListGetAllocator(&descr->media.vcid_value));
	descr->media.vcid_type[rvSdpMediaDescrGetVcIdNum(descr) - 1] = type;
}

RvSdpVcId rvSdpMediaDescrGetVcIdType(const RvSdpMediaDescr* descr, size_t idx)
{
	return descr->media.vcid_type[idx];
}

const char *rvSdpMediaDescrGetVcIdValue(RvSdpMediaDescr* descr, size_t idx)
{
	return rvStringGetData(rvListAt(RvString)(&descr->media.vcid_value,idx));
}

size_t rvSdpMediaDescrGetVcIdNum(const RvSdpMediaDescr* descr)
{
	return rvListSize(&descr->media.vcid_value);
}

void rvSdpMediaDescrVcIdClear(RvSdpMediaDescr* descr)
{
	rvListClear(RvString)(&descr->media.vcid_value);
}

⌨️ 快捷键说明

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