]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Fix iLBC when using ep_codec_string
authorBrian West <brian@freeswitch.org>
Thu, 6 Jan 2011 23:15:45 +0000 (17:15 -0600)
committerBrian West <brian@freeswitch.org>
Thu, 6 Jan 2011 23:15:45 +0000 (17:15 -0600)
src/mod/codecs/mod_ilbc/mod_ilbc.c
src/mod/endpoints/mod_sofia/sofia_glue.c

index 4d52ba994490360496ec7e3b2bb3c5b513928ab7..23ca642c22b9fe03923ba7ef14a4b9c1c6f839c3 100644 (file)
@@ -163,7 +163,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_ilbc_load)
                                                                                 "mode=30",     /* default fmtp to send (can be overridden by the init function) */
                                                                                 8000,  /* samples transferred per second */
                                                                                 8000,  /* actual samples transferred per second */
-                                                                                13300, /* bits transferred per second */
+                                                                                13330, /* bits transferred per second */
                                                                                 30000, /* number of microseconds per frame */
                                                                                 ILBC_BLOCK_LEN_30MS,   /* number of samples per frame */
                                                                                 ILBC_BLOCK_LEN_30MS * 2,       /* number of bytes per frame decompressed */
index 715b70f59dd58b146166856d2dbef0fc21c4f4a1..ffba5ff0a31a2cad115863fcf95b3d6ef9ec715c 100644 (file)
@@ -3550,13 +3550,53 @@ void sofia_glue_set_r_sdp_codec_string(switch_core_session_t *session, const cha
                                        }
 
                                        if (match) {
-                                               if (ptime > 0) {
-                                                       switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), ",%s@%uh@%di", imp->iananame, (unsigned int) map->rm_rate,
-                                                                                       ptime);
+                                               int codec_ms = ptime;
+                                               uint32_t map_bit_rate = 0;
+                                               char ptstr[20] = "";
+                                               char ratestr[20] = "";
+                                               char bitstr[20] = "";
+                                               switch_codec_fmtp_t codec_fmtp = { 0 };
+                                               
+                                               if (!codec_ms) {
+                                                       codec_ms = switch_default_ptime(map->rm_encoding, map->rm_pt);
+                                               }
+
+                                               map_bit_rate = switch_known_bitrate(map->rm_pt);
+                               
+                                               if (!ptime && !strcasecmp(map->rm_encoding, "g723")) {
+                                                       ptime = codec_ms = 30;
+                                               }
+                               
+                                               if (zstr(map->rm_fmtp)) {
+                                                       if (!strcasecmp(map->rm_encoding, "ilbc")) {
+                                                               ptime = codec_ms = 30;
+                                                               map_bit_rate = 13330;
+                                                       }
                                                } else {
-                                                       switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), ",%s@%uh", imp->iananame, (unsigned int) map->rm_rate);
+                                                       if ((switch_core_codec_parse_fmtp(map->rm_encoding, map->rm_fmtp, map->rm_rate, &codec_fmtp)) == SWITCH_STATUS_SUCCESS) {
+                                                               if (codec_fmtp.bits_per_second) {
+                                                                       map_bit_rate = codec_fmtp.bits_per_second;
+                                                               }
+                                                               if (codec_fmtp.microseconds_per_packet) {
+                                                                       codec_ms = (codec_fmtp.microseconds_per_packet / 1000);
+                                                               }
+                                                       }
                                                }
-                                               already_did[imp->ianacode] = 1;
+
+                                               if (map->rm_rate) {
+                                                       switch_snprintf(ratestr, sizeof(ratestr), "@%uh", (unsigned int) map->rm_rate);
+                                               }
+
+                                               if (codec_ms) {
+                                                       switch_snprintf(ptstr, sizeof(ptstr), "@%di", codec_ms);
+                                               }
+
+                                               if (map_bit_rate) {
+                                                       switch_snprintf(bitstr, sizeof(bitstr), "@%db", map_bit_rate);
+                                               }
+
+                                               switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), ",%s%s%s%s", map->rm_encoding, ratestr, ptstr, bitstr);
+                                               
                                                break;
                                        }
                                }
@@ -4378,6 +4418,7 @@ uint8_t sofia_glue_negotiate_sdp(switch_core_session_t *session, const char *r_s
                                if (zstr(map->rm_fmtp)) {
                                        if (!strcasecmp(map->rm_encoding, "ilbc")) {
                                                ptime = codec_ms = 30;
+                                               map_bit_rate = 13330;
                                        }
                                } else {
                                        if ((switch_core_codec_parse_fmtp(map->rm_encoding, map->rm_fmtp, map->rm_rate, &codec_fmtp)) == SWITCH_STATUS_SUCCESS) {
@@ -4389,8 +4430,6 @@ uint8_t sofia_glue_negotiate_sdp(switch_core_session_t *session, const char *r_s
                                                }
                                        }
                                }
-                               
-                               
 
                                for (i = first; i < last && i < tech_pvt->num_codecs; i++) {
                                        const switch_codec_implementation_t *imp = tech_pvt->codecs[i];
@@ -4401,7 +4440,7 @@ uint8_t sofia_glue_negotiate_sdp(switch_core_session_t *session, const char *r_s
                                        }
 
                                        switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Audio Codec Compare [%s:%d:%u:%d:%u]/[%s:%d:%u:%d:%u]\n",
-                                                                         rm_encoding, map->rm_pt, (int) map->rm_rate, ptime, map_bit_rate,
+                                                                         rm_encoding, map->rm_pt, (int) map->rm_rate, codec_ms, map_bit_rate,
                                                                          imp->iananame, imp->ianacode, codec_rate, imp->microseconds_per_packet / 1000, bit_rate);
                                        if ((zstr(map->rm_encoding) || (tech_pvt->profile->ndlb & PFLAG_NDLB_ALLOW_BAD_IANANAME)) && map->rm_pt < 96) {
                                                match = (map->rm_pt == imp->ianacode) ? 1 : 0;