image.png

OnReceiveNack

实现数据包的重传。
image.png

ReSendPacket

image.png
这里是先将要发送的packet添加到队列中,然后后面再经过网络发送出去。
image.png

  1. int32_t RTPSender::ReSendPacket(uint16_t packet_id) {
  2. // Try to find packet in RTP packet history. Also verify RTT here, so that we
  3. // don't retransmit too often.
  4. absl::optional<RtpPacketHistory::PacketState> stored_packet =
  5. packet_history_->GetPacketState(packet_id);
  6. if (!stored_packet || stored_packet->pending_transmission) {
  7. // Packet not found or already queued for retransmission, ignore.
  8. return 0;
  9. }
  10. const int32_t packet_size = static_cast<int32_t>(stored_packet->packet_size);
  11. const bool rtx = (RtxStatus() & kRtxRetransmitted) > 0;
  12. std::unique_ptr<RtpPacketToSend> packet =
  13. packet_history_->GetPacketAndMarkAsPending(
  14. packet_id, [&](const RtpPacketToSend& stored_packet) {
  15. // Check if we're overusing retransmission bitrate.
  16. // TODO(sprang): Add histograms for nack success or failure
  17. // reasons.
  18. std::unique_ptr<RtpPacketToSend> retransmit_packet;
  19. if (retransmission_rate_limiter_ &&
  20. !retransmission_rate_limiter_->TryUseRate(packet_size)) {
  21. return retransmit_packet;
  22. }
  23. // 如果开启rtx,则构建rtx包
  24. if (rtx) {
  25. retransmit_packet = BuildRtxPacket(stored_packet);
  26. } else {
  27. retransmit_packet =
  28. std::make_unique<RtpPacketToSend>(stored_packet);
  29. }
  30. if (retransmit_packet) {
  31. retransmit_packet->set_retransmitted_sequence_number(
  32. stored_packet.SequenceNumber());
  33. }
  34. return retransmit_packet;
  35. });
  36. if (!packet) {
  37. return -1;
  38. }
  39. packet->set_packet_type(RtpPacketMediaType::kRetransmission);
  40. packet->set_fec_protect_packet(false);
  41. std::vector<std::unique_ptr<RtpPacketToSend>> packets;
  42. packets.emplace_back(std::move(packet));
  43. paced_sender_->EnqueuePackets(std::move(packets));
  44. return packet_size;
  45. }

这里调用了GetPacketAndMarkAsPending,里面用了匿名函数。

GetPacketAndMarkAsPending

  1. std::unique_ptr<RtpPacketToSend> RtpPacketHistory::GetPacketAndMarkAsPending(
  2. uint16_t sequence_number,
  3. rtc::FunctionView<std::unique_ptr<RtpPacketToSend>(const RtpPacketToSend&)>
  4. encapsulate) {
  5. MutexLock lock(&lock_);
  6. if (mode_ == StorageMode::kDisabled) {
  7. return nullptr;
  8. }
  9. StoredPacket* packet = GetStoredPacket(sequence_number);
  10. if (packet == nullptr) {
  11. return nullptr;
  12. }
  13. if (packet->pending_transmission_) {
  14. // Packet already in pacer queue, ignore this request.
  15. return nullptr;
  16. }
  17. if (!VerifyRtt(*packet, clock_->TimeInMilliseconds())) {
  18. // Packet already resent within too short a time window, ignore.
  19. return nullptr;
  20. }
  21. // Copy and/or encapsulate packet.
  22. std::unique_ptr<RtpPacketToSend> encapsulated_packet =
  23. encapsulate(*packet->packet_);
  24. if (encapsulated_packet) {
  25. packet->pending_transmission_ = true;
  26. }
  27. return encapsulated_packet;
  28. }

SetRtxStatus调用栈

image.png
image.png