// TODO(eladalon): Consider using packet.recovered() to avoid processing // recovered packets here. std::unique_ptrForwardErrorCorrection::ReceivedPacket FlexfecReceiver::AddReceivedPacket(const RtpPacketReceived& packet) { RTC_DCHECK_RUN_ON(&sequence_checker_); // RTP packets with a full base header (12 bytes), but without payload, // could conceivably be useful in the decoding. Therefore we check // with a non-strict inequality here. RTC_DCHECK_GE(packet.size(), kRtpHeaderSize); // Demultiplex based on SSRC, and insert into erasure code decoder. std::unique_ptrForwardErrorCorrection::ReceivedPacket received_packet( new ForwardErrorCorrection::ReceivedPacket()); received_packet->seq_num = packet.SequenceNumber(); received_packet->ssrc = packet.Ssrc(); if (received_packet->ssrc == ssrc_) { // This is a FlexFEC packet. if (packet.payload_size() < kMinFlexfecHeaderSize) { RTC_LOG(LS_WARNING) << "Truncated FlexFEC packet, discarding."; return nullptr; } received_packet->is_fec = true; ++packet_counter_.num_fec_packets; // Insert packet payload into erasure code. received_packet->pkt = rtc::scoped_refptr<ForwardErrorCorrection::Packet>( new ForwardErrorCorrection::Packet()); received_packet->pkt->data = packet.Buffer().Slice(packet.headers_size(), packet.payload_size()); } else { // This is a media packet, or a FlexFEC packet belonging to some // other FlexFEC stream. if (received_packet->ssrc != protected_media_ssrc_) { return nullptr; } received_packet->is_fec = false; // Insert entire packet into erasure code. // Create a copy and fill with zeros all mutable extensions. received_packet->pkt = rtc::scoped_refptr<ForwardErrorCorrection::Packet>( new ForwardErrorCorrection::Packet()); RtpPacketReceived packet_copy(packet); packet_copy.ZeroMutableExtensions(); received_packet->pkt->data = packet_copy.Buffer(); } ++packet_counter_.num_packets; return received_packet; } 各行意义
时间: 2024-04-22 19:25:21 浏览: 118
这段代码是一个FlexfecReceiver类的AddReceivedPacket函数的实现。下面是各行代码的意义解释:
- 第2行:对函数进行线程检查,确保该函数在正确的线程上执行。
- 第5行:使用非严格不等式检查数据包的大小是否大于等于RTP头部的大小。
- 第8行:创建一个std::unique_ptr<ForwardErrorCorrection::ReceivedPacket>类型的指针received_packet,并分配内存。
- 第9行:将数据包的序列号赋值给received_packet的seq_num成员变量。
- 第10行:将数据包的SSRC赋值给received_packet的ssrc成员变量。
- 第11行:如果received_packet的ssrc和当前接收器的ssrc相等,则表示这是一个FlexFEC数据包。
- 第12行:检查数据包的有效负载大小是否满足最小Flexfec头部大小的要求,如果小于要求则打印警告信息并返回空指针。
- 第14行:设置received_packet的is_fec成员变量为true,表示这是一个FlexFEC数据包。
- 第15行:增加FlexFEC数据包计数器的数量。
- 第18行:为received_packet创建一个rtc::scoped_refptr<ForwardErrorCorrection::Packet>类型的指针pkt,并分配内存。
- 第19行:将数据包的有效负载切片(Slice)并赋值给pkt的data成员变量。
- 第22行:如果received_packet的ssrc和受保护的媒体SSRC不相等,则表示这是一个媒体数据包或属于其他FlexFEC流的FlexFEC数据包,返回空指针。
- 第24行:设置received_packet的is_fec成员变量为false,表示这是一个媒体数据包。
- 第27行:为received_packet创建一个rtc::scoped_refptr<ForwardErrorCorrection::Packet>类型的指针pkt,并分配内存。
- 第28行:创建数据包的副本packet_copy,并将可变扩展填充为零。
- 第29行:将packet_copy的缓冲区赋值给pkt的data成员变量。
- 第32行:增加数据包计数器的数量。
- 第35行:返回指向received_packet的std::unique_ptr<ForwardErrorCorrection::ReceivedPacket>类型的指针。
请注意,这段代码可能是从某个具体的项目或库中提取出来的,因此其中可能存在一些特定于该项目或库的定义和依赖项。
阅读全文
相关推荐


















