Ignore:
Timestamp:
Apr 24, 2006 11:13:00 PM (18 years ago)
Author:
bennylp
Message:

Better support for continuing media when peer has restarted transmission/RTP session

File:
1 edited

Legend:

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

    r229 r408  
    4848struct pjmedia_jbuf 
    4949{ 
     50    pj_str_t        name;                 // jitter buffer name 
    5051    jb_framelist    jb_framelist; 
    5152    pj_size_t       jb_frame_size;        // frame size  
     
    9495                                             framelist->flist_max_count); 
    9596 
    96     framelist->flist_frame_type = pj_pool_zalloc(pool,  
    97                                                 sizeof(framelist->flist_frame_type[0]) *  
    98                                                  framelist->flist_max_count); 
     97    framelist->flist_frame_type =  
     98        pj_pool_zalloc(pool, sizeof(framelist->flist_frame_type[0]) *  
     99                                framelist->flist_max_count); 
    99100 
    100101    framelist->flist_empty = 1; 
    101     framelist->flist_head = framelist->flist_tail = framelist->flist_origin = 0; 
    102102 
    103103    return PJ_SUCCESS; 
     
    129129    if (!framelist->flist_empty) { 
    130130        pj_memcpy(frame,  
    131                   framelist->flist_buffer + framelist->flist_head * framelist->flist_frame_size, 
     131                  framelist->flist_buffer +  
     132                    framelist->flist_head * framelist->flist_frame_size, 
    132133                  framelist->flist_frame_size); 
    133         *p_type = (pjmedia_jb_frame_type) framelist->flist_frame_type[framelist->flist_head]; 
    134  
    135         pj_memset(framelist->flist_buffer + framelist->flist_head * framelist->flist_frame_size, 
     134        *p_type = (pjmedia_jb_frame_type)  
     135                  framelist->flist_frame_type[framelist->flist_head]; 
     136 
     137        pj_memset(framelist->flist_buffer +  
     138                    framelist->flist_head * framelist->flist_frame_size, 
    136139                  0, framelist->flist_frame_size); 
    137140        framelist->flist_frame_type[framelist->flist_head] = 0; 
    138141 
    139142        framelist->flist_origin++; 
    140         framelist->flist_head = ++framelist->flist_head % framelist->flist_max_count; 
     143        framelist->flist_head = (framelist->flist_head + 1 ) %  
     144                                framelist->flist_max_count; 
    141145        if (framelist->flist_head == framelist->flist_tail)  
    142146            framelist->flist_empty = PJ_TRUE; 
     
    173177        } 
    174178 
    175         pj_memset(framelist->flist_buffer + framelist->flist_head * framelist->flist_frame_size, 
     179        pj_memset(framelist->flist_buffer +  
     180                    framelist->flist_head * framelist->flist_frame_size, 
    176181                  0, 
    177182                  step1*framelist->flist_frame_size); 
     
    191196        // update pointers 
    192197        framelist->flist_origin += count; 
    193         framelist->flist_head = (framelist->flist_head+count) % framelist->flist_max_count; 
     198        framelist->flist_head = (framelist->flist_head + count) %  
     199                                framelist->flist_max_count; 
    194200        if (framelist->flist_head == framelist->flist_tail)  
    195201            framelist->flist_empty = PJ_TRUE; 
     
    205211    unsigned where; 
    206212 
    207     // too late 
    208     if (index < framelist->flist_origin)  
    209         return PJ_FALSE; 
    210  
    211     // too soon 
    212     if ((index > (framelist->flist_origin + framelist->flist_max_count - 1)) && !framelist->flist_empty)  
    213         return PJ_FALSE; 
    214  
    215213    assert(frame_size <= framelist->flist_frame_size); 
    216214 
    217215    if (!framelist->flist_empty) { 
     216        unsigned max_index; 
    218217        unsigned cur_size; 
    219218 
    220         where = (index - framelist->flist_origin + framelist->flist_head) % framelist->flist_max_count; 
     219        // too late 
     220        if (index < framelist->flist_origin)  
     221            return PJ_FALSE; 
     222 
     223        // too soon 
     224        max_index = framelist->flist_origin + framelist->flist_max_count - 1; 
     225        if (index > max_index) 
     226            return PJ_FALSE; 
     227 
     228        where = (index - framelist->flist_origin + framelist->flist_head) %  
     229                framelist->flist_max_count; 
    221230 
    222231        // update framelist->flist_tail pointer 
     
    224233        if (index >= framelist->flist_origin + cur_size) { 
    225234            unsigned diff = (index - (framelist->flist_origin + cur_size)); 
    226             framelist->flist_tail = (framelist->flist_tail + diff + 1) % framelist->flist_max_count; 
     235            framelist->flist_tail = (framelist->flist_tail + diff + 1) %  
     236                                    framelist->flist_max_count; 
    227237        } 
    228238    } else { 
    229239        where = framelist->flist_tail; 
    230240        framelist->flist_origin = index; 
    231         framelist->flist_tail = (++framelist->flist_tail % framelist->flist_max_count); 
     241        framelist->flist_tail = (framelist->flist_tail + 1) %  
     242                                framelist->flist_max_count; 
    232243        framelist->flist_empty = PJ_FALSE; 
    233244    } 
     
    252263 
    253264PJ_DEF(pj_status_t) pjmedia_jbuf_create(pj_pool_t *pool,  
     265                                        const pj_str_t *name, 
    254266                                        int frame_size,  
    255267                                        int initial_prefetch,  
     
    266278        return status; 
    267279 
     280    pj_strdup_with_null(pool, &jb->name, name); 
    268281    jb->jb_frame_size    = frame_size; 
    269282    jb->jb_last_seq_no   = -1; 
     
    284297 
    285298 
     299PJ_DEF(pj_status_t) pjmedia_jbuf_reset(pjmedia_jbuf *jb) 
     300{ 
     301    jb->jb_last_seq_no   = -1; 
     302    jb->jb_level         = 0; 
     303    jb->jb_last_level    = 0; 
     304    jb->jb_last_jitter   = 0; 
     305    jb->jb_last_op       = JB_OP_INIT; 
     306    jb->jb_prefetch_cnt  = 0; 
     307    jb->jb_stable_hist   = 0; 
     308    jb->jb_status        = JB_STATUS_INITIALIZING; 
     309    jb->jb_max_hist_jitter = 0; 
     310 
     311    jb_framelist_remove_head(&jb->jb_framelist,  
     312                             jb_framelist_size(&jb->jb_framelist)); 
     313    return PJ_SUCCESS; 
     314} 
     315 
     316 
    286317PJ_DEF(pj_status_t) pjmedia_jbuf_destroy(pjmedia_jbuf *jb) 
    287318{ 
     
    312343 
    313344            if (jb->jb_op_count >= 100 && 
    314                 (int)jb_framelist_size(&jb->jb_framelist) > jb->jb_prefetch+2)  
     345                (int)jb_framelist_size(&jb->jb_framelist) > jb->jb_prefetch+2) 
    315346            { 
    316347                jb_framelist_remove_head(&jb->jb_framelist,1); 
    317348 
    318                 PJ_LOG(5,(THIS_FILE, "jbuf prefetch: %d, size=%d",  
    319                                  jb->jb_prefetch, 
    320                                  jb_framelist_size(&jb->jb_framelist))); 
     349                PJ_LOG(5,(jb->name.ptr,  
     350                          "jbuf optimizing, prefetch: %d, size=%d",  
     351                          jb->jb_prefetch, 
     352                          jb_framelist_size(&jb->jb_framelist))); 
    321353                jb->jb_op_count = 0; 
    322354            } 
     
    324356        } 
    325357    } else { 
    326         jb->jb_prefetch = PJ_MIN(jb->jb_last_jitter,(int)(jb->jb_max_count*4/5)); 
     358        jb->jb_prefetch = PJ_MIN(jb->jb_last_jitter, 
     359                                 (int)(jb->jb_max_count*4/5)); 
    327360        jb->jb_stable_hist = 0; 
    328361        jb->jb_max_hist_jitter = 0; 
    329362 
    330363        if (jb->jb_op_count >= 100) { 
    331             if ((int)jb_framelist_size(&jb->jb_framelist) > jb->jb_prefetch+2) { 
     364            if ((int)jb_framelist_size(&jb->jb_framelist) > jb->jb_prefetch+2)  
     365            { 
    332366                jb_framelist_remove_head(&jb->jb_framelist,1); 
    333367 
    334                 PJ_LOG(5,(THIS_FILE, "jbuf prefetch: %d, size=%d",  
    335                                  jb->jb_prefetch, 
    336                                  jb_framelist_size(&jb->jb_framelist))); 
     368                PJ_LOG(5,(jb->name.ptr,  
     369                          "jbuf optimizing prefetch: %d, size=%d", 
     370                          jb->jb_prefetch, 
     371                          jb_framelist_size(&jb->jb_framelist))); 
    337372            } 
    338373 
     
    378413    if (seq_diff > 0) { 
    379414 
    380         while (!jb_framelist_put_at(&jb->jb_framelist,frame_seq,frame,min_frame_size)) { 
    381             jb_framelist_remove_head(&jb->jb_framelist,PJ_MAX(jb->jb_max_count/4,1)); 
     415        while (jb_framelist_put_at(&jb->jb_framelist, 
     416                                   frame_seq,frame,min_frame_size) ==PJ_FALSE) 
     417        { 
     418            jb_framelist_remove_head(&jb->jb_framelist, 
     419                                     PJ_MAX(jb->jb_max_count/4,1) ); 
    382420        } 
    383421 
     
    408446    } 
    409447 
    410     if ((jb->jb_prefetch_cnt < jb->jb_prefetch) || !jb_framelist_get(&jb->jb_framelist,frame,&ftype)) { 
     448    if ((jb->jb_prefetch_cnt < jb->jb_prefetch) ||  
     449        jb_framelist_get(&jb->jb_framelist,frame,&ftype) == PJ_FALSE)  
     450    { 
    411451        pj_memset(frame, 0, jb->jb_frame_size); 
    412452        *p_frame_type = PJMEDIA_JB_ZERO_FRAME; 
Note: See TracChangeset for help on using the changeset viewer.