Ignore:
Timestamp:
Jul 19, 2011 3:42:28 AM (13 years ago)
Author:
nanang
Message:

Re #1326: Initial code integration from branch 2.0-dev to trunk as "2.0-pre-alpha-svn".

Location:
pjproject/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk

  • pjproject/trunk/pjmedia/src/pjmedia/jbuf.c

    r3553 r3664  
    6969    pj_size_t       *content_len;       /**< frame length array             */ 
    7070    pj_uint32_t     *bit_info;          /**< frame bit info array           */ 
     71    pj_uint32_t     *ts;                /**< timestamp array                */ 
    7172     
    7273    /* States */ 
     
    198199                                            sizeof(framelist->bit_info[0])* 
    199200                                            framelist->max_count); 
    200  
     201    framelist->ts           = (pj_uint32_t*) 
     202                              pj_pool_alloc(pool,  
     203                                            sizeof(framelist->ts[0])* 
     204                                            framelist->max_count); 
    201205 
    202206    return jb_framelist_reset(framelist); 
     
    259263                                  void *frame, pj_size_t *size, 
    260264                                  pjmedia_jb_frame_type *p_type, 
    261                                   pj_uint32_t *bit_info)  
     265                                  pj_uint32_t *bit_info, 
     266                                  pj_uint32_t *ts, 
     267                                  int *seq)  
    262268{ 
    263269    if (framelist->size) { 
     
    295301                    *bit_info = framelist->bit_info[framelist->head]; 
    296302            } 
     303            if (ts) 
     304                *ts = framelist->ts[framelist->head]; 
     305            if (seq) 
     306                *seq = framelist->origin; 
    297307 
    298308            //pj_bzero(framelist->content +  
     
    302312            framelist->content_len[framelist->head] = 0; 
    303313            framelist->bit_info[framelist->head] = 0; 
     314            framelist->ts[framelist->head] = 0; 
    304315 
    305316            framelist->origin++; 
     
    315326 
    316327    return PJ_FALSE; 
     328} 
     329 
     330 
     331static pj_bool_t jb_framelist_peek(jb_framelist_t *framelist, 
     332                                   unsigned offset, 
     333                                   const void **frame, 
     334                                   pj_size_t *size, 
     335                                   pjmedia_jb_frame_type *type, 
     336                                   pj_uint32_t *bit_info, 
     337                                   pj_uint32_t *ts, 
     338                                   int *seq)  
     339{ 
     340    unsigned pos, idx; 
     341 
     342    if (offset >= jb_framelist_eff_size(framelist)) 
     343        return PJ_FALSE; 
     344 
     345    pos = framelist->head; 
     346    idx = offset; 
     347 
     348    /* Find actual peek position, note there may be discarded frames */ 
     349    while (1) { 
     350        if (framelist->frame_type[pos] != PJMEDIA_JB_DISCARDED_FRAME) { 
     351            if (idx == 0) 
     352                break; 
     353            else 
     354                --idx; 
     355        } 
     356        pos = (pos + 1) % framelist->max_count; 
     357    } 
     358 
     359    /* Return the frame pointer */ 
     360    if (frame) 
     361        *frame = framelist->content + pos*framelist->frame_size; 
     362    if (type) 
     363        *type = (pjmedia_jb_frame_type)  
     364                framelist->frame_type[pos]; 
     365    if (size) 
     366        *size = framelist->content_len[pos]; 
     367    if (bit_info) 
     368        *bit_info = framelist->bit_info[pos]; 
     369    if (ts) 
     370        *ts = framelist->ts[pos]; 
     371    if (seq) 
     372        *seq = framelist->origin + offset; 
     373 
     374    return PJ_TRUE; 
    317375} 
    318376 
     
    386444                                       unsigned frame_size, 
    387445                                       pj_uint32_t bit_info, 
     446                                       pj_uint32_t ts, 
    388447                                       unsigned frame_type) 
    389448{ 
     
    439498    framelist->content_len[pos] = frame_size; 
    440499    framelist->bit_info[pos] = bit_info; 
     500    framelist->ts[pos] = ts; 
    441501 
    442502    /* update framelist size */ 
     
    748808                                     int frame_seq) 
    749809{ 
    750     pjmedia_jbuf_put_frame2(jb, frame, frame_size, 0, frame_seq, NULL); 
     810    pjmedia_jbuf_put_frame3(jb, frame, frame_size, 0, frame_seq, 0, NULL); 
    751811} 
    752812 
     
    756816                                     pj_uint32_t bit_info, 
    757817                                     int frame_seq, 
     818                                     pj_bool_t *discarded) 
     819{ 
     820    pjmedia_jbuf_put_frame3(jb, frame, frame_size, bit_info, frame_seq, 0,  
     821                            discarded); 
     822} 
     823 
     824PJ_DEF(void) pjmedia_jbuf_put_frame3(pjmedia_jbuf *jb,  
     825                                     const void *frame,  
     826                                     pj_size_t frame_size,  
     827                                     pj_uint32_t bit_info, 
     828                                     int frame_seq, 
     829                                     pj_uint32_t ts, 
    758830                                     pj_bool_t *discarded) 
    759831{ 
     
    825897    min_frame_size = PJ_MIN(frame_size, jb->jb_frame_size); 
    826898    status = jb_framelist_put_at(&jb->jb_framelist, frame_seq, frame, 
    827                                  min_frame_size, bit_info, frame_type); 
     899                                 min_frame_size, bit_info, ts, frame_type); 
    828900     
    829901    /* Jitter buffer is full, remove some older frames */ 
     
    848920        removed = jb_framelist_remove_head(&jb->jb_framelist, distance); 
    849921        status = jb_framelist_put_at(&jb->jb_framelist, frame_seq, frame, 
    850                                      min_frame_size, bit_info, frame_type); 
     922                                     min_frame_size, bit_info, ts, frame_type); 
    851923 
    852924        jb->jb_discard += removed; 
     
    880952                                     char *p_frame_type) 
    881953{ 
    882     pjmedia_jbuf_get_frame2(jb, frame, NULL, p_frame_type, NULL); 
     954    pjmedia_jbuf_get_frame3(jb, frame, NULL, p_frame_type, NULL, 
     955                            NULL, NULL); 
    883956} 
    884957 
     
    892965                                     pj_uint32_t *bit_info) 
    893966{ 
     967    pjmedia_jbuf_get_frame3(jb, frame, size, p_frame_type, bit_info, 
     968                            NULL, NULL); 
     969} 
     970 
     971/* 
     972 * Get frame from jitter buffer. 
     973 */ 
     974PJ_DEF(void) pjmedia_jbuf_get_frame3(pjmedia_jbuf *jb,  
     975                                     void *frame,  
     976                                     pj_size_t *size, 
     977                                     char *p_frame_type, 
     978                                     pj_uint32_t *bit_info, 
     979                                     pj_uint32_t *ts, 
     980                                     int *seq) 
     981{ 
    894982    if (jb->jb_status == JB_STATUS_PREFETCHING) { 
    895983 
     
    9151003        /* Try to retrieve a frame from frame list */ 
    9161004        res = jb_framelist_get(&jb->jb_framelist, frame, size, &ftype,  
    917                                bit_info); 
     1005                               bit_info, ts, seq); 
    9181006        if (res) { 
    9191007            /* We've successfully retrieved a frame from the frame list, but 
     
    9831071} 
    9841072 
     1073 
     1074PJ_DEF(void) pjmedia_jbuf_peek_frame( pjmedia_jbuf *jb, 
     1075                                      unsigned offset, 
     1076                                      const void **frame,  
     1077                                      pj_size_t *size,  
     1078                                      char *p_frm_type, 
     1079                                      pj_uint32_t *bit_info, 
     1080                                      pj_uint32_t *ts, 
     1081                                      int *seq) 
     1082{ 
     1083    pjmedia_jb_frame_type ftype; 
     1084    pj_bool_t res; 
     1085 
     1086    res = jb_framelist_peek(&jb->jb_framelist, offset, frame, size, &ftype, 
     1087                            bit_info, ts, seq); 
     1088    if (!res) 
     1089        *p_frm_type = PJMEDIA_JB_ZERO_EMPTY_FRAME; 
     1090    else if (ftype == PJMEDIA_JB_NORMAL_FRAME) 
     1091        *p_frm_type = PJMEDIA_JB_NORMAL_FRAME; 
     1092    else 
     1093        *p_frm_type = PJMEDIA_JB_MISSING_FRAME; 
     1094} 
     1095 
     1096 
     1097PJ_DEF(unsigned) pjmedia_jbuf_remove_frame(pjmedia_jbuf *jb,  
     1098                                           unsigned frame_cnt) 
     1099{ 
     1100    unsigned count, last_discard_num; 
     1101 
     1102    last_discard_num = jb->jb_framelist.discarded_num; 
     1103    count = jb_framelist_remove_head(&jb->jb_framelist, frame_cnt); 
     1104 
     1105    /* Remove some more when there were discarded frames included */ 
     1106    while (jb->jb_framelist.discarded_num < last_discard_num) { 
     1107        /* Calculate frames count to be removed next */ 
     1108        frame_cnt = last_discard_num - jb->jb_framelist.discarded_num; 
     1109 
     1110        /* Normalize non-discarded frames count just been removed */ 
     1111        count -= frame_cnt; 
     1112 
     1113        /* Remove more frames */ 
     1114        last_discard_num = jb->jb_framelist.discarded_num; 
     1115        count += jb_framelist_remove_head(&jb->jb_framelist, frame_cnt); 
     1116    } 
     1117 
     1118    return count; 
     1119} 
Note: See TracChangeset for help on using the changeset viewer.