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照猫画虎,照着抓包抄就可以了。