[Sumover-dev] [svn commit] r4667 - vic/branches/cc/rtp
sumover-dev at cs.ucl.ac.uk
sumover-dev at cs.ucl.ac.uk
Thu Mar 4 15:05:36 GMT 2010
Author: soohyunc
Date: Thu Mar 4 15:05:36 2010
New Revision: 4667
Modified:
vic/branches/cc/rtp/session.cpp
vic/branches/cc/rtp/session.h
vic/branches/cc/rtp/transmitter.h
Log:
-- fixed buggy routines when receiving XR packets before sending packets
it wasn't needed to create virtual method linking
SessionManager/Transmitter/CtrlHandler.
Instead, implemented recv_xreport in SessionManager class.
and, when we are trying to get XR before sending, we do not trigger clocking
packets out. -- changed parxe_xr methods.
Modified: vic/branches/cc/rtp/session.cpp
==============================================================================
--- vic/branches/cc/rtp/session.cpp (original)
+++ vic/branches/cc/rtp/session.cpp Thu Mar 4 15:05:36 2010
@@ -224,8 +224,7 @@
confid_(-1),
seqno_(0), // RTP data packet seqno (from RTP header)
lastseq_(0), // last received packet's seqno
-ackvec_(0), // bit vector (AckVec)
-get_xr_only_(0)
+ackvec_(0) // bit vector (AckVec)
{
/*XXX For adios() to send bye*/
manager = this;
@@ -456,6 +455,10 @@
//mh_.msg_iov = pb->iov;
// dh_[.net()->send(mh_);
//debug_msg("L %d,",pb->layer);
+
+ // receive XR before sending
+ recv_xreport(ch_);
+
// Using loop_layer for now to restrict transmission as well
if (pb->layer < loop_layer_) {
// if ( pb->layer <0 ) exit(1);
@@ -468,7 +471,6 @@
switch (cc_type_) {
case WBCC:
ch_[0].send_aoa(); // send ack of ack
- //ch_[0].send_ts(); // send time stamp
break;
case RBCC:
break;
@@ -478,6 +480,9 @@
void SessionManager::tx_data_only(pktbuf* pb)
{
+ // receive XR before sending
+ recv_xreport(ch_);
+
if (pb->layer < loop_layer_) {
Network* n = dh_[pb->layer].net();
if (n != 0)
@@ -630,7 +635,7 @@
u_int8_t tos, u_int16_t begin_seq)
{
u_int16_t chunk = (tos & 0x03) << 14;
- send_Xreport(ch, XR_BT_1, XR_BT_ECN, 0,
+ send_xreport(ch, XR_BT_1, XR_BT_ECN, 0,
begin_seq, begin_seq, &chunk, 1, 0);
}
@@ -677,9 +682,9 @@
// set AckofAck
chunks[num_chunks-1] = tfwc_sndr_get_aoa();
- // send_Xreport (sender's report)
+ // send_xreport (sender's report)
// - just sending ackofack information
- send_Xreport(ch, XR_BT_1, 0, 0, 0, 0, chunks, num_chunks, 0);
+ send_xreport(ch, XR_BT_1, 0, 0, 0, 0, chunks, num_chunks, 0);
break;
case RBCC:
@@ -714,9 +719,9 @@
case RBCC:
break;
}
- // send_Xreport (receiver's report)
+ // send_xreport (receiver's report)
// - sending AckVec
- send_Xreport(ch, XR_BT_1, 0, 0, tfwc_rcvr_begins(),
+ send_xreport(ch, XR_BT_1, 0, 0, tfwc_rcvr_begins(),
tfwc_rcvr_ends(), chunks, num_chunks, 0);
}
else if (bt == XR_BT_3) {
@@ -726,7 +731,7 @@
}
// New version
-void SessionManager::send_Xreport(CtrlHandler* ch, u_int8_t bt,
+void SessionManager::send_xreport(CtrlHandler* ch, u_int8_t bt,
u_int8_t rsvd, u_int8_t thin,
u_int16_t begin_seq, u_int16_t end_seq,
u_int16_t *chunks, u_int16_t num_chunks,
@@ -1255,7 +1260,6 @@
s->map_ntp_time(t);
s->map_rtp_time(s->convert_time(t));
s->rtp2ntp(1);
- //printf("Got SR\n");
int cnt = flags >> 8 & 0x1f;
parse_rr_records(ssrc, (rtcp_rr*)(sr + 1), cnt, ep, addr);
@@ -1277,7 +1281,7 @@
}
void SessionManager::parse_xr(rtcphdr* rh, int flags, u_char* ep,
- Source* ps, Address & addr, int layer)
+ Source* ps, Address & addr, int layer, int op)
{
Source* s;
u_int32_t ssrc = rh->rh_ssrc; // RTCP's ssrc
@@ -1288,11 +1292,11 @@
s->layer(layer).lts_ctrl(unixtime());
int cnt = flags >> 8 & 0x1f; // reception report count
- parse_xr_records(ssrc, (rtcp_xr*)(rh + 1), cnt, ep, addr);
+ parse_xr_records(ssrc, (rtcp_xr*)(rh + 1), cnt, ep, addr, op);
}
void SessionManager::parse_xr_records(u_int32_t ssrc, rtcp_xr* xr, int cnt,
- const u_char* ep, Address & addr)
+ const u_char* ep, Address & addr, int op)
{
fprintf(stderr,
"~~~~~~~~~~~~~~~~~~entering parse_xr_records()~~~~~~~~~~~~~~~~~~\n");
@@ -1341,10 +1345,8 @@
tfwc_sndr_recv(xr->BT, begin, end, chunk, recv_ts_);
// we need to call Transmitter::output(pb) to make Ack driven
- if(!get_xr_only_)
+ if(op)
cc_tfwc_output();
- else
- get_xr_only_ = false;
break;
case RBCC:
@@ -1377,15 +1379,100 @@
}
// receive XR (AckVec)
-void SessionManager::recv_xreport() {
- get_xr_only_ = true;
- ch_[0].recv_ackv();
-}
+void SessionManager::recv_xreport(CtrlHandler *ch) {
+ // timestamp for XR reception
+ recv_ts_ = tx_now() - tx_now_offset_;
+
+ Address * srcp;
+ int cc = ch->recv(pktbuf_, 2 * RTP_MTU, srcp);
+
+ // return when no RTCP arrived in the socket buffer
+ if (cc <= 0)
+ return;
+
+ rtcphdr* rh = (rtcphdr *)pktbuf_;
+ // ignore loopback packets
+ if (!loopback_) {
+ SourceManager& sm = SourceManager::instance();
+ if (rh->rh_ssrc == (*sm.localsrc()).srcid())
+ return;
+ }
+ if (cc < int(sizeof(*rh))) {
+ ++nrunt_;
+ return;
+ }
+
+ // filter out junk report and other types of RTCP packet.
+ // here, we expect it to be XR only.
+ switch(ntohs(rh->rh_flags) & 0xc0ff) {
+ case RTP_VERSION << 14 | RTCP_PT_XR:
+ break;
+ case RTP_VERSION << 14 | RTCP_PT_SR:
+ case RTP_VERSION << 14 | RTCP_PT_RR:
+ case RTP_VERSION << 14 | RTCP_PT_BYE:
+ debug_msg("warning: detected wrong RTCP packet types!\n");
+ return;
+ default:
+ ++badversion_;
+ return;
+ }
+
+ // we're safe to assume that this is XR packet.
+ // -- compute average size estimator.
+ rtcp_avg_size_ += RTCP_SIZE_GAIN * (double (cc + 28) - rtcp_avg_size_);
+ Address & addr = *srcp;
-// receive AckVec (force to receive)
-// (TFWC data sender side)
-void CtrlHandler::recv_ackv() {
- sm_->recv(this);
+ // XXX sdes related stuffs (do we need it here?)
+ // -- first record in compound packet must be the ssrc of the sender of this
+ // packet. pull it out for the use in sdes parsing.
+ // -- note: sdes record does not contain the ssrc of the sender.
+ u_int32_t ssrc = rh->rh_ssrc;
+ Source* ps = SourceManager::instance().lookup(ssrc, ssrc, addr);
+ if (ps == 0) return;
+
+ int layer = ch - ch_;
+ int rtcp_pkt_id;
+
+ // parse RTCP records (while loop enables to parse "compound packet")
+ // -- we expect it to be XR.
+ u_char* epack = (u_char *)rh + cc;
+ while ((u_char *)rh < epack) {
+ u_int len = (ntohs(rh->rh_len) << 2) + 4;
+ u_char* ep = (u_char *)rh + len;
+ // bad length
+ if (ep > epack) {
+ ps->badsesslen(1);
+ return;
+ }
+ // bad version
+ u_int flags = ntohs(rh->rh_flags);
+ if (flags >> 14 != RTP_VERSION) {
+ ps->badsessver(1);
+ return;
+ }
+
+ switch (flags & 0xff) {
+ case RTCP_PT_XR:
+ rtcp_pkt_id = RTCP_PT_XR;
+ parse_xr(rh, flags, ep, ps, addr, layer, 0);
+ break;
+ case RTCP_PT_SR:
+ rtcp_pkt_id = RTCP_PT_SR;
+ case RTCP_PT_RR:
+ rtcp_pkt_id = RTCP_PT_RR;
+ case RTCP_PT_BYE:
+ rtcp_pkt_id = RTCP_PT_BYE;
+ case RTCP_PT_SDES:
+ rtcp_pkt_id = RTCP_PT_SDES;
+ debug_msg("warning: wrong RTCP packet type! %d\n", rtcp_pkt_id);
+ return;
+ default:
+ ps->badsessopt(1);
+ break;
+ }
+ rh = (rtcphdr *)ep;
+ }
+ return;
}
// send AckVec
@@ -1608,7 +1695,7 @@
break;
case RTCP_PT_XR:
- parse_xr(rh, flags, ep, ps, addr, layer);
+ parse_xr(rh, flags, ep, ps, addr, layer, 1);
break;
case RTCP_PT_SDES:
Modified: vic/branches/cc/rtp/session.h
==============================================================================
--- vic/branches/cc/rtp/session.h (original)
+++ vic/branches/cc/rtp/session.h Thu Mar 4 15:05:36 2010
@@ -105,7 +105,6 @@
void send_aoa(); // send ackofack (TfwcSndr side)
void send_ts(); // send timestamp (TfwcSndr side)
void send_ackv(); // send ackvec (TfwcRcvr side)
- void recv_ackv(); // receive ackvec (TfwcSndr side)
void send_p();
void send_ts_echo();
@@ -141,14 +140,14 @@
// virtual void send_report();
virtual void send_report(CtrlHandler*, int bye, int app = 0);
virtual void build_xreport(CtrlHandler*, int bt);
- virtual void send_Xreport(CtrlHandler* ch,
+ virtual void send_xreport(CtrlHandler* ch,
u_int8_t bt, u_int8_t rsvd, u_int8_t thin,
u_int16_t begin_seq, u_int16_t end_seq,
u_int16_t *chunks, u_int16_t num_chunks,
u_int32_t xrssrc);
// receive XR
- virtual void recv_xreport();
+ void recv_xreport(CtrlHandler*);
void build_aoa_pkt(CtrlHandler* ch);
void build_ts_pkt(CtrlHandler* ch);
@@ -178,11 +177,11 @@
void parse_rr(rtcphdr* rh, int flags, u_char* ep,
Source* ps, Address & addr, int layer);
void parse_xr(rtcphdr* rh, int flags, u_char* ep,
- Source* ps, Address & addr, int layer);
+ Source* ps, Address & addr, int layer, int op);
void parse_rr_records(u_int32_t ssrc, rtcp_rr* r, int cnt,
const u_char* ep, Address & addr);
void parse_xr_records(u_int32_t ssrc, rtcp_xr* xr, int cnt,
- const u_char* ep, Address & addr);
+ const u_char* ep, Address & addr, int op);
int sdesbody(u_int32_t* p, u_char* ep, Source* ps,
Address & addr, u_int32_t ssrc, int layer);
void parse_sdes(rtcphdr* rh, int flags, u_char* ep, Source* ps,
@@ -237,8 +236,6 @@
u_int16_t ackvec_; // this is a bit vector
// timestamp
double recv_ts_; // receive timestamp
-
- bool get_xr_only_;
};
class AudioSessionManager : public SessionManager {
Modified: vic/branches/cc/rtp/transmitter.h
==============================================================================
--- vic/branches/cc/rtp/transmitter.h (original)
+++ vic/branches/cc/rtp/transmitter.h Thu Mar 4 15:05:36 2010
@@ -94,9 +94,6 @@
void cc_tfwc_output(pktbuf*);
void cc_tfrc_output();
- // receive XR
- virtual void recv_xreport() = 0;
-
/*
* Buffer allocation hooks.
*/
More information about the Sumover-dev
mailing list