Changeset 3664 for pjproject/trunk/pjmedia/src/pjmedia/jbuf.c
- Timestamp:
- Jul 19, 2011 3:42:28 AM (13 years ago)
- Location:
- pjproject/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk
- Property svn:mergeinfo changed
-
pjproject/trunk/pjmedia/src/pjmedia/jbuf.c
r3553 r3664 69 69 pj_size_t *content_len; /**< frame length array */ 70 70 pj_uint32_t *bit_info; /**< frame bit info array */ 71 pj_uint32_t *ts; /**< timestamp array */ 71 72 72 73 /* States */ … … 198 199 sizeof(framelist->bit_info[0])* 199 200 framelist->max_count); 200 201 framelist->ts = (pj_uint32_t*) 202 pj_pool_alloc(pool, 203 sizeof(framelist->ts[0])* 204 framelist->max_count); 201 205 202 206 return jb_framelist_reset(framelist); … … 259 263 void *frame, pj_size_t *size, 260 264 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) 262 268 { 263 269 if (framelist->size) { … … 295 301 *bit_info = framelist->bit_info[framelist->head]; 296 302 } 303 if (ts) 304 *ts = framelist->ts[framelist->head]; 305 if (seq) 306 *seq = framelist->origin; 297 307 298 308 //pj_bzero(framelist->content + … … 302 312 framelist->content_len[framelist->head] = 0; 303 313 framelist->bit_info[framelist->head] = 0; 314 framelist->ts[framelist->head] = 0; 304 315 305 316 framelist->origin++; … … 315 326 316 327 return PJ_FALSE; 328 } 329 330 331 static 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; 317 375 } 318 376 … … 386 444 unsigned frame_size, 387 445 pj_uint32_t bit_info, 446 pj_uint32_t ts, 388 447 unsigned frame_type) 389 448 { … … 439 498 framelist->content_len[pos] = frame_size; 440 499 framelist->bit_info[pos] = bit_info; 500 framelist->ts[pos] = ts; 441 501 442 502 /* update framelist size */ … … 748 808 int frame_seq) 749 809 { 750 pjmedia_jbuf_put_frame 2(jb, frame, frame_size, 0, frame_seq, NULL);810 pjmedia_jbuf_put_frame3(jb, frame, frame_size, 0, frame_seq, 0, NULL); 751 811 } 752 812 … … 756 816 pj_uint32_t bit_info, 757 817 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 824 PJ_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, 758 830 pj_bool_t *discarded) 759 831 { … … 825 897 min_frame_size = PJ_MIN(frame_size, jb->jb_frame_size); 826 898 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); 828 900 829 901 /* Jitter buffer is full, remove some older frames */ … … 848 920 removed = jb_framelist_remove_head(&jb->jb_framelist, distance); 849 921 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); 851 923 852 924 jb->jb_discard += removed; … … 880 952 char *p_frame_type) 881 953 { 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); 883 956 } 884 957 … … 892 965 pj_uint32_t *bit_info) 893 966 { 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 */ 974 PJ_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 { 894 982 if (jb->jb_status == JB_STATUS_PREFETCHING) { 895 983 … … 915 1003 /* Try to retrieve a frame from frame list */ 916 1004 res = jb_framelist_get(&jb->jb_framelist, frame, size, &ftype, 917 bit_info );1005 bit_info, ts, seq); 918 1006 if (res) { 919 1007 /* We've successfully retrieved a frame from the frame list, but … … 983 1071 } 984 1072 1073 1074 PJ_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 1097 PJ_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.