summaryrefslogtreecommitdiff
path: root/pjmedia/src/pjmedia-codec/g7221.c
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/src/pjmedia-codec/g7221.c
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/src/pjmedia-codec/g7221.c')
-rw-r--r--pjmedia/src/pjmedia-codec/g7221.c16
1 files changed, 13 insertions, 3 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;
}