diff options
author | Benny Prijono <bennylp@teluu.com> | 2007-01-20 05:18:14 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2007-01-20 05:18:14 +0000 |
commit | 409fa3cf296f5a0af9fb02913ada0ada231a4a52 (patch) | |
tree | d27512fa59141d0aa133d2170272e4be8eb30ba7 /pjmedia/src/pjmedia-codec | |
parent | 9a8ba64767cb954e092b5aa7577871462ec3d595 (diff) |
Implement ticket #56: Periodically transmit RTP packet on silence, to maintain NAT binding etc.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@888 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia/src/pjmedia-codec')
-rw-r--r-- | pjmedia/src/pjmedia-codec/gsm.c | 22 | ||||
-rw-r--r-- | pjmedia/src/pjmedia-codec/ilbc.c | 35 |
2 files changed, 42 insertions, 15 deletions
diff --git a/pjmedia/src/pjmedia-codec/gsm.c b/pjmedia/src/pjmedia-codec/gsm.c index f774a5e5..8118bcba 100644 --- a/pjmedia/src/pjmedia-codec/gsm.c +++ b/pjmedia/src/pjmedia-codec/gsm.c @@ -119,6 +119,7 @@ struct gsm_data pjmedia_plc *plc; pj_bool_t vad_enabled; pjmedia_silence_det *vad; + pj_timestamp last_tx; }; @@ -365,6 +366,9 @@ static pj_status_t gsm_dealloc_codec( pjmedia_codec_factory *factory, pjmedia_plc_save(gsm_data->plc, frame); } + /* Re-init silence_period */ + pj_set_timestamp32(&gsm_data->last_tx, 0, 0); + /* Put in the free list. */ pj_mutex_lock(gsm_codec_factory.mutex); pj_list_push_front(&gsm_codec_factory.codec_list, codec); @@ -497,23 +501,31 @@ static pj_status_t gsm_codec_encode( pjmedia_codec *codec, if (output_buf_len < 33) return PJMEDIA_CODEC_EFRMTOOSHORT; - if (input->size < 320) - return PJMEDIA_CODEC_EPCMTOOSHORT; + PJ_ASSERT_RETURN(input->size==320, PJMEDIA_CODEC_EPCMFRMINLEN); /* Detect silence */ if (gsm_data->vad_enabled) { pj_bool_t is_silence; + pj_int32_t silence_duration; + + silence_duration = pj_timestamp_diff32(&gsm_data->last_tx, + &input->timestamp); is_silence = pjmedia_silence_det_detect(gsm_data->vad, input->buf, - input->size / 2, + (input->size >> 1), NULL); - if (is_silence) { + if (is_silence && + PJMEDIA_CODEC_MAX_SILENCE_PERIOD != -1 && + silence_duration < PJMEDIA_CODEC_MAX_SILENCE_PERIOD) + { output->type = PJMEDIA_FRAME_TYPE_NONE; output->buf = NULL; output->size = 0; - output->timestamp.u64 = input->timestamp.u64; + output->timestamp = input->timestamp; return PJ_SUCCESS; + } else { + gsm_data->last_tx = input->timestamp; } } diff --git a/pjmedia/src/pjmedia-codec/ilbc.c b/pjmedia/src/pjmedia-codec/ilbc.c index a21b6889..52cf9406 100644 --- a/pjmedia/src/pjmedia-codec/ilbc.c +++ b/pjmedia/src/pjmedia-codec/ilbc.c @@ -128,6 +128,7 @@ struct ilbc_codec pjmedia_silence_det *vad; pj_bool_t vad_enabled; pj_bool_t plc_enabled; + pj_timestamp last_tx; pj_bool_t enc_ready; iLBC_Enc_Inst_t enc; @@ -426,6 +427,11 @@ static pj_status_t ilbc_codec_open(pjmedia_codec *codec, if (status != PJ_SUCCESS) return status; + /* Init last_tx (not necessary because of zalloc, but better + * be safe in case someone remove zalloc later. + */ + 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", attr->setting.enc_fmtp_mode, attr->setting.dec_fmtp_mode)); @@ -512,23 +518,32 @@ static pj_status_t ilbc_codec_encode(pjmedia_codec *codec, if (output_buf_len < ilbc_codec->enc_frame_size) return PJMEDIA_CODEC_EFRMTOOSHORT; - if (input->size != ilbc_codec->enc_samples_per_frame * 2) + if (input->size != (ilbc_codec->enc_samples_per_frame << 1)) return PJMEDIA_CODEC_EPCMFRMINLEN; /* Detect silence */ if (ilbc_codec->vad_enabled) { pj_bool_t is_silence; + pj_int32_t silence_period; + + silence_period = pj_timestamp_diff32(&ilbc_codec->last_tx, + &input->timestamp); is_silence = pjmedia_silence_det_detect(ilbc_codec->vad, input->buf, - input->size / 2, + (input->size >> 1), NULL); - if (is_silence) { + if (is_silence && + PJMEDIA_CODEC_MAX_SILENCE_PERIOD != -1 && + silence_period < PJMEDIA_CODEC_MAX_SILENCE_PERIOD) + { output->type = PJMEDIA_FRAME_TYPE_NONE; output->buf = NULL; output->size = 0; - output->timestamp.u64 = input->timestamp.u64; + output->timestamp = input->timestamp; return PJ_SUCCESS; + } else { + ilbc_codec->last_tx = input->timestamp; } } @@ -544,7 +559,7 @@ static pj_status_t ilbc_codec_encode(pjmedia_codec *codec, output->type = PJMEDIA_FRAME_TYPE_AUDIO; output->size = ilbc_codec->enc.no_of_bytes; - output->timestamp.u64 = input->timestamp.u64; + output->timestamp = input->timestamp; return PJ_SUCCESS; } @@ -563,7 +578,7 @@ static pj_status_t ilbc_codec_decode(pjmedia_codec *codec, pj_assert(ilbc_codec != NULL); PJ_ASSERT_RETURN(input && output, PJ_EINVAL); - if (output_buf_len < ilbc_codec->dec_samples_per_frame*2) + if (output_buf_len < (ilbc_codec->dec_samples_per_frame << 1)) return PJMEDIA_CODEC_EPCMTOOSHORT; if (input->size != ilbc_codec->dec_frame_size) @@ -577,9 +592,9 @@ static pj_status_t ilbc_codec_decode(pjmedia_codec *codec, for (i=0; i<ilbc_codec->dec_samples_per_frame; ++i) { ((short*)output->buf)[i] = (short)ilbc_codec->dec_block[i]; } - output->size = ilbc_codec->dec_samples_per_frame * 2; + output->size = (ilbc_codec->dec_samples_per_frame << 1); output->type = PJMEDIA_FRAME_TYPE_AUDIO; - output->timestamp.u64 = input->timestamp.u64; + output->timestamp = input->timestamp; return PJ_SUCCESS; } @@ -598,7 +613,7 @@ static pj_status_t ilbc_codec_recover(pjmedia_codec *codec, pj_assert(ilbc_codec != NULL); PJ_ASSERT_RETURN(output, PJ_EINVAL); - if (output_buf_len < ilbc_codec->dec_samples_per_frame*2) + if (output_buf_len < (ilbc_codec->dec_samples_per_frame << 1)) return PJMEDIA_CODEC_EPCMTOOSHORT; /* Decode to temporary buffer */ @@ -608,7 +623,7 @@ static pj_status_t ilbc_codec_recover(pjmedia_codec *codec, for (i=0; i<ilbc_codec->dec_samples_per_frame; ++i) { ((short*)output->buf)[i] = (short)ilbc_codec->dec_block[i]; } - output->size = ilbc_codec->dec_samples_per_frame * 2; + output->size = (ilbc_codec->dec_samples_per_frame << 1); output->type = PJMEDIA_FRAME_TYPE_AUDIO; return PJ_SUCCESS; |