예제 #1
0
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);
  }
}
예제 #2
0
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;
}