{"id":528,"date":"2022-03-09T21:48:49","date_gmt":"2022-03-09T13:48:49","guid":{"rendered":"https:\/\/www.fanyamin.com\/wordpress\/?p=528"},"modified":"2022-03-09T22:44:51","modified_gmt":"2022-03-09T14:44:51","slug":"%e4%bc%a0%e8%be%93%e5%b1%82%e7%9a%84%e5%8f%8d%e9%a6%88-transportpacketsfeedback","status":"publish","type":"post","link":"https:\/\/www.fanyamin.com\/wordpress\/?p=528","title":{"rendered":"WebRTC \u6e90\u7801\u9605\u8bfb\u7b14\u8bb0\u4e4b\u4f20\u8f93\u5c42\u53cd\u9988 TransportPacketsFeedback"},"content":{"rendered":"<h1>TransportPacketsFeedback<\/h1>\n<p>\u53d1\u9001\u65b9\u5c06\u81ea\u5df1\u4fdd\u5b58\u7684\u5305\u4fe1\u606f\u7ed3\u5408\u63a5\u6536\u65b9\u53cd\u9988\u7684\u63a5\u6536\u6d88\u606f<\/p>\n<pre><code class=\"language-cpp\">struct TransportPacketsFeedback {\n  TransportPacketsFeedback();\n  TransportPacketsFeedback(const TransportPacketsFeedback&amp; other);\n  ~TransportPacketsFeedback();\n  \/\/\u53cd\u9988\u7684\u65f6\u95f4\n  Timestamp feedback_time = Timestamp::PlusInfinity();\n  \/\/\u7b2c\u4e00\u4e2a\u6ca1\u6709\u54cd\u5e94\u7684\u5305\u7684\u53d1\u9001\u65f6\u95f4\n  Timestamp first_unacked_send_time = Timestamp::PlusInfinity();\n  \/\/\u53d1\u9001\u8fc7\u7684\u6570\u636e\u5305\u5927\u5c0f\n  DataSize data_in_flight = DataSize::Zero();\n  \/\/\u5148\u524d\u53d1\u9001\u8fc7\u7684\u6570\u636e\u5305\u5927\u5c0f\n  DataSize prior_in_flight = DataSize::Zero();\n  \/\/\u53cd\u9988\u7684\u6570\u636e\u5305\u63a5\u6536\u7ed3\u679c\n  std::vector&lt;PacketResult&gt; packet_feedbacks;\n\n  \/\/ Arrival times for messages without send time information.\n  std::vector&lt;Timestamp&gt; sendless_arrival_times;\n  \/\/\u5c06\u4e0a\u8ff0\u7684\u53cd\u9988\u7ed3\u679c\u8fdb\u884c\u5206\u7c7b\n  std::vector&lt;PacketResult&gt; ReceivedWithSendInfo() const;\n  std::vector&lt;PacketResult&gt; LostWithSendInfo() const;\n  std::vector&lt;PacketResult&gt; PacketsWithFeedback() const;\n  std::vector&lt;PacketResult&gt; SortedByReceiveTime() const;\n};<\/code><\/pre>\n<h1>PacketResult<\/h1>\n<pre><code>struct PacketResult {\n  class ReceiveTimeOrder {\n   public:\n    bool operator()(const PacketResult&amp; lhs, const PacketResult&amp; rhs);\n  };\n\n  PacketResult();\n  PacketResult(const PacketResult&amp;);\n  ~PacketResult();\n\n  inline bool IsReceived() const { return !receive_time.IsPlusInfinity(); }\n  \/\/\u53d1\u9001\u7684\u5305\n  SentPacket sent_packet;\n  \/\/\u63a5\u6536\u7684\u65f6\u95f4\n  Timestamp receive_time = Timestamp::PlusInfinity();\n};<\/code><\/pre>\n<h1>SendPacket<\/h1>\n<pre><code class=\"language-cpp\">\nstruct SentPacket {\n  Timestamp send_time = Timestamp::PlusInfinity();\n  \/\/ Size of packet with overhead up to IP layer.\n  \/\/ \u6570\u636e\u5305\u5927\u5c0f,\u4e0d\u5305\u62ec IP \u5305\u5934\n  DataSize size = DataSize::Zero();\n  \/\/ Size of preceeding packets that are not part of feedback.\n  \/\/ \u4e0d\u5728\u53cd\u9988\u6d88\u606f\u5185\u7684\u5148\u524d\u672a\u54cd\u5e94\u7684\u5305\u7684\u5927\u5c0f\n  DataSize prior_unacked_data = DataSize::Zero();\n  \/\/ Probe cluster id and parameters including bitrate, number of packets and\n  \/\/ number of bytes.\n  \/\/ \u63a2\u6d4b\u96c6\u7fa4 id \u548c\u53c2\u6570,\u5305\u62ec\u6bd4\u7279\u7387, \u5305\u7684\u4e2a\u6570\u548c\u5b57\u8282\u6570\n  PacedPacketInfo pacing_info;\n  \/\/ True if the packet is an audio packet, false for video, padding, RTX etc.\n  \/\/ \u662f\u5426\u662f\u4e00\u4e2a\u97f3\u9891\u5305\n  bool audio = false;\n  \/\/ Transport independent sequence number, any tracked packet should have a\n  \/\/ sequence number that is unique over the whole call and increasing by 1 for\n  \/\/ each packet.\n  \/\/ \u4f20\u8f93\u5c42\u7684\u5e8f\u53f7, \u5728\u8fd9\u4e2a\u4f20\u8f93\u901a\u9053\u4e0a\u7684\u5305\u5355\u8c03\u589e\u957f\n  int64_t sequence_number;\n  \/\/ \u8ddf\u8e2a\u7684\u53d1\u9001\u8fc7\u7684\u5305\u5927\u5c0f, \u4e0d\u5305\u62ec\u672a\u786e\u8ba4(\u672a\u6536\u5230)\u7684\u5305\n  \/\/ Tracked data in flight when the packet was sent, excluding unacked data.\n  DataSize data_in_flight = DataSize::Zero();\n};<\/code><\/pre>\n<h2>PacedPacketInfo<\/h2>\n<p>\u6b65\u8fdb\u5305\u4fe1\u606f<\/p>\n<pre><code>\nstruct PacedPacketInfo {\n  PacedPacketInfo();\n  PacedPacketInfo(int probe_cluster_id,\n                  int probe_cluster_min_probes,\n                  int probe_cluster_min_bytes);\n\n  bool operator==(const PacedPacketInfo&amp; rhs) const;\n\n  \/\/ TODO(srte): Move probing info to a separate, optional struct.\n  \/\/\u5982\u679c\u4e0d\u662f\u63a2\u6d4b\u5305,probe_cluster_id = -1\n  static constexpr int kNotAProbe = -1;\n  \/\/\u53d1\u9001\u7684\u6bd4\u7279\u7387\n  int send_bitrate_bps = -1;\n  \/\/\u63a2\u6d4b\u5305\u7fa4\u53f7\n  int probe_cluster_id = kNotAProbe;\n  \/\/\u63a2\u6d4b\u5305\u7fa4\u6700\u5c0f\u7684\u63a2\u6d4b\u4e2a\u6570\n  int probe_cluster_min_probes = -1;\n  \/\/\u63a2\u6d4b\u5305\u7fa4\u6700\u5c0f\u7684\u5b57\u8282\u6570\n  int probe_cluster_min_bytes = -1;\n  \/\/\u63a2\u6d4b\u5305\u7fa4\u5df2\u53d1\u9001\u7684\u7684\u63a2\u6d4b\u5b57\u8282\u6570\n  int probe_cluster_bytes_sent = 0;\n};<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>TransportPacketsFeedback \u53d1\u9001\u65b9\u5c06\u81ea\u5df1\u4fdd\u5b58\u7684\u5305\u4fe1\u606f\u7ed3\u5408\u63a5\u6536\u65b9\u53cd\u9988\u7684\u63a5\u6536\u6d88\u606f struct TransportPacketsFeedback { TransportPacketsFeedback(); TransportPacketsFeedback(const TransportPacketsFeedback&amp; other); ~TransportPacketsFeedback(); \/\/\u53cd\u9988\u7684\u65f6\u95f4 Timestamp feedback_time = Timestamp::PlusInfinity(); \/\/\u7b2c\u4e00\u4e2a\u6ca1\u6709\u54cd\u5e94\u7684\u5305\u7684\u53d1\u9001\u65f6\u95f4 Timestamp first_unacked_send_time = Timestamp::PlusInfinity(); \/\/\u53d1\u9001\u8fc7\u7684\u6570\u636e\u5305\u5927\u5c0f DataSize data_in_flight = DataSize::Zero(); \/\/\u5148\u524d\u53d1\u9001\u8fc7\u7684\u6570\u636e\u5305\u5927\u5c0f DataSize prior_in_flight = DataSize::Zero(); \/\/\u53cd\u9988\u7684\u6570\u636e\u5305\u63a5\u6536\u7ed3\u679c std::vector&lt;PacketResult&gt; packet_feedbacks; \/\/ Arrival times for messages without send time information. std::vector&lt;Timestamp&gt; sendless_arrival_times; \/\/\u5c06\u4e0a\u8ff0\u7684\u53cd\u9988\u7ed3\u679c\u8fdb\u884c\u5206\u7c7b std::vector&lt;PacketResult&gt; ReceivedWithSendInfo() const; std::vector&lt;PacketResult&gt; LostWithSendInfo() const; std::vector&lt;PacketResult&gt; PacketsWithFeedback() const; std::vector&lt;PacketResult&gt; [&hellip;] <a class=\"read-more\" href=\"https:\/\/www.fanyamin.com\/wordpress\/?p=528\" title=\"Permanent Link to: WebRTC \u6e90\u7801\u9605\u8bfb\u7b14\u8bb0\u4e4b\u4f20\u8f93\u5c42\u53cd\u9988 TransportPacketsFeedback\">&rarr;Read&nbsp;more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-528","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/528"}],"collection":[{"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=528"}],"version-history":[{"count":5,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/528\/revisions"}],"predecessor-version":[{"id":534,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/528\/revisions\/534"}],"wp:attachment":[{"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=528"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=528"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=528"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}