TT#30403 parse and retain a=fmtp infos

Change-Id: I81b2afdfac7f65833fa5260add823fcf7680c879
pull/445/head
Richard Fuchs 7 years ago
parent d7dd7421e6
commit d31fb36f6e

@ -1441,6 +1441,7 @@ static void __rtp_payload_types(struct call_media *media, GQueue *types, GHashTa
call_str_cpy(call, &pt->encoding_with_params, &pt->encoding_with_params);
call_str_cpy(call, &pt->encoding, &pt->encoding);
call_str_cpy(call, &pt->encoding_parameters, &pt->encoding_parameters);
call_str_cpy(call, &pt->format_parameters, &pt->format_parameters);
g_hash_table_replace(media->rtp_payload_types, &pt->payload_type, pt);
g_queue_push_tail(&media->rtp_payload_types_prefs, pt);
}

@ -1133,7 +1133,7 @@ static int redis_tags(struct call *c, struct redis_list *tags) {
static int rbl_cb_plts(str *s, GQueue *q, struct redis_list *list, void *ptr) {
struct rtp_payload_type *pt;
str ptype, enc, clock, parms;
str ptype, enc, clock, enc_parms, fmt_parms;
struct call_media *med = ptr;
struct call *call = med->call;
@ -1143,7 +1143,12 @@ static int rbl_cb_plts(str *s, GQueue *q, struct redis_list *list, void *ptr) {
return -1;
if (str_token(&clock, s, '/'))
return -1;
parms = *s;
if (str_token(&enc_parms, s, '/')) {
enc_parms = *s;
fmt_parms = STR_EMPTY;
}
else
fmt_parms = *s;
// from call.c
// XXX remove all the duplicate code
@ -1151,7 +1156,8 @@ static int rbl_cb_plts(str *s, GQueue *q, struct redis_list *list, void *ptr) {
pt->payload_type = str_to_ui(&ptype, 0);
call_str_cpy(call, &pt->encoding, &enc);
pt->clock_rate = str_to_ui(&clock, 0);
call_str_cpy(call, &pt->encoding_parameters, &parms);
call_str_cpy(call, &pt->encoding_parameters, &enc_parms);
call_str_cpy(call, &pt->format_parameters, &fmt_parms);
g_hash_table_replace(med->rtp_payload_types, &pt->payload_type, pt);
return 0;
}
@ -1939,9 +1945,10 @@ char* redis_encode_json(struct call *c) {
json_builder_begin_array (builder);
for (m = k; m; m = m->next) {
pt = m->data;
JSON_ADD_STRING("%u/" STR_FORMAT "/%u/" STR_FORMAT,
JSON_ADD_STRING("%u/" STR_FORMAT "/%u/" STR_FORMAT "/" STR_FORMAT,
pt->payload_type, STR_FMT(&pt->encoding),
pt->clock_rate, STR_FMT(&pt->encoding_parameters));
pt->clock_rate, STR_FMT(&pt->encoding_parameters),
STR_FMT(&pt->format_parameters));
}
json_builder_end_array (builder);

@ -1104,7 +1104,7 @@ static int fill_endpoint(struct endpoint *ep, const struct sdp_media *media, str
static int __rtp_payload_types(struct stream_params *sp, struct sdp_media *media)
{
GHashTable *ht;
GHashTable *ht_rtpmap, *ht_fmtp;
GQueue *q;
GList *ql;
struct sdp_attribute *attr;
@ -1114,15 +1114,21 @@ static int __rtp_payload_types(struct stream_params *sp, struct sdp_media *media
return 0;
/* first go through a=rtpmap and build a hash table of attrs */
ht = g_hash_table_new(g_int_hash, g_int_equal);
ht_rtpmap = g_hash_table_new(g_int_hash, g_int_equal);
q = attr_list_get_by_id(&media->attributes, ATTR_RTPMAP);
for (ql = q ? q->head : NULL; ql; ql = ql->next) {
struct rtp_payload_type *pt;
attr = ql->data;
pt = &attr->u.rtpmap.rtp_pt;
g_hash_table_insert(ht, &pt->payload_type, pt);
g_hash_table_insert(ht_rtpmap, &pt->payload_type, pt);
}
// do the same for a=fmtp
ht_fmtp = g_hash_table_new(g_int_hash, g_int_equal);
q = attr_list_get_by_id(&media->attributes, ATTR_FMTP);
for (ql = q ? q->head : NULL; ql; ql = ql->next) {
attr = ql->data;
g_hash_table_insert(ht_fmtp, &attr->u.fmtp.payload_type, &attr->u.fmtp.format_parms_str);
}
/* a=fmtp processing would go here */
/* then go through the format list and associate */
for (ql = media->format_list.head; ql; ql = ql->next) {
@ -1139,13 +1145,18 @@ static int __rtp_payload_types(struct stream_params *sp, struct sdp_media *media
/* first look in rtpmap for a match, then check RFC types,
* else fall back to an "unknown" type */
ptl = rtp_payload_type(i, ht);
ptl = rtp_payload_type(i, ht_rtpmap);
pt = g_slice_alloc0(sizeof(*pt));
if (ptl)
*pt = *ptl;
else
pt->payload_type = i;
s = g_hash_table_lookup(ht_fmtp, &i);
if (s)
pt->format_parameters = *s;
g_queue_push_tail(&sp->rtp_payload_types, pt);
}
@ -1155,7 +1166,8 @@ error:
ret = -1;
goto out;
out:
g_hash_table_destroy(ht);
g_hash_table_destroy(ht_rtpmap);
g_hash_table_destroy(ht_fmtp);
return ret;
}

@ -21,6 +21,7 @@ struct rtp_payload_type {
str encoding;
unsigned int clock_rate;
str encoding_parameters;
str format_parameters;
};

Loading…
Cancel
Save