OnReceiveNack
ReSendPacket

这里是先将要发送的packet添加到队列中,然后后面再经过网络发送出去。
int32_t RTPSender::ReSendPacket(uint16_t packet_id) {// Try to find packet in RTP packet history. Also verify RTT here, so that we// don't retransmit too often.absl::optional<RtpPacketHistory::PacketState> stored_packet =packet_history_->GetPacketState(packet_id);if (!stored_packet || stored_packet->pending_transmission) {// Packet not found or already queued for retransmission, ignore.return 0;}const int32_t packet_size = static_cast<int32_t>(stored_packet->packet_size);const bool rtx = (RtxStatus() & kRtxRetransmitted) > 0;std::unique_ptr<RtpPacketToSend> packet =packet_history_->GetPacketAndMarkAsPending(packet_id, [&](const RtpPacketToSend& stored_packet) {// Check if we're overusing retransmission bitrate.// TODO(sprang): Add histograms for nack success or failure// reasons.std::unique_ptr<RtpPacketToSend> retransmit_packet;if (retransmission_rate_limiter_ &&!retransmission_rate_limiter_->TryUseRate(packet_size)) {return retransmit_packet;}// 如果开启rtx,则构建rtx包if (rtx) {retransmit_packet = BuildRtxPacket(stored_packet);} else {retransmit_packet =std::make_unique<RtpPacketToSend>(stored_packet);}if (retransmit_packet) {retransmit_packet->set_retransmitted_sequence_number(stored_packet.SequenceNumber());}return retransmit_packet;});if (!packet) {return -1;}packet->set_packet_type(RtpPacketMediaType::kRetransmission);packet->set_fec_protect_packet(false);std::vector<std::unique_ptr<RtpPacketToSend>> packets;packets.emplace_back(std::move(packet));paced_sender_->EnqueuePackets(std::move(packets));return packet_size;}
这里调用了GetPacketAndMarkAsPending,里面用了匿名函数。
GetPacketAndMarkAsPending
std::unique_ptr<RtpPacketToSend> RtpPacketHistory::GetPacketAndMarkAsPending(uint16_t sequence_number,rtc::FunctionView<std::unique_ptr<RtpPacketToSend>(const RtpPacketToSend&)>encapsulate) {MutexLock lock(&lock_);if (mode_ == StorageMode::kDisabled) {return nullptr;}StoredPacket* packet = GetStoredPacket(sequence_number);if (packet == nullptr) {return nullptr;}if (packet->pending_transmission_) {// Packet already in pacer queue, ignore this request.return nullptr;}if (!VerifyRtt(*packet, clock_->TimeInMilliseconds())) {// Packet already resent within too short a time window, ignore.return nullptr;}// Copy and/or encapsulate packet.std::unique_ptr<RtpPacketToSend> encapsulated_packet =encapsulate(*packet->packet_);if (encapsulated_packet) {packet->pending_transmission_ = true;}return encapsulated_packet;}
SetRtxStatus调用栈


