in src/source/PeerConnection/SessionDescription.c [149:266]
STATUS setPayloadTypesFromOffer(PHashTable codecTable, PHashTable rtxTable, PSessionDescription pSessionDescription)
{
ENTERS();
STATUS retStatus = STATUS_SUCCESS;
PSdpMediaDescription pMediaDescription = NULL;
UINT8 currentMedia, currentAttribute;
PCHAR attributeValue, end;
UINT64 parsedPayloadType, hashmapPayloadType, fmtpVal, aptVal;
UINT16 aptFmtpVals[MAX_SDP_FMTP_VALUES];
UINT16 aptFmtVal;
BOOL supportCodec;
UINT32 tokenLen, i, aptFmtpValCount;
PCHAR fmtp;
UINT64 fmtpScore, bestFmtpScore;
for (currentMedia = 0; currentMedia < pSessionDescription->mediaCount; currentMedia++) {
pMediaDescription = &(pSessionDescription->mediaDescriptions[currentMedia]);
aptFmtpValCount = 0;
bestFmtpScore = 0;
attributeValue = pMediaDescription->mediaName;
do {
if ((end = STRCHR(attributeValue, ' ')) != NULL) {
tokenLen = (end - attributeValue);
} else {
tokenLen = STRLEN(attributeValue);
}
if (STRNCMP(DEFAULT_PAYLOAD_MULAW_STR, attributeValue, tokenLen) == 0) {
CHK_STATUS(hashTableUpsert(codecTable, RTC_CODEC_MULAW, DEFAULT_PAYLOAD_MULAW));
} else if (STRNCMP(DEFAULT_PAYLOAD_ALAW_STR, attributeValue, tokenLen) == 0) {
CHK_STATUS(hashTableUpsert(codecTable, RTC_CODEC_ALAW, DEFAULT_PAYLOAD_ALAW));
}
if (end != NULL) {
attributeValue = end + 1;
}
} while (end != NULL);
for (currentAttribute = 0; currentAttribute < pMediaDescription->mediaAttributesCount; currentAttribute++) {
attributeValue = pMediaDescription->sdpAttributes[currentAttribute].attributeValue;
CHK_STATUS(hashTableContains(codecTable, RTC_CODEC_H264_PROFILE_42E01F_LEVEL_ASYMMETRY_ALLOWED_PACKETIZATION_MODE, &supportCodec));
if (supportCodec && (end = STRSTR(attributeValue, H264_VALUE)) != NULL) {
CHK_STATUS(STRTOUI64(attributeValue, end - 1, 10, &parsedPayloadType));
fmtp = fmtpForPayloadType(parsedPayloadType, pSessionDescription);
fmtpScore = getH264FmtpScore(fmtp);
// When there's no match, the last fmtp will be chosen. This will allow us to not break existing customers who might be using
// flexible decoders which can infer the video profile from the SPS header.
if (fmtpScore >= bestFmtpScore) {
DLOGV("Found H264 payload type %" PRId64 " with score %lu: %s", parsedPayloadType, fmtpScore, fmtp);
CHK_STATUS(
hashTableUpsert(codecTable, RTC_CODEC_H264_PROFILE_42E01F_LEVEL_ASYMMETRY_ALLOWED_PACKETIZATION_MODE, parsedPayloadType));
bestFmtpScore = fmtpScore;
}
}
CHK_STATUS(hashTableContains(codecTable, RTC_CODEC_OPUS, &supportCodec));
if (supportCodec && (end = STRSTR(attributeValue, OPUS_VALUE)) != NULL) {
CHK_STATUS(STRTOUI64(attributeValue, end - 1, 10, &parsedPayloadType));
CHK_STATUS(hashTableUpsert(codecTable, RTC_CODEC_OPUS, parsedPayloadType));
}
CHK_STATUS(hashTableContains(codecTable, RTC_CODEC_VP8, &supportCodec));
if (supportCodec && (end = STRSTR(attributeValue, VP8_VALUE)) != NULL) {
CHK_STATUS(STRTOUI64(attributeValue, end - 1, 10, &parsedPayloadType));
CHK_STATUS(hashTableUpsert(codecTable, RTC_CODEC_VP8, parsedPayloadType));
}
CHK_STATUS(hashTableContains(codecTable, RTC_CODEC_MULAW, &supportCodec));
if (supportCodec && (end = STRSTR(attributeValue, MULAW_VALUE)) != NULL) {
CHK_STATUS(STRTOUI64(attributeValue, end - 1, 10, &parsedPayloadType));
CHK_STATUS(hashTableUpsert(codecTable, RTC_CODEC_MULAW, parsedPayloadType));
}
CHK_STATUS(hashTableContains(codecTable, RTC_CODEC_ALAW, &supportCodec));
if (supportCodec && (end = STRSTR(attributeValue, ALAW_VALUE)) != NULL) {
CHK_STATUS(STRTOUI64(attributeValue, end - 1, 10, &parsedPayloadType));
CHK_STATUS(hashTableUpsert(codecTable, RTC_CODEC_ALAW, parsedPayloadType));
}
if ((end = STRSTR(attributeValue, RTX_CODEC_VALUE)) != NULL) {
CHK_STATUS(STRTOUI64(end + STRLEN(RTX_CODEC_VALUE), NULL, 10, &parsedPayloadType));
if ((end = STRSTR(attributeValue, FMTP_VALUE)) != NULL) {
CHK_STATUS(STRTOUI64(end + STRLEN(FMTP_VALUE), NULL, 10, &fmtpVal));
aptFmtpVals[aptFmtpValCount++] = (UINT32) ((fmtpVal << 8u) & parsedPayloadType);
}
}
}
for (i = 0; i < aptFmtpValCount; i++) {
aptFmtVal = aptFmtpVals[i];
fmtpVal = aptFmtVal >> 8u;
aptVal = aptFmtVal & 0xFFu;
CHK_STATUS(hashTableContains(codecTable, RTC_CODEC_H264_PROFILE_42E01F_LEVEL_ASYMMETRY_ALLOWED_PACKETIZATION_MODE, &supportCodec));
if (supportCodec) {
CHK_STATUS(hashTableGet(codecTable, RTC_CODEC_H264_PROFILE_42E01F_LEVEL_ASYMMETRY_ALLOWED_PACKETIZATION_MODE, &hashmapPayloadType));
if (aptVal == hashmapPayloadType) {
CHK_STATUS(hashTableUpsert(rtxTable, RTC_RTX_CODEC_H264_PROFILE_42E01F_LEVEL_ASYMMETRY_ALLOWED_PACKETIZATION_MODE, fmtpVal));
DLOGV("found apt type %" PRId64 " for fmtp %" PRId64, aptVal, fmtpVal);
}
}
CHK_STATUS(hashTableContains(codecTable, RTC_CODEC_VP8, &supportCodec));
if (supportCodec) {
CHK_STATUS(hashTableGet(codecTable, RTC_CODEC_VP8, &hashmapPayloadType));
if (aptVal == hashmapPayloadType) {
CHK_STATUS(hashTableUpsert(rtxTable, RTC_RTX_CODEC_VP8, fmtpVal));
}
}
}
}
CleanUp:
LEAVES();
return retStatus;
}