From bc4d45bb16bb152fcf261ac48e574e184b551bd5 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Thu, 23 Feb 2006 13:49:28 +0000 Subject: Added support for NULL frame in rtp stream, fixed bugs here and there in INVITE (e.g. dont send SDP on 180), and set version to 0.5.1.2 git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@223 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/src/pjmedia/conference.c | 67 ++++++++++++++++++++++++++++------------ pjmedia/src/pjmedia/rtp.c | 10 +++++- pjmedia/src/pjmedia/stream.c | 12 ++++++- 3 files changed, 68 insertions(+), 21 deletions(-) (limited to 'pjmedia/src') diff --git a/pjmedia/src/pjmedia/conference.c b/pjmedia/src/pjmedia/conference.c index 8d2d28dc..d851161b 100644 --- a/pjmedia/src/pjmedia/conference.c +++ b/pjmedia/src/pjmedia/conference.c @@ -53,6 +53,7 @@ struct conf_port pjmedia_port *port; /**< get_frame() and put_frame() */ pjmedia_port_op rx_setting; /**< Can we receive from this port */ pjmedia_port_op tx_setting; /**< Can we transmit to this port */ + int listener_cnt; /**< Number of listeners. */ pj_bool_t *listeners; /**< Array of listeners. */ pjmedia_vad *vad; /**< VAD for this port. */ @@ -467,6 +468,7 @@ PJ_DEF(pj_status_t) pjmedia_conf_connect_port( pjmedia_conf *conf, if (src_port->listeners[sink_slot] == 0) { src_port->listeners[sink_slot] = 1; ++conf->connect_cnt; + ++src_port->listener_cnt; if (conf->connect_cnt == 1) resume_sound(conf); @@ -505,6 +507,7 @@ PJ_DEF(pj_status_t) pjmedia_conf_disconnect_port( pjmedia_conf *conf, if (src_port->listeners[sink_slot] != 0) { src_port->listeners[sink_slot] = 0; --conf->connect_cnt; + --src_port->listener_cnt; PJ_LOG(4,(THIS_FILE,"Port %.*s stop transmitting to port %.*s", (int)src_port->name.slen, @@ -556,6 +559,7 @@ PJ_DEF(pj_status_t) pjmedia_conf_remove_port( pjmedia_conf *conf, if (conf_port->listeners[port] != 0) { --conf->connect_cnt; + --conf_port->listener_cnt; conf_port->listeners[port] = 0; } } @@ -563,8 +567,10 @@ PJ_DEF(pj_status_t) pjmedia_conf_remove_port( pjmedia_conf *conf, /* Remove all ports listening from this port. */ conf_port = conf->ports[port]; for (i=0; imax_ports; ++i) { - if (conf_port->listeners[i]) + if (conf_port->listeners[i]) { --conf->connect_cnt; + --conf_port->listener_cnt; + } } /* Remove the port. */ @@ -693,20 +699,24 @@ static pj_status_t play_cb( /* in */ void *user_data, } /* Get frame from this port. - * If port has rx_buffer, then get the frame from the rx_buffer - * instead. + * If port has rx_buffer (e.g. sound port), then get the frame + * from the rx_buffer instead. */ - if (i==0/*conf_port->cur_rx_buf*/) { + if (i==0) { pj_int16_t *rx_buf; - if (conf_port->rx_read == conf_port->rx_write) - conf_port->rx_read = (conf_port->rx_write+RX_BUF_COUNT-RX_BUF_COUNT/2) % RX_BUF_COUNT; + if (conf_port->rx_read == conf_port->rx_write) { + conf_port->rx_read = + (conf_port->rx_write+RX_BUF_COUNT-RX_BUF_COUNT/2) % + RX_BUF_COUNT; + } rx_buf = conf_port->rx_buf[conf_port->rx_read]; for (j=0; jsamples_per_frame; ++j) { ((pj_int16_t*)output)[j] = rx_buf[j]; } conf_port->rx_read = (conf_port->rx_read+1) % RX_BUF_COUNT; + } else { pjmedia_frame frame; @@ -714,12 +724,19 @@ static pj_status_t play_cb( /* in */ void *user_data, frame.buf = output; frame.size = size; pjmedia_port_get_frame(conf_port->port, &frame); + + if (frame.type == PJMEDIA_FRAME_TYPE_NONE) + continue; } /* Skip (after receiving the frame) if this port is muted. */ if (conf_port->rx_setting == PJMEDIA_PORT_MUTE) continue; + /* Also skip if this port doesn't have listeners. */ + if (conf_port->listener_cnt == 0) + continue; + /* Do we have signal? */ silence = pjmedia_vad_detect_silence(conf_port->vad, output, @@ -727,10 +744,10 @@ static pj_status_t play_cb( /* in */ void *user_data, &level); /* Skip if we don't have signal. */ - if (silence) { - TRACE_(("sil:%d ", i)); - continue; - } + //if (silence) { + // TRACE_(("sil:%d ", i)); + // continue; + //} /* Convert the buffer to unsigned value */ for (j=0; jsamples_per_frame; ++j) @@ -742,7 +759,7 @@ static pj_status_t play_cb( /* in */ void *user_data, pj_uint32_t *sum_buf; unsigned k; - if (conf_port->listeners[j] == 0) + if (listener == 0) continue; /* Skip if this listener doesn't want to receive audio */ @@ -768,6 +785,20 @@ static pj_status_t play_cb( /* in */ void *user_data, if (!conf_port) continue; + if (conf_port->tx_setting == PJMEDIA_PORT_MUTE) { + frame.type = PJMEDIA_FRAME_TYPE_NONE; + frame.buf = NULL; + frame.size = 0; + + if (conf_port->port) + pjmedia_port_put_frame(conf_port->port, &frame); + + continue; + + } else if (conf_port->tx_setting != PJMEDIA_PORT_ENABLE) { + continue; + } + // // TODO: // When there's no source, not transmit the frame, but instead @@ -779,10 +810,7 @@ static pj_status_t play_cb( /* in */ void *user_data, target_buf = (conf_port->cur_tx_buf==conf_port->tx_buf1? conf_port->tx_buf2 : conf_port->tx_buf1); - if (!conf_port->sources) { - for (j=0; jsamples_per_frame; ++j) - target_buf[j] = 0; - } else { + if (conf_port->sources) { for (j=0; jsamples_per_frame; ++j) { target_buf[j] = unsigned2pcm(conf_port->sum_buf[j] / conf_port->sources); } @@ -791,11 +819,12 @@ static pj_status_t play_cb( /* in */ void *user_data, /* Switch buffer. */ conf_port->cur_tx_buf = target_buf; - if (conf_port->tx_setting != PJMEDIA_PORT_ENABLE) - continue; - pj_memset(&frame, 0, sizeof(frame)); - frame.type = PJMEDIA_FRAME_TYPE_AUDIO; + if (conf_port->sources) + frame.type = PJMEDIA_FRAME_TYPE_AUDIO; + else + frame.type = PJMEDIA_FRAME_TYPE_NONE; + frame.buf = conf_port->cur_tx_buf; frame.size = conf->samples_per_frame * conf->bits_per_sample / 8; frame.timestamp.u64 = timestamp; diff --git a/pjmedia/src/pjmedia/rtp.c b/pjmedia/src/pjmedia/rtp.c index bc87cc95..17b4e712 100644 --- a/pjmedia/src/pjmedia/rtp.c +++ b/pjmedia/src/pjmedia/rtp.c @@ -92,9 +92,17 @@ PJ_DEF(pj_status_t) pjmedia_rtp_encode_rtp( pjmedia_rtp_session *ses, int pt, in "pjmedia_rtp_encode_rtp: ses=%p, pt=%d, m=%d, pt_len=%d, ts_len=%d", ses, pt, m, payload_len, ts_len)); + /* Update timestamp */ + ses->out_hdr.ts = pj_htonl(pj_ntohl(ses->out_hdr.ts)+ts_len); + + /* If payload_len is zero, bail out. + * This is a clock frame; we're not really transmitting anything. + */ + if (payload_len == 0) + return PJ_SUCCESS; + /* Update session. */ ses->out_extseq++; - ses->out_hdr.ts = pj_htonl(pj_ntohl(ses->out_hdr.ts)+ts_len); /* Create outgoing header. */ ses->out_hdr.pt = (pj_uint8_t) ((pt == -1) ? ses->out_pt : pt); diff --git a/pjmedia/src/pjmedia/stream.c b/pjmedia/src/pjmedia/stream.c index a5737009..14f46d2b 100644 --- a/pjmedia/src/pjmedia/stream.c +++ b/pjmedia/src/pjmedia/stream.c @@ -278,7 +278,7 @@ static pj_status_t put_frame( pjmedia_port *port, (const void**)&rtphdr, &rtphdrlen); - } else { + } else if (frame->type != PJMEDIA_FRAME_TYPE_NONE) { unsigned max_size; max_size = channel->out_pkt_size - sizeof(pjmedia_rtp_hdr); @@ -296,6 +296,16 @@ static pj_status_t put_frame( pjmedia_port *port, frame_out.size, ts_len, (const void**)&rtphdr, &rtphdrlen); + } else { + + /* Just update RTP session's timestamp. */ + status = pjmedia_rtp_encode_rtp( &channel->rtp, + 0, 0, + 0, ts_len, + (const void**)&rtphdr, + &rtphdrlen); + return PJ_SUCCESS; + } if (status != 0) { -- cgit v1.2.3