diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2009-07-15 17:55:16 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2009-07-15 17:55:16 +0000 |
commit | c7b0bd5a2320cc342474e5713adb00f92532aa23 (patch) | |
tree | 7bc8fc89542dd5b2bbe0f6e53071b62b2c03ec06 /pjmedia/src/pjmedia-codec/ilbc.c | |
parent | bbc250ce57fcd09e4b894fc0d706a8079ee5f4dc (diff) |
Ticket #919:
- Added default ilbc mode into codec passthrough setting.
- Added iLBC mode 'negotiation' in iLBC codec_open().
- Updated stream_create() to prioritize codec_open(), that may update the codec params, over stream initializations involving codec params.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2834 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia/src/pjmedia-codec/ilbc.c')
-rw-r--r-- | pjmedia/src/pjmedia-codec/ilbc.c | 49 |
1 files changed, 22 insertions, 27 deletions
diff --git a/pjmedia/src/pjmedia-codec/ilbc.c b/pjmedia/src/pjmedia-codec/ilbc.c index c60d4285..1c7fd1fe 100644 --- a/pjmedia/src/pjmedia-codec/ilbc.c +++ b/pjmedia/src/pjmedia-codec/ilbc.c @@ -376,7 +376,9 @@ static pj_status_t ilbc_codec_open(pjmedia_codec *codec, { struct ilbc_codec *ilbc_codec = (struct ilbc_codec*)codec; pj_status_t status; - unsigned i, dec_fmtp_mode = 0, enc_fmtp_mode = 0; + unsigned i; + pj_uint16_t dec_fmtp_mode = DEFAULT_MODE, + enc_fmtp_mode = DEFAULT_MODE; pj_assert(ilbc_codec != NULL); pj_assert(ilbc_codec->enc_ready == PJ_FALSE && @@ -386,7 +388,7 @@ static pj_status_t ilbc_codec_open(pjmedia_codec *codec, for (i = 0; i < attr->setting.dec_fmtp.cnt; ++i) { if (pj_stricmp(&attr->setting.dec_fmtp.param[i].name, &STR_MODE) == 0) { - dec_fmtp_mode = (unsigned) + dec_fmtp_mode = (pj_uint16_t) pj_strtoul(&attr->setting.dec_fmtp.param[i].val); break; } @@ -400,30 +402,31 @@ static pj_status_t ilbc_codec_open(pjmedia_codec *codec, for (i = 0; i < attr->setting.enc_fmtp.cnt; ++i) { if (pj_stricmp(&attr->setting.enc_fmtp.param[i].name, &STR_MODE) == 0) { - enc_fmtp_mode = (unsigned) + enc_fmtp_mode = (pj_uint16_t) pj_strtoul(&attr->setting.enc_fmtp.param[i].val); break; } } - /* The enc mode must be set in the attribute - * (from the mode parameter in fmtp attribute in the SDP - * received from remote) - */ - if (enc_fmtp_mode == 0) - enc_fmtp_mode = dec_fmtp_mode; - - PJ_ASSERT_RETURN(enc_fmtp_mode==20 || - enc_fmtp_mode==30, PJMEDIA_CODEC_EINMODE); + PJ_ASSERT_RETURN(enc_fmtp_mode==20 || enc_fmtp_mode==30, + PJMEDIA_CODEC_EINMODE); - /* Update enc_ptime in the param */ + /* Both sides of a bi-directional session MUST use the same "mode" value. + * In this point, possible values are only 20 or 30, so when encoder and + * decoder modes are not same, just use the default mode, it is 30. + */ if (enc_fmtp_mode != dec_fmtp_mode) { - attr->info.enc_ptime = (pj_uint16_t)enc_fmtp_mode; - } else { - attr->info.enc_ptime = 0; + enc_fmtp_mode = dec_fmtp_mode = DEFAULT_MODE; + PJ_LOG(4,(ilbc_codec->obj_name, + "Normalized iLBC encoder and decoder modes to %d", + DEFAULT_MODE)); } - /* Create enc */ + /* Update some attributes based on negotiated mode. */ + attr->info.avg_bps = (dec_fmtp_mode == 30? 13333 : 15200); + attr->info.frm_ptime = dec_fmtp_mode; + + /* Create encoder */ ilbc_codec->enc_frame_size = initEncode(&ilbc_codec->enc, enc_fmtp_mode); ilbc_codec->enc_samples_per_frame = CLOCK_RATE * enc_fmtp_mode / 1000; ilbc_codec->enc_ready = PJ_TRUE; @@ -432,14 +435,7 @@ static pj_status_t ilbc_codec_open(pjmedia_codec *codec, ilbc_codec->dec_samples_per_frame = initDecode(&ilbc_codec->dec, dec_fmtp_mode, attr->setting.penh); - if (dec_fmtp_mode == 20) - ilbc_codec->dec_frame_size = 38; - else if (dec_fmtp_mode == 30) - ilbc_codec->dec_frame_size = 50; - else { - pj_assert(!"Invalid iLBC mode"); - ilbc_codec->dec_frame_size = ilbc_codec->enc_frame_size; - } + ilbc_codec->dec_frame_size = (dec_fmtp_mode == 20? 38 : 50); ilbc_codec->dec_ready = PJ_TRUE; /* Save plc flags */ @@ -459,8 +455,7 @@ static pj_status_t ilbc_codec_open(pjmedia_codec *codec, pj_set_timestamp32(&ilbc_codec->last_tx, 0, 0); PJ_LOG(5,(ilbc_codec->obj_name, - "iLBC codec opened, encoder mode=%d, decoder mode=%d", - enc_fmtp_mode, dec_fmtp_mode)); + "iLBC codec opened, mode=%d", dec_fmtp_mode)); return PJ_SUCCESS; } |