Does your H323 terminal support AAC LC or AAC LD? 5


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. 2-aac-lc If the value is 23, then its an AAC LD capability. 23-aac-ld


Leave a comment

Your email address will not be published. Required fields are marked *

5 thoughts on “Does your H323 terminal support AAC LC or AAC LD?

  • Jacky Wei Post author

    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]

  • Jacky Wei Post author

    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]

  • Jacky Wei Post author

    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]

    • Jacky Wei Post author

      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.