Changeset 2506 for pjproject/trunk/pjmedia/src/pjmedia/stream.c
- Timestamp:
- Mar 12, 2009 6:11:37 PM (14 years ago)
- Location:
- pjproject/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk
-
Property
svn:mergeinfo
set to
False
/pjproject/branches/projects/aps-direct merged eligible
-
Property
svn:mergeinfo
set to
False
-
pjproject/trunk/pjmedia/src/pjmedia/stream.c
r2477 r2506 409 409 410 410 411 /* The other version of get_frame callback used when stream port format 412 * is non linear PCM. 413 */ 414 static pj_status_t get_frame_ext( pjmedia_port *port, pjmedia_frame *frame) 415 { 416 pjmedia_stream *stream = (pjmedia_stream*) port->port_data.pdata; 417 pjmedia_channel *channel = stream->dec; 418 pjmedia_frame_ext *f = (pjmedia_frame_ext*)frame; 419 unsigned samples_per_frame, samples_required; 420 pj_status_t status; 421 422 /* Return no frame if channel is paused */ 423 if (channel->paused) { 424 frame->type = PJMEDIA_FRAME_TYPE_NONE; 425 return PJ_SUCCESS; 426 } 427 428 /* Repeat get frame from the jitter buffer and decode the frame 429 * until we have enough frames according to codec's ptime. 430 */ 431 432 samples_required = stream->port.info.samples_per_frame; 433 samples_per_frame = stream->codec_param.info.frm_ptime * 434 stream->codec_param.info.clock_rate * 435 stream->codec_param.info.channel_cnt / 436 1000; 437 438 pj_bzero(f, sizeof(pjmedia_frame_ext)); 439 f->base.type = PJMEDIA_FRAME_TYPE_EXTENDED; 440 441 while (f->samples_cnt < samples_required) { 442 char frame_type; 443 pj_size_t frame_size; 444 pj_uint32_t bit_info; 445 446 /* Lock jitter buffer mutex first */ 447 pj_mutex_lock( stream->jb_mutex ); 448 449 /* Get frame from jitter buffer. */ 450 pjmedia_jbuf_get_frame2(stream->jb, channel->out_pkt, &frame_size, 451 &frame_type, &bit_info); 452 453 /* Unlock jitter buffer mutex. */ 454 pj_mutex_unlock( stream->jb_mutex ); 455 456 if (frame_type == PJMEDIA_JB_NORMAL_FRAME) { 457 /* Got "NORMAL" frame from jitter buffer */ 458 pjmedia_frame frame_in; 459 460 /* Decode */ 461 frame_in.buf = channel->out_pkt; 462 frame_in.size = frame_size; 463 frame_in.bit_info = bit_info; 464 frame_in.type = PJMEDIA_FRAME_TYPE_AUDIO; 465 466 status = stream->codec->op->decode( stream->codec, &frame_in, 467 0, frame); 468 if (status != PJ_SUCCESS) { 469 LOGERR_((port->info.name.ptr, "codec decode() error", 470 status)); 471 pjmedia_frame_ext_append_subframe(f, NULL, 0, 472 (pj_uint16_t)samples_per_frame); 473 } 474 } else { 475 status = (*stream->codec->op->recover)(stream->codec, 476 0, frame); 477 if (status != PJ_SUCCESS) { 478 pjmedia_frame_ext_append_subframe(f, NULL, 0, 479 (pj_uint16_t)samples_per_frame); 480 } 481 482 if (frame_type == PJMEDIA_JB_MISSING_FRAME) { 483 PJ_LOG(5,(stream->port.info.name.ptr, "Frame lost!")); 484 } else if (frame_type == PJMEDIA_JB_ZERO_EMPTY_FRAME) { 485 /* Jitter buffer is empty. Check if this is the first "empty" 486 * state. 487 */ 488 if (frame_type != stream->jb_last_frm) { 489 pjmedia_jb_state jb_state; 490 491 /* Report the state of jitter buffer */ 492 pjmedia_jbuf_get_state(stream->jb, &jb_state); 493 PJ_LOG(5,(stream->port.info.name.ptr, 494 "Jitter buffer empty (prefetch=%d)", 495 jb_state.prefetch)); 496 } 497 } else { 498 pjmedia_jb_state jb_state; 499 500 /* It can only be PJMEDIA_JB_ZERO_PREFETCH frame */ 501 pj_assert(frame_type == PJMEDIA_JB_ZERO_PREFETCH_FRAME); 502 503 /* Get the state of jitter buffer */ 504 pjmedia_jbuf_get_state(stream->jb, &jb_state); 505 506 if (stream->jb_last_frm != frame_type) { 507 PJ_LOG(5,(stream->port.info.name.ptr, 508 "Jitter buffer is bufferring (prefetch=%d)", 509 jb_state.prefetch)); 510 } 511 } 512 } 513 514 stream->jb_last_frm = frame_type; 515 } 516 517 return PJ_SUCCESS; 518 } 519 520 411 521 /* 412 522 * Transmit DTMF … … 687 797 if (frame->type == PJMEDIA_FRAME_TYPE_AUDIO) 688 798 ts_len = (frame->size >> 1) / stream->codec_param.info.channel_cnt; 799 else if (frame->type == PJMEDIA_FRAME_TYPE_EXTENDED) 800 ts_len = stream->port.info.samples_per_frame / 801 stream->port.info.channel_count; 689 802 else 690 803 ts_len = 0; … … 753 866 } else if (frame->type == PJMEDIA_FRAME_TYPE_AUDIO && 754 867 frame->buf == NULL && 868 stream->port.info.format.id == PJMEDIA_FORMAT_L16 && 755 869 (stream->dir & PJMEDIA_DIR_ENCODING) && 756 870 stream->codec_param.info.frm_ptime * … … 1484 1598 stream->port.info.clock_rate = info->fmt.clock_rate; 1485 1599 stream->port.info.channel_count = info->fmt.channel_cnt; 1600 stream->port.info.format.id = info->param->info.fmt_id; 1486 1601 stream->port.port_data.pdata = stream; 1487 stream->port.put_frame = &put_frame; 1488 stream->port.get_frame = &get_frame; 1602 if (stream->port.info.format.id == PJMEDIA_FORMAT_L16) { 1603 stream->port.put_frame = &put_frame; 1604 stream->port.get_frame = &get_frame; 1605 } else { 1606 stream->port.info.format.bitrate = info->param->info.avg_bps; 1607 stream->port.info.format.vad = (info->param->setting.vad != 0); 1608 1609 stream->port.put_frame = &put_frame; 1610 stream->port.get_frame = &get_frame_ext; 1611 } 1489 1612 1490 1613
Note: See TracChangeset
for help on using the changeset viewer.