summaryrefslogtreecommitdiff
path: root/pjmedia
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2014-09-24 10:30:57 +0000
committerNanang Izzuddin <nanang@teluu.com>2014-09-24 10:30:57 +0000
commit29df9f4ccdf3c7922248d905136a732e30785e52 (patch)
treea070a9154b4cbead75109423a67315c33d604d16 /pjmedia
parentbf615d4fd64c804ec49ecd9f3d491effe9dac7d7 (diff)
Fix #1794: Fixed assertion or garbled audio in call using G.722.1:
- Updated stream info to use pjmedia_sdp_neg_fmt_match() for matching formats in SDP, so it will call codec specific match function, e.g: for G.722.1 it will match the bitrate too. - Workaround for 'stream uses wrong codec param for opening G.722.1' issue, it is the G.722.1 codec that check the SDP fmtp for fetching bitrate setting (instead of using avg_bps/max_bps fields in codec param). git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4930 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia')
-rw-r--r--pjmedia/src/pjmedia-codec/g7221.c16
-rw-r--r--pjmedia/src/pjmedia/stream_info.c26
2 files changed, 19 insertions, 23 deletions
diff --git a/pjmedia/src/pjmedia-codec/g7221.c b/pjmedia/src/pjmedia-codec/g7221.c
index 276c0327..37b4b09b 100644
--- a/pjmedia/src/pjmedia-codec/g7221.c
+++ b/pjmedia/src/pjmedia-codec/g7221.c
@@ -648,10 +648,17 @@ static pj_status_t codec_open( pjmedia_codec *codec,
{
codec_private_t *codec_data = (codec_private_t*) codec->codec_data;
pj_pool_t *pool;
+ pjmedia_codec_fmtp *fmtp = &attr->setting.dec_fmtp;
+ pj_uint16_t fmtp_bitrate = 0;
unsigned tmp;
+ for (tmp = 0; tmp < fmtp->cnt && !fmtp_bitrate; ++tmp) {
+ if (!pj_strcmp2(&fmtp->param[tmp].name, "bitrate"))
+ fmtp_bitrate = (pj_uint16_t)pj_strtoul(&fmtp->param[tmp].val);
+ }
+
/* Validation mode first! */
- if (!validate_mode(attr->info.clock_rate, attr->info.avg_bps))
+ if (!fmtp_bitrate || !validate_mode(attr->info.clock_rate, fmtp_bitrate))
return PJMEDIA_CODEC_EINMODE;
pool = codec_data->pool;
@@ -660,8 +667,8 @@ static pj_status_t codec_open( pjmedia_codec *codec,
codec_data->vad_enabled = (attr->setting.vad != 0);
codec_data->plc_enabled = (attr->setting.plc != 0);
- codec_data->bitrate = (pj_uint16_t)attr->info.avg_bps;
- codec_data->frame_size_bits = (pj_uint16_t)(attr->info.avg_bps*20/1000);
+ codec_data->bitrate = fmtp_bitrate;
+ codec_data->frame_size_bits = fmtp_bitrate*20/1000;
codec_data->frame_size = (pj_uint16_t)(codec_data->frame_size_bits>>3);
codec_data->samples_per_frame = (pj_uint16_t)
(attr->info.clock_rate*20/1000);
@@ -687,6 +694,9 @@ static pj_status_t codec_open( pjmedia_codec *codec,
codec_data->dec_randobj.seed2 = 1;
codec_data->dec_randobj.seed3 = 1;
+ /* Update codec param */
+ attr->info.avg_bps = attr->info.max_bps = fmtp_bitrate;
+
return PJ_SUCCESS;
}
diff --git a/pjmedia/src/pjmedia/stream_info.c b/pjmedia/src/pjmedia/stream_info.c
index 5baa5462..3ed32f7e 100644
--- a/pjmedia/src/pjmedia/stream_info.c
+++ b/pjmedia/src/pjmedia/stream_info.c
@@ -18,6 +18,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <pjmedia/stream.h>
+#include <pjmedia/sdp_neg.h>
#include <pjmedia/stream_common.h>
#include <pj/ctype.h>
#include <pj/rand.h>
@@ -188,28 +189,13 @@ static pj_status_t get_audio_codec_info_param(pjmedia_stream_info *si,
*/
si->tx_pt = 0xFFFF;
for (i=0; i<rem_m->desc.fmt_count; ++i) {
- unsigned rpt;
- pjmedia_sdp_attr *r_attr;
- pjmedia_sdp_rtpmap r_rtpmap;
-
- rpt = pj_strtoul(&rem_m->desc.fmt[i]);
- if (rpt < 96)
- continue;
-
- r_attr = pjmedia_sdp_media_find_attr(rem_m, &ID_RTPMAP,
- &rem_m->desc.fmt[i]);
- if (!r_attr)
- continue;
-
- if (pjmedia_sdp_attr_get_rtpmap(r_attr, &r_rtpmap) != PJ_SUCCESS)
- continue;
-
- if (!pj_stricmp(&rtpmap->enc_name, &r_rtpmap.enc_name) &&
- rtpmap->clock_rate == r_rtpmap.clock_rate)
+ if (pjmedia_sdp_neg_fmt_match(pool,
+ (pjmedia_sdp_media*)local_m, fmti,
+ (pjmedia_sdp_media*)rem_m, i, 0) ==
+ PJ_SUCCESS)
{
/* Found matched codec. */
- si->tx_pt = rpt;
-
+ si->tx_pt = pj_strtoul(&rem_m->desc.fmt[i]);
break;
}
}