Ignore:
Timestamp:
May 19, 2006 3:58:13 PM (18 years ago)
Author:
bennylp
Message:

Install VAD in g711, gsm, and speex, and add the DTX support in stream.c. Also changed the way the silence detector works, and changed default speex quality/complexity to 10

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/src/pjmedia/silencedet.c

    r229 r457  
    3333 
    3434 
     35 
    3536/** 
    3637 * This structure holds the silence detector state. 
     
    3940{ 
    4041    int       mode;             /**< VAD mode.                              */ 
    41     unsigned  frame_size;       /**< Samples per frame.                     */ 
    42  
     42    unsigned  ptime;            /**< Frame time, in msec.                   */ 
    4343 
    4444    unsigned  min_signal_cnt;   /**< # of signal frames.before talk burst   */ 
     
    6161 
    6262PJ_DEF(pj_status_t) pjmedia_silence_det_create( pj_pool_t *pool, 
     63                                                unsigned clock_rate, 
     64                                                unsigned samples_per_frame, 
    6365                                                pjmedia_silence_det **p_sd) 
    6466{ 
     
    6971    sd = pj_pool_zalloc(pool, sizeof(struct pjmedia_silence_det)); 
    7072 
     73    sd->ptime = samples_per_frame * 1000 / clock_rate; 
     74    sd->signal_cnt = 0; 
     75    sd->silence_cnt = 0; 
    7176    sd->weakest_signal = 0xFFFFFFFFUL; 
    7277    sd->loudest_silence = 0; 
    73     sd->signal_cnt = 0; 
    74     sd->silence_cnt = 0; 
    75      
    76     /* Restart in adaptive, silent mode */ 
     78      
     79    /* Default settings */ 
     80    pjmedia_silence_det_set_params(sd, -1, -1, -1); 
     81 
     82    /* Restart in fixed, silent mode */ 
    7783    sd->in_talk = PJ_FALSE; 
    78     pjmedia_silence_det_set_adaptive( sd, 160 ); 
     84    pjmedia_silence_det_set_adaptive( sd, -1 ); 
    7985 
    8086    *p_sd = sd; 
     
    8288} 
    8389 
    84 PJ_DEF(pj_status_t) pjmedia_silence_det_set_adaptive( pjmedia_silence_det *sd, 
    85                                                       unsigned frame_size) 
    86 { 
    87     PJ_ASSERT_RETURN(sd && frame_size, PJ_EINVAL); 
    88  
    89     sd->frame_size = frame_size; 
     90PJ_DEF(pj_status_t) pjmedia_silence_det_set_adaptive(pjmedia_silence_det *sd, 
     91                                                     int threshold) 
     92{ 
     93    PJ_ASSERT_RETURN(sd, PJ_EINVAL); 
     94 
     95    if (threshold < 0) 
     96        threshold = PJMEDIA_SILENCE_DET_THRESHOLD; 
     97 
    9098    sd->mode = VAD_MODE_ADAPTIVE; 
    91     sd->min_signal_cnt = 10; 
    92     sd->min_silence_cnt = 64; 
    93     sd->recalc_cnt = 250; 
    94     sd->cur_threshold = 20; 
     99    sd->cur_threshold = threshold; 
    95100 
    96101    return PJ_SUCCESS; 
     
    98103 
    99104PJ_DEF(pj_status_t) pjmedia_silence_det_set_fixed( pjmedia_silence_det *sd, 
    100                                                    unsigned frame_size, 
    101                                                    unsigned threshold ) 
    102 { 
    103     PJ_ASSERT_RETURN(sd && frame_size, PJ_EINVAL); 
     105                                                   int threshold ) 
     106{ 
     107    PJ_ASSERT_RETURN(sd, PJ_EINVAL); 
     108 
     109    if (threshold < 0) 
     110        threshold = PJMEDIA_SILENCE_DET_THRESHOLD; 
    104111 
    105112    sd->mode = VAD_MODE_FIXED; 
    106     sd->frame_size = frame_size; 
    107113    sd->cur_threshold = threshold; 
    108114 
    109115    return PJ_SUCCESS; 
    110116} 
     117 
     118PJ_DEF(pj_status_t) pjmedia_silence_det_set_params( pjmedia_silence_det *sd, 
     119                                                    int min_silence, 
     120                                                    int min_signal, 
     121                                                    int recalc_time) 
     122{ 
     123    PJ_ASSERT_RETURN(sd, PJ_EINVAL); 
     124 
     125    if (min_silence == -1) 
     126        min_silence = 500; 
     127    if (min_signal < 0) 
     128        min_signal = sd->ptime; 
     129    if (recalc_time < 0) 
     130        recalc_time = 5000; 
     131 
     132    sd->min_signal_cnt = min_signal / sd->ptime; 
     133    sd->min_silence_cnt = min_silence / sd->ptime; 
     134    sd->recalc_cnt = recalc_time / sd->ptime; 
     135 
     136    return PJ_SUCCESS; 
     137} 
     138 
    111139 
    112140PJ_DEF(pj_status_t) pjmedia_silence_det_disable( pjmedia_silence_det *sd ) 
     
    185213    } 
    186214     
    187     /* For fixed threshold sd, everything is done. */ 
    188     if (sd->mode == VAD_MODE_FIXED) { 
    189         return !sd->in_talk; 
    190     } 
    191      
    192215 
    193216    /* Count the number of silent and signal frames and calculate min/max */ 
     
    208231    if ((sd->signal_cnt + sd->silence_cnt) > sd->recalc_cnt) { 
    209232         
    210         /* Adjust silence threshold by looking at the proportions of 
    211          * signal and silence frames. 
    212          */ 
    213         if (sd->signal_cnt >= sd->recalc_cnt) { 
    214             /* All frames where signal frames. 
    215              * Increase silence threshold. 
    216              */ 
    217             sd->cur_threshold += (sd->weakest_signal - sd->cur_threshold)/4; 
    218             PJ_LOG(6,(THIS_FILE, "Vad cur_threshold increased to %d", 
    219                       sd->cur_threshold)); 
    220         } 
    221         else if (sd->silence_cnt >= sd->recalc_cnt) { 
    222             /* All frames where silence frames. 
    223              * Decrease silence threshold. 
    224              */ 
    225             sd->cur_threshold = (sd->cur_threshold+sd->loudest_silence)/2+1; 
    226             PJ_LOG(6,(THIS_FILE, "Vad cur_threshold decreased to %d", 
    227                       sd->cur_threshold)); 
    228         } 
    229         else {  
     233        if (sd->mode == VAD_MODE_ADAPTIVE) { 
    230234            pj_bool_t updated = PJ_TRUE; 
     235            unsigned pct_signal; 
     236 
     237            /* Get percentage of signal */ 
     238            pct_signal = sd->signal_cnt * 100 /  
     239                        (sd->signal_cnt + sd->silence_cnt); 
    231240 
    232241            /* Adjust according to signal/silence proportions. */ 
    233             if (sd->signal_cnt > sd->silence_cnt * 2) 
     242            if (pct_signal > 95) { 
     243                sd->cur_threshold += (sd->weakest_signal - sd->cur_threshold)/4; 
     244            } else if (pct_signal < 5) { 
     245                sd->cur_threshold = (sd->cur_threshold+sd->loudest_silence)/2+1; 
     246            } else if (pct_signal > 90) { 
    234247                sd->cur_threshold++; 
    235             else if (sd->silence_cnt >  sd->signal_cnt* 2) 
     248            } else if (pct_signal < 10) { 
    236249                sd->cur_threshold--; 
    237             else 
     250            } else { 
    238251                updated = PJ_FALSE; 
     252            } 
    239253 
    240254            if (updated) { 
    241                 PJ_LOG(6,(THIS_FILE, 
    242                           "Vad cur_threshold updated to %d", 
     255                PJ_LOG(5,(THIS_FILE, "Vad cur_threshold updated to %d", 
    243256                          sd->cur_threshold)); 
    244257            } 
Note: See TracChangeset for help on using the changeset viewer.