Ignore:
Timestamp:
Feb 24, 2011 7:47:55 AM (10 years ago)
Author:
nanang
Message:

Re #1182:

  • Added video stream interface in vid_stream.h, the video stream will be able to handle different video formats in encoding and decoding direction.
  • Renamed video device stream class identifiers from 'pjmedia_vid_stream*' to 'pjmedia_vid_dev_stream*' as 'pjmedia_vid_stream' is used by video stream interface.
  • Added ffmpeg video capability to be able to parse SDP format param for H263 and also decide video format for encoding direction based on remote preference and local format-capability setting.
  • Added some new APIs in jitter buffer for handling video stream: pjmedia_jbuf_put_frame3(), pjmedia_jbuf_get_frame3(), pjmedia_jbuf_peek_frame(), and pjmedia_jbuf_remove_frame().
  • Moved pjmedia_stream_info_from_sdp() from session to stream
File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/projects/2.0-dev/pjmedia/src/pjmedia/jbuf.c

    r3359 r3420  
    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)  
    262267{ 
    263268    if (framelist->size) { 
     
    282287            if (bit_info) 
    283288                *bit_info = framelist->bit_info[framelist->head]; 
     289            if (ts) 
     290                *ts = framelist->ts[framelist->head]; 
    284291 
    285292            //pj_bzero(framelist->content +  
     
    289296            framelist->content_len[framelist->head] = 0; 
    290297            framelist->bit_info[framelist->head] = 0; 
     298            framelist->ts[framelist->head] = 0; 
    291299 
    292300            framelist->origin++; 
     
    302310 
    303311    return PJ_FALSE; 
     312} 
     313 
     314 
     315static pj_bool_t jb_framelist_peek(jb_framelist_t *framelist, 
     316                                   unsigned idx, 
     317                                   const void **frame, 
     318                                   pj_size_t *size, 
     319                                   pjmedia_jb_frame_type *type, 
     320                                   pj_uint32_t *bit_info, 
     321                                   pj_uint32_t *ts)  
     322{ 
     323    unsigned pos; 
     324 
     325    if (idx >= jb_framelist_eff_size(framelist)) 
     326        return PJ_FALSE; 
     327 
     328    pos = framelist->head; 
     329 
     330    /* Find actual peek position, note there may be discarded frames */ 
     331    while (1) { 
     332        if (framelist->frame_type[pos] != PJMEDIA_JB_DISCARDED_FRAME) { 
     333            if (idx == 0) 
     334                break; 
     335            else 
     336                --idx; 
     337        } 
     338        pos = (pos + 1) % framelist->max_count; 
     339    } 
     340 
     341    /* Return the frame pointer */ 
     342    if (frame) 
     343        *frame = framelist->content + pos*framelist->frame_size; 
     344    if (type) 
     345        *type = (pjmedia_jb_frame_type)  
     346                framelist->frame_type[pos]; 
     347    if (size) 
     348        *size = framelist->content_len[pos]; 
     349    if (bit_info) 
     350        *bit_info = framelist->bit_info[pos]; 
     351    if (ts) 
     352        *ts = framelist->ts[pos]; 
     353 
     354    return PJ_TRUE; 
    304355} 
    305356 
     
    373424                                       unsigned frame_size, 
    374425                                       pj_uint32_t bit_info, 
     426                                       pj_uint32_t ts, 
    375427                                       unsigned frame_type) 
    376428{ 
     
    426478    framelist->content_len[pos] = frame_size; 
    427479    framelist->bit_info[pos] = bit_info; 
     480    framelist->ts[pos] = ts; 
    428481 
    429482    /* update framelist size */ 
     
    735788                                     int frame_seq) 
    736789{ 
    737     pjmedia_jbuf_put_frame2(jb, frame, frame_size, 0, frame_seq, NULL); 
     790    pjmedia_jbuf_put_frame3(jb, frame, frame_size, 0, frame_seq, 0, NULL); 
    738791} 
    739792 
     
    743796                                     pj_uint32_t bit_info, 
    744797                                     int frame_seq, 
     798                                     pj_bool_t *discarded) 
     799{ 
     800    pjmedia_jbuf_put_frame3(jb, frame, frame_size, bit_info, frame_seq, 0,  
     801                            discarded); 
     802} 
     803 
     804PJ_DEF(void) pjmedia_jbuf_put_frame3(pjmedia_jbuf *jb,  
     805                                     const void *frame,  
     806                                     pj_size_t frame_size,  
     807                                     pj_uint32_t bit_info, 
     808                                     int frame_seq, 
     809                                     pj_uint32_t ts, 
    745810                                     pj_bool_t *discarded) 
    746811{ 
     
    812877    min_frame_size = PJ_MIN(frame_size, jb->jb_frame_size); 
    813878    status = jb_framelist_put_at(&jb->jb_framelist, frame_seq, frame, 
    814                                  min_frame_size, bit_info, frame_type); 
     879                                 min_frame_size, bit_info, ts, frame_type); 
    815880     
    816881    /* Jitter buffer is full, remove some older frames */ 
     
    835900        removed = jb_framelist_remove_head(&jb->jb_framelist, distance); 
    836901        status = jb_framelist_put_at(&jb->jb_framelist, frame_seq, frame, 
    837                                      min_frame_size, bit_info, frame_type); 
     902                                     min_frame_size, bit_info, ts, frame_type); 
    838903 
    839904        jb->jb_discard += removed; 
     
    867932                                     char *p_frame_type) 
    868933{ 
    869     pjmedia_jbuf_get_frame2(jb, frame, NULL, p_frame_type, NULL); 
     934    pjmedia_jbuf_get_frame3(jb, frame, NULL, p_frame_type, NULL, NULL); 
    870935} 
    871936 
     
    879944                                     pj_uint32_t *bit_info) 
    880945{ 
     946    pjmedia_jbuf_get_frame3(jb, frame, size, p_frame_type, bit_info, NULL); 
     947} 
     948 
     949/* 
     950 * Get frame from jitter buffer. 
     951 */ 
     952PJ_DEF(void) pjmedia_jbuf_get_frame3(pjmedia_jbuf *jb,  
     953                                     void *frame,  
     954                                     pj_size_t *size, 
     955                                     char *p_frame_type, 
     956                                     pj_uint32_t *bit_info, 
     957                                     pj_uint32_t *ts) 
     958{ 
    881959    if (jb->jb_status == JB_STATUS_PREFETCHING) { 
    882960 
     
    902980        /* Try to retrieve a frame from frame list */ 
    903981        res = jb_framelist_get(&jb->jb_framelist, frame, size, &ftype,  
    904                                bit_info); 
     982                               bit_info, ts); 
    905983        if (res) { 
    906984            /* We've successfully retrieved a frame from the frame list, but 
     
    9701048} 
    9711049 
     1050 
     1051PJ_DEF(void) pjmedia_jbuf_peek_frame( pjmedia_jbuf *jb, 
     1052                                      unsigned idx, 
     1053                                      const void **frame,  
     1054                                      pj_size_t *size,  
     1055                                      char *p_frm_type, 
     1056                                      pj_uint32_t *bit_info, 
     1057                                      pj_uint32_t *ts) 
     1058{ 
     1059    pjmedia_jb_frame_type ftype; 
     1060    pj_bool_t res; 
     1061 
     1062    res = jb_framelist_peek(&jb->jb_framelist, idx, frame, size, &ftype, bit_info, ts); 
     1063    if (!res) 
     1064        *p_frm_type = PJMEDIA_JB_ZERO_EMPTY_FRAME; 
     1065    else if (ftype == PJMEDIA_JB_NORMAL_FRAME) 
     1066        *p_frm_type = PJMEDIA_JB_NORMAL_FRAME; 
     1067    else 
     1068        *p_frm_type = PJMEDIA_JB_MISSING_FRAME; 
     1069} 
     1070 
     1071 
     1072PJ_DEF(unsigned) pjmedia_jbuf_remove_frame(pjmedia_jbuf *jb,  
     1073                                           unsigned frame_cnt) 
     1074{ 
     1075    unsigned count, last_discard_num; 
     1076 
     1077    last_discard_num = jb->jb_framelist.discarded_num; 
     1078    count = jb_framelist_remove_head(&jb->jb_framelist, frame_cnt); 
     1079 
     1080    /* Remove some more when there were discarded frames included */ 
     1081    while (jb->jb_framelist.discarded_num < last_discard_num) { 
     1082        /* Calculate frames count to be removed next */ 
     1083        frame_cnt = last_discard_num - jb->jb_framelist.discarded_num; 
     1084 
     1085        /* Normalize non-discarded frames count just been removed */ 
     1086        count -= frame_cnt; 
     1087 
     1088        /* Remove more frames */ 
     1089        last_discard_num = jb->jb_framelist.discarded_num; 
     1090        count += jb_framelist_remove_head(&jb->jb_framelist, frame_cnt); 
     1091    } 
     1092 
     1093    return count; 
     1094} 
Note: See TracChangeset for help on using the changeset viewer.