void RRGenerationHandler::handleSR(std::shared_ptr<dataPacket> packet) { RtcpHeader *chead = reinterpret_cast<RtcpHeader*>(packet->data); auto rr_packet_pair = rr_info_map_.find(chead->getSSRC()); if (rr_packet_pair == rr_info_map_.end()) { ELOG_DEBUG("%s message: handleRtpPacket ssrc not found, ssrc: %u", connection_->toLog(), chead->getSSRC()); return; } std::shared_ptr<RRPackets> selected_packet_info = rr_packet_pair->second; selected_packet_info->last_sr_mid_ntp = chead->get32MiddleNtp(); selected_packet_info->last_sr_ts = packet->received_time_ms; uint32_t expected = selected_packet_info->extended_seq - selected_packet_info->base_seq + 1; selected_packet_info->lost = expected - selected_packet_info->packets_received; uint8_t fraction = 0; uint32_t expected_interval = expected - selected_packet_info->expected_prior; selected_packet_info->expected_prior = expected; uint32_t received_interval = selected_packet_info->packets_received - selected_packet_info->received_prior; selected_packet_info->received_prior = selected_packet_info->packets_received; uint32_t lost_interval = expected_interval - received_interval; if (expected_interval != 0 && lost_interval > 0) { fraction = (lost_interval << 8) / expected_interval; } selected_packet_info->frac_lost = fraction; if (!use_timing_) { sendRR(selected_packet_info); } }
void RtcpRrGenerator::handleSr(std::shared_ptr<dataPacket> packet) { RtcpHeader* chead = reinterpret_cast<RtcpHeader*>(packet->data); if (ssrc_ != chead->getSSRC()) { ELOG_DEBUG("message: handleRtpPacket ssrc not found, ssrc: %u", chead->getSSRC()); return; } rr_info_.last_sr_mid_ntp = chead->get32MiddleNtp(); rr_info_.last_sr_ts = packet->received_time_ms; }