Changeset 4255

Show
Ignore:
Timestamp:
08/08/08 20:05:37 (6 years ago)
Author:
soohyunc
Message:

(1) RTCP XR block type value, now, changed to HEX code
(2) session.cpp has the fuction to send time stamp and time stamp echo

(note: gettimeofday_usec() return type needs to be resolved.)

we are sending two RTCP XR packets on every RTP data packet transmission. we can
later merge these two RTCP XR report packets in a single XR report packet.
currently, every RTP data packet is followed by two XR report packets.

Location:
vic/branches/cc
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • vic/branches/cc/cc/tfwc_rcvr.h

    r4252 r4255  
    5151 
    5252protected: 
    53         inline u_int32_t get_ackvec() { return tfwcAV; } 
    54         inline u_int32_t get_timestamp() { return tfwcAV; } 
     53        inline u_int32_t tfwc_rcvr_getvec() { return tfwcAV; } 
     54        inline u_int32_t tfwc_rcvr_ts_echo() { return ts_echo_; } 
    5555        u_int32_t tfwcAV;       // AckVec (bit vector) 
    5656        u_int16_t seqno_;       // received RTP packet seqno 
     
    5858private: 
    5959        void ackvec_manager(u_int16_t seqno, u_int16_t latseq); 
     60        u_int32_t ts_echo_;     // for time stamp echoing 
    6061}; 
    6162 
  • vic/branches/cc/cc/tfwc_sndr.cpp

    r4253 r4255  
    6464} 
    6565 
    66 void TfwcSndr::tfwc_sndr_recv(u_int32_t ackv) 
     66void TfwcSndr::tfwc_sndr_recv(u_int32_t ackv, u_int32_t ts_echo) 
    6767{ 
    6868        // the most recent 3 packets will be marked as 1 using marginvec_ 
    6969        ackv_ = ackv | marginvec_; 
     70        ts_echo_ = ts_echo; 
    7071} 
    7172 
  • vic/branches/cc/cc/tfwc_sndr.h

    r4253 r4255  
    4242        // parse RTP data packet from Transmitter module 
    4343        void tfwc_sndr_send(pktbuf*); 
    44         void tfwc_sndr_recv(u_int32_t ackv); 
    45         inline u_int16_t get_seqno() { return seqno_; } 
    46         inline u_int32_t get_aoa() { return aoa_; } 
     44        void tfwc_sndr_recv(u_int32_t ackv, u_int32_t ts_echo); 
     45        inline u_int16_t tfwc_sndr_get_seqno() { return seqno_; } 
     46        inline u_int32_t tfwc_sndr_get_aoa() { return aoa_; } 
    4747        void ackofack();        // set ack of ack 
    4848        u_int16_t seqno_;       // packet sequence number 
     
    5353        u_int32_t ackv_;        // AckVec (in TfwcSndr) 
    5454        u_int32_t aoa_;         // ack of ack 
    55         u_int32_t ts_;          // time stamp  
     55        u_int32_t ts_;          // time stamp 
     56        u_int32_t ts_echo_;     // echo time stamp from the receiver 
    5657        TfwcSndr* tfwcsndr_; 
    5758private: 
  • vic/branches/cc/rtp/rtp.h

    r4252 r4255  
    133133 * (RFC 3611) 
    134134 */ 
    135 #define XR_BT_1 1       // Loss RLE Report Block 
    136 #define XR_BT_2 2       // Duplicate RLE Report Block 
    137 #define XR_BT_3 3       // Packet Receipt Times Report Block 
    138 #define XR_BT_4 4       // Receiver Reference Time Report Block 
     135#define XR_BT_1 0x01000000      // Loss RLE Report Block 
     136#define XR_BT_2 0x02000000      // Duplicate RLE Report Block 
     137#define XR_BT_3 0x03000000      // Packet Receipt Times Report Block 
     138#define XR_BT_4 0x04000000      // Receiver Reference Time Report Block 
    139139struct rtcp_xr_hdr { 
    140140        u_int32_t xr_flags;     /* BT:8 TS:8 LEN:16 */ 
  • vic/branches/cc/rtp/session.cpp

    r4254 r4255  
    465465                // if CC is on, send an RTCP XR (aoa) packet  
    466466                // upon every RTP data packet transmission. 
    467                 if(is_cc_on()) 
    468                         ch_[0].send_aoa(); 
    469         } 
    470 } 
    471  
     467                if(is_cc_on()) { 
     468                        ch_[0].send_aoa();      // send ack of ack 
     469                        ch_[0].send_ts();       // send time stamp 
     470                } 
     471        } 
     472} 
     473 
     474// sending ack of ack packet (RTCP XR report packet) 
    472475void CtrlHandler::send_aoa() 
    473476{ 
    474         sm_->build_aoapkt(this); 
    475 } 
    476  
    477 void SessionManager::build_aoapkt(CtrlHandler* ch) 
    478 { 
    479         send_xreport(ch, 0); 
     477        sm_->build_aoa_pkt(this); 
     478} 
     479 
     480// sending time stamp packet (RTCP XR report packet) 
     481void CtrlHandler::send_ts() 
     482{ 
     483        sm_->build_ts_pkt(this); 
     484} 
     485 
     486void SessionManager::build_aoa_pkt(CtrlHandler* ch) 
     487{ 
     488        // RTCP XR (Loss RLE Report Block) 
     489        // (it is XR_BT_1 defined in rtp/rtp.h) 
     490        send_xreport(ch, 1); 
     491} 
     492 
     493void SessionManager::build_ts_pkt(CtrlHandler* ch) 
     494{ 
     495        // RTCP XR (Packet Receipt Times Report Block) 
     496        // (it is XR_BT_3 defined in rtp/rtp.h) 
     497        send_xreport(ch, 3); 
    480498} 
    481499 
     
    617635{ 
    618636        UNUSED(app); 
    619         UNUSED(bye); 
     637        int bt = bye;   // XR block type 
    620638 
    621639        SourceManager& sm = SourceManager::instance(); 
     
    659677        // XR block length 
    660678        int xrlen = (xrh->xr_flags << 16) >> 16; 
     679        xrb = (rtcp_xr_blk*)(xrh + xrlen + 1); 
    661680        // access XR block contents 
    662         xrb = (rtcp_xr_blk*)(xrh + xrlen + 1); 
    663681        // for ackofack 
    664682        xrb->begin_seq = htonl(lastseq_); 
    665683        xrb->end_seq = htonl(seqno_ + 1); 
    666         // this chunk is ackvec 
    667         xrb->chunk = (u_int32_t *) htonl(get_ackvec()); 
    668         // this chunk is timestamp echo 
    669         //xrb->chunk = htonl(mt->ref_ts()); 
     684 
     685        if(xrh->xr_flags & (bt << 28) == XR_BT_1) { 
     686                // this chunk is ackvec 
     687                xrb->chunk = (u_int32_t *) htonl(tfwc_rcvr_getvec()); 
     688        } else if(xrh->xr_flags & (bt << 28) == XR_BT_3) { 
     689                // this chunk is timestamp echo 
     690                //xrb->chunk = (u_int32_t *) gettimeofday_usecs(); 
     691        } 
    670692 
    671693        int nrr = 0; 
     
    12291251         */ 
    12301252        if (xrb->begin_seq == xrb->end_seq) { 
     1253                debug_msg(" --- RTP Receiver Side Operation\n"); 
    12311254                // we received ackofack, so do receiver stuffs here 
    1232                 //trim_vec(xrb->chunk); // chunk in xrb is ackvec 
    1233                 ch_[0].send(build_ackvpkt(xrh, ssrc), xrlen); 
    1234                 ch_[0].send(build_tspkt(xrh, ssrc), xrlen); 
     1255                //trim_ackvec((u_int32_t) &xrb->chunk); // chunk in xrb is ackvec 
     1256                ch_[0].send(build_ackv_pkt(xrh, ssrc), xrlen); 
     1257                ch_[0].send(build_ts_echo_pkt(xrh, ssrc), xrlen); 
    12351258        } else { 
     1259                debug_msg(" --- RTP Sender Side Operation\n"); 
    12361260                // we received ackvec, so do sender stuffs here 
    1237                 ackvec_ = (u_int32_t) &xrb->chunk; 
    1238                 ackofack_ = xrb->begin_seq; 
    1239                 // time stamp update comes to here 
    1240                 tfwc_sndr_recv(ackvec_);        // parse AckVec 
     1261                if((xrh->xr_flags & XR_BT_1) >> 24 == 1) { 
     1262                        // this is an XR containing ackvec 
     1263                        debug_msg("     this is AckVec XR...\n"); 
     1264                        ackvec_ = (u_int32_t) &xrb->chunk; 
     1265                        ackofack_ = xrb->end_seq - 1; 
     1266                } 
     1267                if((xrh->xr_flags & XR_BT_3) >> 24 == 3) { 
     1268                        // this is an XR containing ts echo  
     1269                        debug_msg("     this is ts_echo XR...\n"); 
     1270                        ts_echo_ = (u_int32_t) &xrb->chunk; 
     1271                } 
     1272                tfwc_sndr_recv(ackvec_, ts_echo_);      // parse AckVec 
    12411273        } 
    12421274} 
    12431275 
    12441276// build ackvec packet (RTCP XR packet) 
    1245 u_char* SessionManager::build_ackvpkt(rtcp_xr_hdr* xrh, u_int32_t ssrc)  
    1246 { 
     1277u_char* SessionManager::build_ackv_pkt(rtcp_xr_hdr* xrh, u_int32_t ssrc)  
     1278{ 
     1279        debug_msg(" build_ackv_pkt\n"); 
    12471280        // set XR block type 
    1248         xrh->xr_flags |= 0x01000000; 
     1281        xrh->xr_flags |= XR_BT_1; 
    12491282 
    12501283        // take XR block contents 
     
    12531286 
    12541287        xrb->ssrc = ssrc; 
    1255         xrb->chunk = (u_int32_t *) get_ackvec(); 
     1288        xrb->chunk = (u_int32_t *) tfwc_rcvr_getvec(); 
    12561289         
    12571290        u_char* p = (u_char*) xrh; 
     
    12601293 
    12611294// build timestamp packet (RTCP XR packet) 
    1262 u_char* SessionManager::build_tspkt(rtcp_xr_hdr* xrh, u_int32_t ssrc)  
    1263 { 
     1295u_char* SessionManager::build_ts_echo_pkt(rtcp_xr_hdr* xrh, u_int32_t ssrc)  
     1296{ 
     1297        debug_msg(" build_ts_echo_pkt\n"); 
    12641298        // set XR block type 
    1265         xrh->xr_flags |= 0x03000000; 
     1299        xrh->xr_flags |= XR_BT_3; 
    12661300 
    12671301        // take XR block contents 
     
    12701304 
    12711305        xrb->ssrc = ssrc; 
    1272         //xrb->chunk = (u_int32_t *) echo_timestamp(); 
     1306        xrb->chunk = (u_int32_t *) tfwc_rcvr_ts_echo(); 
    12731307 
    12741308        u_char* p = (u_char*) xrh; 
  • vic/branches/cc/rtp/session.h

    r4254 r4255  
    9696        inline double rint() const { return (rint_); } 
    9797        void send_aoa(); 
     98        void send_ts(); 
    9899 
    99100 protected: 
     
    131132        virtual void send_report(CtrlHandler*, int bye, int app = 0); 
    132133        virtual void send_xreport(CtrlHandler*, int bye, int app = 0); 
    133         void build_aoapkt(CtrlHandler* ch); 
     134        void build_aoa_pkt(CtrlHandler* ch); 
     135        void build_ts_pkt(CtrlHandler* ch); 
    134136 
    135137protected: 
     
    160162                        Address & addr, u_int32_t ssrc, int layer); 
    161163        void parse_bye(rtcphdr* rh, int flags, u_char* ep, Source* ps); 
    162         u_char* build_ackvpkt(rtcp_xr_hdr* xrh, u_int32_t ssrc); 
    163         u_char* build_tspkt(rtcp_xr_hdr* xrh, u_int32_t ssrc); 
     164        u_char* build_ackv_pkt(rtcp_xr_hdr* xrh, u_int32_t ssrc); 
     165        u_char* build_ts_echo_pkt(rtcp_xr_hdr* xrh, u_int32_t ssrc); 
    164166 
    165167        int parseopts(const u_char* bp, int cc, Address & addr) const; 
     
    210212        // AckVector 
    211213        u_int32_t ackvec_;              // this is a bit vector 
     214        u_int32_t ts_echo_;             // time stamp echo 
    212215}; 
    213216