diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2014-09-24 10:30:57 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2014-09-24 10:30:57 +0000 |
commit | 29df9f4ccdf3c7922248d905136a732e30785e52 (patch) | |
tree | a070a9154b4cbead75109423a67315c33d604d16 /pjmedia/src/pjmedia-codec/g7221.c | |
parent | bf615d4fd64c804ec49ecd9f3d491effe9dac7d7 (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.c | 16 |
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; } |