diff options
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/AV/RTCP_Packet.cpp')
-rw-r--r-- | TAO/orbsvcs/orbsvcs/AV/RTCP_Packet.cpp | 1212 |
1 files changed, 0 insertions, 1212 deletions
diff --git a/TAO/orbsvcs/orbsvcs/AV/RTCP_Packet.cpp b/TAO/orbsvcs/orbsvcs/AV/RTCP_Packet.cpp deleted file mode 100644 index 8ef82e30bb3..00000000000 --- a/TAO/orbsvcs/orbsvcs/AV/RTCP_Packet.cpp +++ /dev/null @@ -1,1212 +0,0 @@ -// $Id$ -#include "orbsvcs/AV/RTCP_Packet.h" -#include "orbsvcs/AV/RTP.h" - -TAO_BEGIN_VERSIONED_NAMESPACE_DECL - -RTCP_Packet::RTCP_Packet(void) -{ - this->chd_.ver_ = 2; - this->chd_.count_ = 0; - this->chd_.pad_ = 0; - this->chd_.length_ = 0; - this->packet_data_ = 0; -} - -RTCP_Packet::RTCP_Packet(char* buffer) -{ - // Parse the common part of the control packet header. - this->chd_.ver_ = (buffer[0] & 0xC0) >> 6; - - if (this->chd_.ver_ != RTP_VERSION) - ACE_DEBUG ((LM_DEBUG, - "RTCP_Packet::RTCP_Packet version incorrect")); - - this->chd_.pad_ = (buffer[0] & 0x20) >> 5; - this->chd_.count_ = buffer[0] & 0x1F; - this->chd_.pt_ = buffer[1]; - this->chd_.length_ = ntohs(*(ACE_UINT16*)&buffer[2]); - this->packet_data_ = 0; -} - -RTCP_Packet::~RTCP_Packet(void) -{ -} - -void -RTCP_Packet::get_packet_data(char **buffer, ACE_UINT16 &length) -{ - length = static_cast<ACE_UINT16> (this->packet_size()); - - // buiidPacket is defined for each child of RTCP_Packet - // buildPacket creates a snapshot of the RTCP packet in the buffer pktData - this->build_packet (); - - *buffer = this->packet_data_; -} - -int -RTCP_Packet::is_valid (char is_first) -{ - // make sure the RTP version is correct - if (this->chd_.ver_ != RTP_VERSION) - return 0; - - // these checks are only for the first RTCP packet in a compound packet - if (is_first) - { - // the payload type must be RR or SR - if ((this->chd_.pt_ != RTCP_PT_SR) && (this->chd_.pt_ != RTCP_PT_RR)) - return 0; - - // the padding bit must not be set - if (this->chd_.pad_ != 0) - return 0; - } - - return 1; - -} - -/* - * RTCP_BYE_Packet - */ - -RTCP_BYE_Packet::RTCP_BYE_Packet(ACE_UINT32 *ssrc_list, - unsigned char length, - const char *text) -{ - this->chd_.ver_ = 2; - this->chd_.count_ = length; - this->chd_.pt_ = RTCP_PT_BYE; - - if (length) - { - ACE_NEW (this->ssrc_list_, - ACE_UINT32[length]); - - this->ssrc_list_length_ = length; - - for (int i=0; i<length; i++) - this->ssrc_list_[i] = ssrc_list[i]; - } - - // Optional - if there is a reason for leaving, store it. - // The reason is padded with extra zeros because the packet must - // end on an even 32-bit boundary. - memset(this->reason_, 0, sizeof(this->reason_)); - if (text) - { - size_t text_length = ACE_OS::strlen(text); - memcpy(this->reason_, text, text_length); - this->reason_length_ = static_cast<unsigned char> (text_length); - } - else - this->reason_length_ = 0; - - // Set the packet length - this->chd_.length_ = static_cast<ACE_UINT16> (this->chd_.count_ + (this->reason_length_+1)/4); - if ((this->reason_length_+1)%4) - this->chd_.length_++; - - this->packet_data_ = 0; -} - -//============================================================================== - -RTCP_BYE_Packet::RTCP_BYE_Packet(char* buffer, int *len) - : RTCP_Packet(buffer) -{ - unsigned int index = 0; - unsigned int j; - - // The common part of the header is initialized in the parent. - index=4; - - ACE_NEW (this->ssrc_list_, - ACE_UINT32[this->chd_.count_]); - this->ssrc_list_length_ = this->chd_.count_; - - // Store the source ids of the sources leaving the session - for (j=0; j<this->chd_.count_; j++) - { - this->ssrc_list_[j] = ntohl(*(ACE_UINT32*)&buffer[index]); - index+=4; - } - - // Optional - store the reason for leaving - unsigned int temp = this->chd_.length_; // Borland reports a warning on the - // following line with out this. - memset(this->reason_, 0, sizeof(this->reason_)); - if (temp > this->chd_.count_) - { - this->reason_length_ = buffer[index]; - index++; - memcpy(this->reason_, &buffer[index], this->reason_length_); - index+=this->reason_length_; - - } - else - this->reason_length_ = 0; - - // Decrement the length by the size of this message. This is necessary - // because multiple RTCP packets may be contained in a single UDP packet. - *len-=(chd_.length_+1)*4; - - this->packet_data_ = 0; -} - -//============================================================================== - -RTCP_BYE_Packet::~RTCP_BYE_Packet(void) -{ - if (this->ssrc_list_) - delete []this->ssrc_list_; - if (this->packet_data_) - delete []this->packet_data_; -} - -//============================================================================== - -unsigned int -RTCP_BYE_Packet::packet_size(void) -{ - ACE_UINT16 size = static_cast<ACE_UINT16> ((1+chd_.count_) * 4); - - if (this->reason_length_ > 0) - { - size += this->reason_length_ + 1; - if (size%4) - size += 4 - size%4; // pad with zeros to even 32 bit bound - } - - return size; -} - -//============================================================================== - -void -RTCP_BYE_Packet::ssrc_list(ACE_UINT32 **ssrc_list, unsigned char &length) -{ - *ssrc_list = this->ssrc_list_; - length = this->ssrc_list_length_; -} - -//============================================================================== - -const char * -RTCP_BYE_Packet::reason (void) -{ - ACE_CString reason = (const char *)this->reason_; - - return reason.c_str(); -} - -//============================================================================== - -void -RTCP_BYE_Packet::build_packet(void) -{ - unsigned int index; - unsigned int i; - - if (this->packet_data_) - delete []this->packet_data_; - - ACE_NEW (this->packet_data_, - char[this->packet_size()]); - - index = 0; - this->packet_data_[index] = static_cast<char> ((this->chd_.ver_ << 6) | - (this->chd_.pad_ << 5) | - this->chd_.count_); - index++; - this->packet_data_[index] = this->chd_.pt_; - index++; - *((ACE_UINT16*)&this->packet_data_[index]) = htons(this->chd_.length_); - index+=2; - - for (i=0; i<this->chd_.count_; i++) - { - *((ACE_UINT32*)&this->packet_data_[index]) = htonl(this->ssrc_list_[i]); - index+=4; - } - - if (this->reason_) - { - this->packet_data_[index] = this->reason_length_; - index++; - memcpy(&this->packet_data_[index], this->reason_, this->reason_length_); - index += this->reason_length_; - while (index < this->packet_size()) - { - this->packet_data_[index] = 0; - index ++; - } - } -} - -void -RTCP_BYE_Packet::dump (void) -{ - ACE_DEBUG ((LM_DEBUG, - "\nRTCP_BYE_Packet:: from ssrc(s) ")); - for (int i=0; i< this->ssrc_list_length_; i++) - ACE_DEBUG ((LM_DEBUG, - "%u ", - this->ssrc_list_[i])); - ACE_DEBUG ((LM_DEBUG, - "\n Reason '%s'\n", - this->reason_)); -} - -RTCP_RR_Packet::RTCP_RR_Packet(ACE_UINT32 ssrc, RR_Block *blocks) -{ - RR_Block *block_ptr = blocks; - - this->chd_.count_ = 0; - this->chd_.ver_ = 2; - this->chd_.pt_ = RTCP_PT_RR; - this->ssrc_ = ssrc; - this->rr_ = blocks; - - while (block_ptr) - { - this->chd_.count_++; - - // Can only have 31 receiver reports - if (this->chd_.count_ == 31) - { - block_ptr->next_ = 0; - break; - } - - block_ptr = block_ptr->next_; - } - - this->chd_.length_ = static_cast<ACE_UINT16> (1+6*(this->chd_.count_)); // + profile specific extensions ?? - - this->packet_data_ = 0; -} - -//============================================================================== - -RTCP_RR_Packet::RTCP_RR_Packet (char* buffer, - int *len) - :RTCP_Packet (buffer) -{ - unsigned int i = 0; - RR_Block *local_block_ptr = 0; - - this->rr_ = 0; - - // The common part of the header is initialized in the parent. - i=4; - this->ssrc_ = ntohl(*(ACE_UINT32*)&buffer[i]); - i+=4; - for (unsigned int j=0; j<this->chd_.count_; j++) - { - if (j==0) - { - ACE_NEW (this->rr_, - RR_Block); - local_block_ptr = this->rr_; - } - else - { - ACE_NEW (local_block_ptr->next_, - RR_Block); - local_block_ptr = local_block_ptr->next_; - } - - local_block_ptr->next_ = 0; - local_block_ptr->ssrc_ = ntohl(*(ACE_UINT32*)&buffer[i]); - i+=4; - ACE_UINT32 temp = ntohl(*(ACE_UINT32*)&buffer[i]); - local_block_ptr->fraction_ = (temp&0xff000000) >> 24; - local_block_ptr->lost_ = temp & 0x00ffffff; - i+=4; - local_block_ptr->last_seq_ = ntohl(*(ACE_UINT32*)&buffer[i]); - i+=4; - local_block_ptr->jitter_ = ntohl(*(ACE_UINT32*)&buffer[i]); - i+=4; - local_block_ptr->lsr_ = ntohl(*(ACE_UINT32*)&buffer[i]); - i+=4; - local_block_ptr->dlsr_ = ntohl(*(ACE_UINT32*)&buffer[i]); - i+=4; - } - - *len-=(this->chd_.length_+1)*4; - - this->packet_data_ = 0; -} - -//============================================================================== - -RTCP_RR_Packet::~RTCP_RR_Packet(void) -{ - RR_Block *prev; - - if (this->rr_) - { - while (this->rr_) - { - prev = this->rr_; - this->rr_ = this->rr_->next_; - delete prev; - } - } - - if (this->packet_data_) - delete []this->packet_data_; -} - -//============================================================================== - -unsigned int -RTCP_RR_Packet::packet_size(void) -{ - ACE_UINT16 size = static_cast<ACE_UINT16> ((2+this->chd_.count_*6) * 4); - return size; -} - -//============================================================================== - -void -RTCP_RR_Packet::build_packet(void) -{ - int index; - RR_Block *local_block_ptr; - - if (this->packet_data_) - delete []this->packet_data_; - - ACE_NEW (this->packet_data_, - char [this->packet_size ()]); - - index = 0; - this->packet_data_[index] = static_cast<char> ((this->chd_.ver_ << 6) | - (this->chd_.pad_ << 5) | - this->chd_.count_); - index++; - this->packet_data_[index] = chd_.pt_; - index++; - *((ACE_UINT16*)&this->packet_data_[index]) = htons(chd_.length_); - index+=2; - *((ACE_UINT32*)&this->packet_data_[index]) = htonl(this->ssrc_); - index+=4; - - local_block_ptr = this->rr_; - while (local_block_ptr) - { - *((ACE_UINT32*)&this->packet_data_[index]) = htonl(local_block_ptr->ssrc_); - index+=4; - ACE_UINT32 temp = htonl((local_block_ptr->fraction_&0xff) << 24) & - local_block_ptr->lost_; - *((ACE_UINT32*)&this->packet_data_[index]) = temp; - index+=4; - *((ACE_UINT32*)&this->packet_data_[index]) = htonl(local_block_ptr->last_seq_); - index+=4; - *((ACE_UINT32*)&this->packet_data_[index]) = htonl(local_block_ptr->jitter_); - index+=4; - *((ACE_UINT32*)&this->packet_data_[index]) = htonl(local_block_ptr->lsr_); - index+=4; - *((ACE_UINT32*)&this->packet_data_[index]) = htonl(local_block_ptr->dlsr_); - index+=4; - local_block_ptr = local_block_ptr->next_; - } -} - -void -RTCP_RR_Packet::dump (void) -{ - RR_Block *b = this->rr_; - int count = 1; - - ACE_DEBUG ((LM_DEBUG, - "\nRTCP_RR_Packet:: from %u - %d rr blocks follow.\n", - this->ssrc_, - this->chd_.count_)); - - while (b) - { - ACE_DEBUG ((LM_DEBUG, - " Block %d: ssrc %u; frac %u; lost %u; last seq %u\n", - count, - b->ssrc_, - b->fraction_, - b->lost_, - b->last_seq_)); - ACE_DEBUG ((LM_DEBUG, - " jitter %u; lsr %u; dlsr %u;\n", - b->jitter_, - b->lsr_, - b->dlsr_)); - - b = b->next_; - ++count; - } -} - - -RTCP_SDES_Packet::RTCP_SDES_Packet(void) : - RTCP_Packet () -{ - this->chd_.pt_ = RTCP_PT_SDES; - this->chunk_ = 0; - this->packet_data_ = 0; - this->num_chunks_ = 0; -// this->num_items_ = 0; -} - -//============================================================================== - -RTCP_SDES_Packet::RTCP_SDES_Packet(char* buffer, int *len): - RTCP_Packet (buffer) -{ - unsigned int i; - sdesChunk_t *cp = 0; // pointer to chunk - sdesItem_t *ip = 0; // pointer to item - - // The common part of the control packet header is processed - // in the parent. It is 4 bytes long. - - i=4; - for (unsigned int j=0; j<this->chd_.count_; j++) - { - if (j==0) - { - ACE_NEW (this->chunk_, - sdesChunk_t); - cp = this->chunk_; - - this->num_chunks_ = 1; - } - else - { - ACE_NEW (cp->next_, - sdesChunk_t); - cp = cp->next_; - - this->num_chunks_++; - } - cp->next_ = 0; - cp->item_ = 0; - cp->ssrc_ = ntohl(*(ACE_UINT32*)&buffer[i]); - i+=4; - - while (buffer[i]!=RTCP_SDES_END) - { - if (!cp->item_) - { - ACE_NEW (cp->item_, - sdesItem_t); - ip = cp->item_; - -// this->num_items_ = 1; - } - else - { - ACE_NEW (ip->next_, - sdesItem_t); - ip = ip->next_; - -// this->num_items_++; - } - ip->next_ = 0; - ip->type_ = buffer[i]; - i++; - if (ip->type_ != RTCP_SDES_PRIV) - { - ip->info_.standard_.length_ = buffer[i]; - i++; - ACE_NEW (ip->info_.standard_.data_, - char[ip->info_.standard_.length_+1]); - memcpy(ip->info_.standard_.data_, - &buffer[i], - ip->info_.standard_.length_); - ip->info_.standard_.data_[ip->info_.standard_.length_] = 0; - i+=ip->info_.standard_.length_; - } - else - { - ip->info_.priv_.name_length_ = buffer[i]; - i++; - ip->info_.priv_.data_length_ = buffer[i]; - i++; - ACE_NEW (ip->info_.priv_.name_, - char[ip->info_.priv_.name_length_+1]); - memcpy(ip->info_.priv_.name_, - &buffer[i], - ip->info_.priv_.name_length_); - ip->info_.priv_.name_[ip->info_.priv_.name_length_] = 0; - i+=ip->info_.priv_.name_length_; - ACE_NEW (ip->info_.priv_.data_, - char[ip->info_.priv_.data_length_+1]); - memcpy(ip->info_.priv_.data_, - &buffer[i], - ip->info_.priv_.data_length_); - ip->info_.priv_.data_[ip->info_.priv_.data_length_] = 0; - i+=ip->info_.priv_.data_length_; - } - } - i++; // each chunk ends with a zero (END) item - // each chunk must end on an even 32 bit boundary - while (i%4) i++; - } - - *len-=(this->chd_.length_+1)*4; - - this->packet_data_ = 0; -} - -//============================================================================== - -RTCP_SDES_Packet::~RTCP_SDES_Packet(void) -{ - sdesChunk_t *cp; // pointer to chunk - sdesChunk_t *cpprev; - sdesItem_t *ip; // pointer to item - sdesItem_t *ipprev; - - cp = this->chunk_; - while (cp) - { - ip = cp->item_; - while (ip) - { - ipprev = ip; - ip = ip->next_; - if (ipprev->type_ != RTCP_SDES_PRIV) - { - delete []ipprev->info_.standard_.data_; - } - else - { - delete []ipprev->info_.priv_.name_; - delete []ipprev->info_.priv_.data_; - } - - delete ipprev; - } - cpprev = cp; - cp = cp->next_; - delete cpprev; - } - - if (this->packet_data_) - delete []this->packet_data_; -} - -//============================================================================== - -void -RTCP_SDES_Packet::add_chunk(ACE_UINT32 ssrc) -{ - sdesChunk_t *cp = 0; // pointer to chunk - - // If this is the first chunk. - if (chd_.count_ == 0) - { - ACE_NEW (this->chunk_, - sdesChunk_t); - this->chunk_->next_ = 0; - this->chunk_->item_ = 0; - cp = this->chunk_; - } - else - { - cp = this->chunk_; - while (cp->next_) - cp = cp->next_; - - ACE_NEW (cp->next_, - sdesChunk_t); - cp = cp->next_; - cp->next_ = 0; - cp->item_ = 0; - } - cp->ssrc_ = ssrc; // store the source - chd_.count_++; // increment the source count -} - -//============================================================================== - -void -RTCP_SDES_Packet::add_item (ACE_UINT32 ssrc, - unsigned char type, - unsigned char length, - const char *data) -{ - sdesChunk_t *cp; // pointer to chunk - sdesItem_t *ip; // pointer to item - - if (this->chunk_ == 0) - { - this->add_chunk(ssrc); - } - - cp = this->chunk_; - - while (cp != 0) - { - if (cp->ssrc_ == ssrc) - { - break; - } - - if (!cp->next_) - { - this->add_chunk(ssrc); - cp = cp->next_; - break; - } - - cp = cp->next_; - } - - ip = cp->item_; - - if (ip == 0) - { - ACE_NEW (cp->item_, - sdesItem_t); - - ip = cp->item_; - ip->next_= 0; - } - else - { - while (ip->next_) - { - ip = ip->next_; - } - - ACE_NEW (ip->next_, - sdesItem_t); - - ip = ip->next_; - ip->next_ = 0; - } - - ip->type_ = type; - - ip->info_.standard_.length_ = length; - - ACE_NEW (ip->info_.standard_.data_, - char[length]); - - memcpy(ip->info_.standard_.data_, data, length); -} - -//============================================================================== - -void -RTCP_SDES_Packet::add_priv_item (ACE_UINT32 ssrc, - unsigned char nameLength, - const char* name, - unsigned char dataLength, - const char* data) -{ - sdesChunk_t *cp; // pointer to chunk - sdesItem_t *ip; // pointer to item - - if (this->chunk_ == 0) - { - this->add_chunk(ssrc); - } - - cp = this->chunk_; - - while (cp != 0) - { - if (cp->ssrc_ == ssrc) - { - break; - } - - if (!cp->next_) - { - this->add_chunk(ssrc); - cp = cp->next_; - break; - } - - cp = cp->next_; - } - - ip = cp->item_; - - if (ip == 0) - { - ACE_NEW (cp->item_, - sdesItem_t); - - ip = cp->item_; - ip->next_ = 0; - } - else - { - while (ip->next_) - { - ip = ip->next_; - } - - ACE_NEW (ip->next_, - sdesItem_t); - - ip = ip->next_; - ip->next_ = 0; - } - - ip->type_ = RTCP_SDES_PRIV; - - ip->info_.priv_.name_length_ = nameLength; - ip->info_.priv_.data_length_ = dataLength; - - ACE_NEW (ip->info_.priv_.name_, - char[nameLength]); - - ACE_NEW (ip->info_.priv_.data_, - char[dataLength]); - - memcpy(ip->info_.priv_.name_, name, nameLength); - memcpy(ip->info_.priv_.data_, data, dataLength); -} - -//============================================================================== - -unsigned int -RTCP_SDES_Packet::packet_size(void) -{ - int size; - sdesChunk_t *cp; // pointer to chunk - sdesItem_t *ip; // pointer to item - - // Determine the size of the packet. - size = 4; // size of common header data in octets - - cp = this->chunk_; - while (cp) - { - size += 4; // size of ssrc - ip = cp->item_; - - while (ip && (ip->type_ != 0)) - { - if (ip->type_ != RTCP_SDES_PRIV) - { - size += 2 + ip->info_.standard_.length_; // size of item - } - else - { - size += 3 + ip->info_.priv_.name_length_ + ip->info_.priv_.data_length_; - } - ip = ip->next_; - } - size += 4 - size%4; // pad with zeros to even 32 bit bound - cp = cp->next_; - } - - chd_.length_ = static_cast<ACE_UINT16> (size/4 - 1); - - return size; -} - -//============================================================================== - -void -RTCP_SDES_Packet::build_packet(void) -{ - sdesChunk_t *cp; // pointer to chunk - sdesItem_t *ip; // pointer to item - int index, i; - - if (this->packet_data_) - delete this->packet_data_; - - ACE_NEW (this->packet_data_, - char[this->packet_size()]); - - index = 0; - this->packet_data_[index] = static_cast<char> ((chd_.ver_ << 6) | - (chd_.pad_ << 5) | - chd_.count_); - index++; - this->packet_data_[index] = chd_.pt_; - index++; - *((ACE_UINT16*)&this->packet_data_[index]) = htons(chd_.length_); - index+=2; - - cp = this->chunk_; - while (cp) - { - *((ACE_UINT32*)&this->packet_data_[index]) = htonl(cp->ssrc_); - index+=4; - - ip = cp->item_; - while (ip && (ip->type_ != 0)) - { - this->packet_data_[index] = ip->type_; - index++; - if (ip->type_ != RTCP_SDES_PRIV) - { - this->packet_data_[index] = ip->info_.standard_.length_; - index++; - for (i=0; i<ip->info_.standard_.length_; i++) - { - this->packet_data_[index] = ip->info_.standard_.data_[i]; - index++; - } - } - else - { - this->packet_data_[index] = ip->info_.priv_.name_length_; - index++; - this->packet_data_[index] = ip->info_.priv_.data_length_; - index++; - for (i=0; i<ip->info_.priv_.name_length_; i++) - { - this->packet_data_[index] = ip->info_.priv_.name_[i]; - index++; - } - for (i=0; i<ip->info_.priv_.data_length_; i++) - { - this->packet_data_[index] = ip->info_.priv_.data_[i]; - index++; - } - } - - ip = ip->next_; - } - - this->packet_data_[index] = 0; - index++; - - i=1; - while ((index)%4) - { // pad chunk with zeros to 32 bit bound - this->packet_data_[index] = 0; - index++; - i++; - } - - // Store the number of bytes added. TODO: do we need this - // this->packet_data_[index - 1] = i; - - cp = cp->next_; - } -} - -void -RTCP_SDES_Packet::dump (void) -{ - sdesItem_t *ip; - - ACE_DEBUG ((LM_DEBUG, - "\nRTCP_SDES_Packet:: ")); - - if (this->num_chunks_ != 1) - { - ACE_DEBUG ((LM_DEBUG, - "Mixers not currently supported.\n")); - return; - } - - ACE_DEBUG ((LM_DEBUG, - "from ssrc %u\n", - this->chunk_->ssrc_)); - - // Loop through all of the items. - ip = this->chunk_->item_; - - while (ip) - { - // If there is no data to store, continue. - if (ip->info_.standard_.length_ == 0) - { - ip = ip->next_; - continue; - } - - switch (ip->type_) - { - case RTCP_SDES_END: - break; - case RTCP_SDES_CNAME: - ACE_DEBUG ((LM_DEBUG, - " CNAME '%s'\n", - ip->info_.standard_.data_)); - break; - case RTCP_SDES_NAME: - ACE_DEBUG ((LM_DEBUG, - " NAME '%s'\n", - ip->info_.standard_.data_)); - break; - case RTCP_SDES_EMAIL: - ACE_DEBUG ((LM_DEBUG, - " EMAIL '%s'\n", - ip->info_.standard_.data_)); - break; - case RTCP_SDES_PHONE: - ACE_DEBUG ((LM_DEBUG, - " PHONE '%s'\n", - ip->info_.standard_.data_)); - break; - case RTCP_SDES_LOC: - ACE_DEBUG ((LM_DEBUG, - " LOC '%s'\n", - ip->info_.standard_.data_)); - break; - case RTCP_SDES_TOOL: - ACE_DEBUG ((LM_DEBUG, - " TOOL '%s'\n", - ip->info_.standard_.data_)); - break; - case RTCP_SDES_NOTE: - ACE_DEBUG ((LM_DEBUG, - " NOTE '%s'\n", - ip->info_.standard_.data_)); - break; - case RTCP_SDES_PRIV: - ACE_DEBUG ((LM_DEBUG, - " '%s' '%s'\n", - ip->info_.priv_.name_, - ip->info_.priv_.data_)); - break; - } - ip = ip->next_; - } - -} - -RTCP_SR_Packet::RTCP_SR_Packet(ACE_UINT32 ssrc, - ACE_UINT32 ntp_ts_msw, - ACE_UINT32 ntp_ts_lsw, - ACE_UINT32 timestamp, - ACE_UINT32 packets_sent, - ACE_UINT32 octets_sent, - RR_Block *blocks) -{ - RR_Block *block_ptr= 0; - chd_.count_ = 0; - chd_.ver_ = 2; - chd_.pt_ = RTCP_PT_SR; - - this->ssrc_ = ssrc; - this->ntp_ts_msw_ = ntp_ts_msw; - this->ntp_ts_lsw_ = ntp_ts_lsw; - this->rtp_ts_ = timestamp; - this->psent_ = packets_sent; - this->osent_ = octets_sent; - this->rr_ = blocks; - - block_ptr = blocks; - - while (block_ptr) - { - chd_.count_++; - - // Can only have 31 receiver reports - if (this->chd_.count_ == 31) - { - block_ptr->next_ = 0; - break; - } - - block_ptr = block_ptr->next_; - } - - this->chd_.length_ = static_cast<ACE_UINT16> (6 + 6*(chd_.count_)); //+profile specific extensions ?? - - this->packet_data_ = 0; -} - -//============================================================================== - -RTCP_SR_Packet::RTCP_SR_Packet (char* buffer, - int *len) - : RTCP_Packet (buffer) -{ - unsigned int i = 0; - RR_Block *local_block_ptr = 0; - - this->rr_ = 0; - - // The common part of the header is initialized in the parent. - i=4; - this->ssrc_ = ntohl(*(ACE_UINT32*)&buffer[i]); - i+=4; - this->ntp_ts_msw_ = ntohl(*(ACE_UINT32*)&buffer[i]); - i+=4; - this->ntp_ts_lsw_ = ntohl(*(ACE_UINT32*)&buffer[i]); - i+=4; - this->rtp_ts_ = ntohl(*(ACE_UINT32*)&buffer[i]); - i+=4; - this->psent_ = ntohl(*(ACE_UINT32*)&buffer[i]); - i+=4; - this->osent_ = ntohl(*(ACE_UINT32*)&buffer[i]); - i+=4; - for (unsigned int j=0; j<this->chd_.count_; j++) - { - if (j==0) - { - ACE_NEW (local_block_ptr, - RR_Block); - this->rr_ = local_block_ptr; - } - else - { - ACE_NEW (local_block_ptr->next_, - RR_Block); - local_block_ptr = local_block_ptr->next_; - } - - local_block_ptr->next_ = 0; - local_block_ptr->ssrc_ = ntohl(*(ACE_UINT32*)&buffer[i]); - i+=4; - ACE_UINT32 temp = ntohl(*(ACE_UINT32*)&buffer[i]); - local_block_ptr->fraction_ = (temp&0xff000000) >> 24; - local_block_ptr->lost_ = temp & 0x00ffffff; - i+=4; - local_block_ptr->last_seq_ = ntohl(*(ACE_UINT32*)&buffer[i]); - i+=4; - local_block_ptr->jitter_ = ntohl(*(ACE_UINT32*)&buffer[i]); - i+=4; - local_block_ptr->lsr_ = ntohl(*(ACE_UINT32*)&buffer[i]); - i+=4; - local_block_ptr->dlsr_ = ntohl(*(ACE_UINT32*)&buffer[i]); - i+=4; - } - - *len-=(this->chd_.length_+1)*4; - - this->packet_data_ = 0; -} - -//============================================================================== - -RTCP_SR_Packet::~RTCP_SR_Packet(void) -{ - RR_Block *prev; - - if (this->rr_) - { - while (this->rr_) - { - prev = this->rr_; - this->rr_ = this->rr_->next_; - delete prev; - } - } - - if (this->packet_data_) - delete []this->packet_data_; -} - -//============================================================================== - -unsigned int RTCP_SR_Packet::packet_size (void) -{ - ACE_UINT16 size = static_cast<ACE_UINT16> ((2+chd_.count_*6) * 4); // + profile specific extensions ? - size += 20; // the first line is the same as RR; 20 more bytes for SR - - return size; -} - -//============================================================================== - -void RTCP_SR_Packet::build_packet(void) -{ - int index = 0; - RR_Block *local_block_ptr; - - if (this->packet_data_) - delete []this->packet_data_; - - ACE_NEW (this->packet_data_, - char[this->packet_size()]); - - this->packet_data_[index] = static_cast<char> ((this->chd_.ver_ << 6) | - (this->chd_.pad_ << 5) | - this->chd_.count_); - index++; - this->packet_data_[index] = this->chd_.pt_; - index++; - *((ACE_UINT16*)&this->packet_data_[index]) = htons(this->chd_.length_); - index+=2; - *((ACE_UINT32*)&this->packet_data_[index]) = htonl(this->ssrc_); - index+=4; - *((ACE_UINT32*)&this->packet_data_[index]) = htonl(this->ntp_ts_msw_); - index+=4; - *((ACE_UINT32*)&this->packet_data_[index]) = htonl(this->ntp_ts_lsw_); - index+=4; - *((ACE_UINT32*)&this->packet_data_[index]) = htonl(this->rtp_ts_); - index+=4; - *((ACE_UINT32*)&this->packet_data_[index]) = htonl(this->psent_); - index+=4; - *((ACE_UINT32*)&this->packet_data_[index]) = htonl(this->osent_); - index+=4; - - local_block_ptr = this->rr_; - while (local_block_ptr) - { - *((ACE_UINT32*)&this->packet_data_[index]) = htonl(local_block_ptr->ssrc_); - index+=4; - ACE_UINT32 temp = htonl((local_block_ptr->fraction_&0xff) << 24) & - local_block_ptr->lost_; - *((ACE_UINT32*)&this->packet_data_[index]) = temp; - index+=4; - *((ACE_UINT32*)&this->packet_data_[index]) = htonl(local_block_ptr->last_seq_); - index+=4; - *((ACE_UINT32*)&this->packet_data_[index]) = htonl(local_block_ptr->jitter_); - index+=4; - *((ACE_UINT32*)&this->packet_data_[index]) = htonl(local_block_ptr->lsr_); - index+=4; - *((ACE_UINT32*)&this->packet_data_[index]) = htonl(local_block_ptr->dlsr_); - index+=4; - local_block_ptr = local_block_ptr->next_; - } -} - -void -RTCP_SR_Packet::dump (void) -{ - RR_Block *b = this->rr_; - int count = 1; - - ACE_DEBUG ((LM_DEBUG, - "\nRTCP_SR_Packet:: from %u - %d rr blocks follow.\n", - this->ssrc_, - this->chd_.count_)); - ACE_DEBUG ((LM_DEBUG, - " NTP(sec) %u.%u; RTP ts %u\n", - this->ntp_ts_msw_, - this->ntp_ts_lsw_, - this->rtp_ts_)); - ACE_DEBUG ((LM_DEBUG, - " packets sent %u; octets sent %u\n", - this->psent_, - this->osent_)); - - while (b) - { - ACE_DEBUG ((LM_DEBUG, - " Block %d: ssrc %u; frac %u; lost %u; last seq %u\n", - count, - b->ssrc_, - b->fraction_, - b->lost_, - b->last_seq_)); - ACE_DEBUG ((LM_DEBUG, - " jitter %u; lsr %u; dlsr %u;\n", - b->jitter_, - b->lsr_, - b->dlsr_)); - - b = b->next_; - ++count; - } -} - -TAO_END_VERSIONED_NAMESPACE_DECL |