diff --git a/rtp.c b/rtp.c index 5ebaf582e94fb64d0964bea60f31ee0af88da678..9e6395bb6cfc680df3cfb35dff0e14daa0c6244a 100755 --- a/rtp.c +++ b/rtp.c @@ -663,14 +663,19 @@ void ast_rtp_get_current_formats(struct ast_rtp* rtp, } } -struct rtpPayloadType ast_rtp_lookup_pt(struct ast_rtp* rtp, int pt) { +struct rtpPayloadType ast_rtp_lookup_pt(struct ast_rtp* rtp, int pt) +{ + struct rtpPayloadType result; if (pt < 0 || pt > MAX_RTP_PT) { - struct rtpPayloadType result; result.isAstFormat = result.code = 0; return result; // bogus payload type } - /* Gotta use our static one, since that's what we sent against */ - return static_RTP_PT[pt]; + /* Start with the negotiated codecs */ + result = rtp->current_RTP_PT[pt]; + /* If it doesn't exist, check our static RTP type list, just in case */ + if (!result.code) + result = static_RTP_PT[pt]; + return result; } int ast_rtp_lookup_code(struct ast_rtp* rtp, int isAstFormat, int code) { @@ -684,6 +689,18 @@ int ast_rtp_lookup_code(struct ast_rtp* rtp, int isAstFormat, int code) { return rtp->rtp_lookup_code_cache_result; } + /* Check the dynamic list first */ + for (pt = 0; pt < MAX_RTP_PT; ++pt) { + if (rtp->current_RTP_PT[pt].code == code && + rtp->current_RTP_PT[pt].isAstFormat == isAstFormat) { + rtp->rtp_lookup_code_cache_isAstFormat = isAstFormat; + rtp->rtp_lookup_code_cache_code = code; + rtp->rtp_lookup_code_cache_result = pt; + return pt; + } + } + + /* Then the static list */ for (pt = 0; pt < MAX_RTP_PT; ++pt) { if (static_RTP_PT[pt].code == code && static_RTP_PT[pt].isAstFormat == isAstFormat) {