ooh323增加能力集的方法

ooh323是Asterisk的支持H323呼叫的组件,默认支持的音频协议是g711,如果想添加自定义的音频协议,那么捷径就是抓包+补代码。以aac ld为例,补代码的方法如下:

在ooCapability.c中,增加方法ooCapabilityCreateAACldAudioCapability,函数体:

struct H245AudioCapability* ooCapabilityCreateAACldAudioCapability(ooH323EpCapability *epCap, OOCTXT* pctxt, int dir)
{
	H245AudioCapability *pAudio = NULL;
	H245GenericCapability *pGenericCap = NULL;

	DList* collapsing = NULL;
	DList* noncollapsing = NULL;
	H245GenericParameter *profile;
	H245GenericParameter *firstone;
	H245GenericParameter *firsttwo;
	H245GenericParameter *second;
	H245GenericParameter *third; 
	H245GenericParameter *four; 

	pAudio = (H245AudioCapability*)memAllocZ(pctxt,sizeof(H245AudioCapability));
	pGenericCap = (H245GenericCapability*)memAllocZ(pctxt,sizeof(H245GenericCapability));
	if (!pAudio || !pGenericCap)
	{
		OOTRACEERR1("ERROR:Memory - ooCapabilityCreateAACldAudioCapability - "
			"pAudio/pGenericCap\n");
		return NULL;
	}
	{
		/** H.241 parameters */
		pAudio->t = T_H245AudioCapability_genericAudioCapability;
		pAudio->u.genericAudioCapability = pGenericCap;
		pGenericCap->maxBitRate = 960;
		pGenericCap->capabilityIdentifier.t = 1;
		pGenericCap->capabilityIdentifier.u.standard = memAllocTypeZ(pctxt, ASN1OBJID);
		// iso/iec 14496-3 mpeg-4 audio 0.0.8.245.1.1.0
		pGenericCap->capabilityIdentifier.u.standard->numids = 7;
		pGenericCap->capabilityIdentifier.u.standard->subid[0] = 0;
		pGenericCap->capabilityIdentifier.u.standard->subid[1] = 0;
		pGenericCap->capabilityIdentifier.u.standard->subid[2] = 8;
		pGenericCap->capabilityIdentifier.u.standard->subid[3] = 245;
		pGenericCap->capabilityIdentifier.u.standard->subid[4] = 1;
		pGenericCap->capabilityIdentifier.u.standard->subid[5] = 1;
		pGenericCap->capabilityIdentifier.u.standard->subid[6] = 0;
		pGenericCap->m.maxBitRatePresent = 1;
		pGenericCap->m.collapsingPresent = 1;
		pGenericCap->m.nonCollapsingPresent = 1;
		//pGenericCap->m.nonCollapsingRawPresent = 1;
		collapsing = &pGenericCap->collapsing;
		noncollapsing = &pGenericCap->nonCollapsing;
		dListInit(collapsing);
		dListInit(noncollapsing);

/*aac lc mono
		firstone = (H245GenericParameter*)memAllocZ(pctxt,sizeof(H245GenericParameter));
		firstone->parameterIdentifier.t = 1;
		firstone->parameterIdentifier.u.standard = 2;
		firstone->parameterValue.t = 3;
		firstone->parameterValue.u.unsignedMin = 1;//firstone

		second = (H245GenericParameter*)memAllocZ(pctxt, sizeof(H245GenericParameter));
		second->parameterIdentifier.t = 1;
		second->parameterIdentifier.u.standard = 0;
		second->parameterValue.t = 4;
		second->parameterValue.u.unsignedMax = 15;

		third = (H245GenericParameter*)memAllocZ(pctxt, sizeof(H245GenericParameter));
		third->parameterIdentifier.t = 1;
		third->parameterIdentifier.u.standard = 1;
		third->parameterValue.t = 1;
		third->parameterValue.u.booleanArray = 0;//32,15


		four = (H245GenericParameter*)memAllocZ(pctxt, sizeof(H245GenericParameter));
		four->parameterIdentifier.t = 1;
		four->parameterIdentifier.u.standard = 3;
		four->parameterValue.t = 4;
		four->parameterValue.u.unsignedMax = 2;//32,15
*/
		/*aac ld mono*/
		firstone = (H245GenericParameter*)memAllocZ(pctxt,sizeof(H245GenericParameter));
		firstone->parameterIdentifier.t = 1;
		firstone->parameterIdentifier.u.standard = 2;
		firstone->parameterValue.t = 3;
		firstone->parameterValue.u.unsignedMin =2;

		firsttwo = (H245GenericParameter*)memAllocZ(pctxt,sizeof(H245GenericParameter));
		firsttwo->parameterIdentifier.t = 1;
		firsttwo->parameterIdentifier.u.standard = 5;
		firsttwo->parameterValue.t = 3;
		firsttwo->parameterValue.u.unsignedMin =1;

		second = (H245GenericParameter*)memAllocZ(pctxt, sizeof(H245GenericParameter));
		second->parameterIdentifier.t = 1;
		second->parameterIdentifier.u.standard = 0;
		second->parameterValue.t = 4;
		second->parameterValue.u.unsignedMax = 25;

		third = (H245GenericParameter*)memAllocZ(pctxt, sizeof(H245GenericParameter));
		third->parameterIdentifier.t = 1;
		third->parameterIdentifier.u.standard = 1;
		third->parameterValue.t = 1;
		third->parameterValue.u.booleanArray = 0;


		four = (H245GenericParameter*)memAllocZ(pctxt, sizeof(H245GenericParameter));
		four->parameterIdentifier.t = 1;
		four->parameterIdentifier.u.standard = 3;
		four->parameterValue.t = 4;
		four->parameterValue.u.unsignedMax = 23;

		dListAppend(pctxt, collapsing, firstone);
		dListAppend(pctxt, collapsing, firsttwo);
		dListAppend(pctxt, noncollapsing,  second);
		dListAppend(pctxt, noncollapsing,  third); 
		dListAppend(pctxt, noncollapsing,  four);
		return pAudio;
	}

	OOTRACEERR1("ERROR:Unknown  Capability - ooCapabilityCreateAACldAudioCapability - "
		"pAudio/pGenericCap\n");
	return NULL;
}

解释一下

(1)aac ld的协商能力是genericAudioCapability,所以直接参考的ooCapabilityCreateH264VideoCapability;

(2)capabilityIdentifier的结构是

typedef struct EXTERN H245CapabilityIdentifier {
   int t;
   union {
      /* t = 1 */
      ASN1OBJID *standard;
      /* t = 2 */
      H245NonStandardParameter *h221NonStandard;
      /* t = 3 */
      H245CapabilityIdentifier_uuid *uuid;
      /* t = 4 */
      const char* domainBased;
      /* t = 5 */
   } u;
}

其中t表示type,根据不同的type,选择不同的u即union,这里t为1,所以要对u的standard进行赋值,上面代码的赋值含义为so/iec 14496-3 mpeg-4 audio 0.0.8.245.1.1.0

后面的H245GenericParameter,也是t和u的赋值方式。

(3)抓包结果如下,以capabilityIdentifier为例,如下:

	capabilityIdentifier:standard(0)
		standard: 0.0.8.245.1.1.0 (ISO/IEC 14496-3 MPEG-4 audio)

t=1对应于standard(0),u对应于subid的数组。后面的collapsing,nonCollapsing中的t和u照猫画虎,照着抓包抄就可以了。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值