This is a guide for analysis H.245 terminalCapabilitySet and figure out does the terminal supports AAC LC or AAC LD?
- First capture the call and it's communication packages, KDV1000-HUAWEI.pcap.
- Open KDV1000-HUAWEI.pcap with wireshark.
- Filter the KDV1000-HUAWEI.pcap with H225||H245
- Locate & expand the terminalCapabilitySet
- Find the items from capabilityTable which capabilityIdentifier is 0.0.8.245.1.1.0 (ISO/IEC 14496-3 MPEG-4 audio)
- There will be two items if your terminal supports both AAC LC & AAC LD.
- Find parameterIdentifier: standard which value is 3, check parameterValue: unsignedMax.
And here are sample items: If the value is 2 then its an AAC LC capability. If the value is 23, then its an AAC LD capability.
How to build AAC LC parameters PVT tree:
[code]
childId = pvtBuildByPath(valH, tempId, "0", 0, NULL);
__pvtBuildByFieldIds(tempId1, valH, childId, {_h245(parameterIdentifier) LAST_TOKEN}, 0, NULL);
__pvtBuildByFieldIds(tempId2, valH, tempId1, {_h245(standard) LAST_TOKEN}, 4, NULL);
__pvtBuildByFieldIds(tempId1, valH, childId, {_h245(parameterValue) LAST_TOKEN}, 0, NULL);
// aac-lc(2)(bit:5) + sampling(bit:4) + chnl(bit:4) + resv(bit:3)
u8 bySampleFeq = (u8)ptAacCap->GetSampleFreq();
u8 byChnl = (u8)ptAacCap->GetChnl();
s8 abyBuf[2];
abyBuf[0] = (2<<3) | ((bySampleFeq&0xF)>>1);
abyBuf[1] = ((bySampleFeq&0x01)<<7) | (byChnl<<3);
__pvtBuildByFieldIds(tempId2, valH, tempId1, {_h245(octetString) LAST_TOKEN}, 2, abyBuf);
[/code]
How to build AAC LD parameters PVT tree:
[code]
//muxConfigPresent
childId = pvtBuildByPath(valH, tempId, "0", 0, NULL);
__pvtBuildByFieldIds(tempId1, valH, childId, {_h245(parameterIdentifier) LAST_TOKEN}, 0, NULL);
__pvtBuildByFieldIds(tempId2, valH, tempId1, {_h245(standard) LAST_TOKEN}, 6, NULL);
__pvtBuildByFieldIds(tempId1, valH, childId, {_h245(parameterValue) LAST_TOKEN}, 0, NULL);
__pvtBuildByFieldIds(tempId2, valH, tempId1, {_h245(logical) LAST_TOKEN}, 0, NULL);
//streamMuxConfig
childId = pvtBuildByPath(valH, tempId, "0", 0, NULL);
__pvtBuildByFieldIds(tempId1, valH, childId, {_h245(parameterIdentifier) LAST_TOKEN}, 0, NULL);
__pvtBuildByFieldIds(tempId2, valH, tempId1, {_h245(standard) LAST_TOKEN}, 8, NULL);
__pvtBuildByFieldIds(tempId1, valH, childId, {_h245(parameterValue) LAST_TOKEN}, 0, NULL);
u8 bySampleFeq = (u8)ptAacCap->GetSampleFreq();
u8 byChnl = (u8)ptAacCap->GetChnl();
s8 abyBuffMuxConf[7] = {0};
abyBuffMuxConf[0] = 65;
abyBuffMuxConf[1] = (23>>4);
abyBuffMuxConf[2] = ((23&0xf)<<4) | (bySampleFeq&0xf);
abyBuffMuxConf[3] = ((byChnl&0xf)<<4) | 10&0xf;
abyBuffMuxConf[4] = 0;
abyBuffMuxConf[5] = 0;
abyBuffMuxConf[6] = 0;
__pvtBuildByFieldIds(tempId2, valH, tempId1, {_h245(octetString) LAST_TOKEN}, 7, abyBuffMuxConf);
//errorProtection_SpecificConfig
childId = pvtBuildByPath(valH, tempId, "0", 0, NULL);
__pvtBuildByFieldIds(tempId1, valH, childId, {_h245(parameterIdentifier) LAST_TOKEN}, 0, NULL);
__pvtBuildByFieldIds(tempId2, valH, tempId1, {_h245(standard) LAST_TOKEN}, 9, NULL);
__pvtBuildByFieldIds(tempId1, valH, childId, {_h245(parameterValue) LAST_TOKEN}, 0, NULL);
s8 abyBufError[3] = {0};
__pvtBuildByFieldIds(tempId2, valH, tempId1, {_h245(octetString) LAST_TOKEN}, 3, abyBufError);
//add end
childId = pvtBuildByPath(valH, tempId, "0", 0, NULL);
__pvtBuildByFieldIds(tempId1, valH, childId, {_h245(parameterIdentifier) LAST_TOKEN}, 0, NULL);
__pvtBuildByFieldIds(tempId2, valH, tempId1, {_h245(standard) LAST_TOKEN}, 4, NULL);
__pvtBuildByFieldIds(tempId1, valH, childId, {_h245(parameterValue) LAST_TOKEN}, 0, NULL);
// aac-lc(2)(bit:5) + sampling(bit:4) + chnl(bit:4) + resv(bit:3)
bySampleFeq = (u8)ptAacCap->GetSampleFreq();
byChnl = (u8)ptAacCap->GetChnl();
s8 abyBuf[2];
abyBuf[0] = (23<<3) | ((bySampleFeq&0xF)>>1);
abyBuf[1] = ((bySampleFeq&0x01)<<7) | (byChnl<<3);
__pvtBuildByFieldIds(tempId2, valH, tempId1, {_h245(octetString) LAST_TOKEN}, 2, abyBuf);
[/code]
Code used to paser(demux) AAC LC parameter
[code]
// aac-lc(2)(bit:5) + sampling(bit:4) + chnl(bit:4) + resv(bit:3)
u8 bySampleFeq = ((abyConfig[0]&0x07)<<1) | ((abyConfig[1]&0x80)>>7);
u8 byChnl = ((abyConfig[1]&0x78)>>3);
[/code]
how we can listen by phone and mpeg4 audio programs?
Sorry, your question is…..
BTW: MPEG4 audio has been supported by all the lately manufactured smart phone. It wouldn’t be an issue for you if you send the audio in a proper way with a proper protocol to your phone.