summaryrefslogtreecommitdiff
path: root/pjmedia/src/pjmedia/sdp_neg.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjmedia/src/pjmedia/sdp_neg.c')
-rw-r--r--pjmedia/src/pjmedia/sdp_neg.c67
1 files changed, 63 insertions, 4 deletions
diff --git a/pjmedia/src/pjmedia/sdp_neg.c b/pjmedia/src/pjmedia/sdp_neg.c
index 6753e943..ef7815d4 100644
--- a/pjmedia/src/pjmedia/sdp_neg.c
+++ b/pjmedia/src/pjmedia/sdp_neg.c
@@ -533,6 +533,51 @@ static void update_media_direction(pj_pool_t *pool,
}
}
+/* Matching G722.1 bitrates between offer and answer.
+ */
+static pj_bool_t match_g7221( const pjmedia_sdp_media *offer,
+ unsigned o_fmt_idx,
+ const pjmedia_sdp_media *answer,
+ unsigned a_fmt_idx)
+{
+ const pjmedia_sdp_attr *a_ans;
+ const pjmedia_sdp_attr *a_off;
+ pjmedia_sdp_fmtp fmtp;
+ unsigned a_bitrate = 0, o_bitrate = 0;
+ const pj_str_t bitrate = {"bitrate=", 8};
+ const char *p;
+
+ a_ans = pjmedia_sdp_media_find_attr2(answer, "fmtp",
+ &answer->desc.fmt[a_fmt_idx]);
+ if (!a_ans)
+ return PJ_FALSE;
+
+ if (pjmedia_sdp_attr_get_fmtp(a_ans, &fmtp) != PJ_SUCCESS)
+ return PJ_FALSE;
+
+ p = pj_stristr(&fmtp.fmt_param, &bitrate);
+ if (p == NULL)
+ return PJ_FALSE;
+
+ a_bitrate = atoi(p + bitrate.slen);
+
+ a_off = pjmedia_sdp_media_find_attr2(offer, "fmtp",
+ &offer->desc.fmt[o_fmt_idx]);
+ if (!a_off)
+ return PJ_FALSE;
+
+ if (pjmedia_sdp_attr_get_fmtp(a_off, &fmtp) != PJ_SUCCESS)
+ return PJ_FALSE;
+
+ p = pj_stristr(&fmtp.fmt_param, &bitrate);
+ if (p == NULL)
+ return PJ_FALSE;
+
+ o_bitrate = atoi(p + bitrate.slen);
+
+ return (a_bitrate == o_bitrate);
+}
+
/* Update single local media description to after receiving answer
* from remote.
*/
@@ -657,8 +702,14 @@ static pj_status_t process_m_answer( pj_pool_t *pool,
(pj_stricmp(&or_.param, &ar.param)==0 ||
(ar.param.slen==1 && *ar.param.ptr=='1')))
{
- /* Match! */
- break;
+ /* Further check for G7221, negotiate bitrate. */
+ if (pj_strcmp2(&or_.enc_name, "G7221") == 0) {
+ if (match_g7221(offer, i, answer, j))
+ break;
+ } else {
+ /* Match! */
+ break;
+ }
}
}
}
@@ -871,10 +922,18 @@ static pj_status_t match_offer(pj_pool_t *pool,
(or_.param.slen==1 && *or_.param.ptr=='1')))
{
/* Match! */
- if (is_codec)
+ if (is_codec) {
+ /* Further check for G7221, negotiate bitrate. */
+ if (pj_strcmp2(&or_.enc_name, "G7221") == 0 &&
+ match_g7221(offer, i, preanswer, j) == 0)
+ {
+ continue;
+ }
found_matching_codec = 1;
- else
+ } else {
found_matching_telephone_event = 1;
+ }
+
pt_answer[pt_answer_count++] = preanswer->desc.fmt[j];
break;
}