{"id":503,"date":"2022-03-02T22:57:28","date_gmt":"2022-03-02T14:57:28","guid":{"rendered":"https:\/\/www.fanyamin.com\/wordpress\/?p=503"},"modified":"2022-03-13T18:08:25","modified_gmt":"2022-03-13T10:08:25","slug":"google-congestion-control-%e5%ae%9e%e7%8e%b0%e5%88%86%e6%9e%90%e4%b9%8b%e4%ba%8ctbd","status":"publish","type":"post","link":"https:\/\/www.fanyamin.com\/wordpress\/?p=503","title":{"rendered":"Google Congestion Control \u5b9e\u73b0\u5206\u6790\u4e4b\u4e8c"},"content":{"rendered":"<h1>\u603b\u4f53\u6d41\u7a0b<\/h1>\n<p>\u5f53\u6536\u5230 Transport Wide CC RTCP report \u65f6\u5019 \uff0c\u4f1a\u56de\u8c03 OnTransportPacketsFeedback \u65b9\u6cd5<\/p>\n<pre><code class=\"language-flow\">s=&gt;start\ne=&gt;end\ns1=&gt;operation: send rtp with TWCC header\ns2=&gt;operation: receive rtp packet\ns3=&gt;operation: compose TWCC feedback\ns4=&gt;operation: send rtcp packet\ns5=&gt;operation: receive rtcp packet\ns6=&gt;operation: parse rtcp packet\ns7=&gt;operation: bandwidth estimate\ns8=&gt;operation: adjust send bitrate\n\ns-&gt;s1-&gt;s2-&gt;s3-&gt;s4-&gt;s5-&gt;s6-&gt;s7-&gt;s8-&gt;e<\/code><\/pre>\n<p>\u4e3b\u8981\u7684\u903b\u8f91\u5728\u53d1\u9001\u65b9<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.fanyamin.com\/wordpress\/wp-content\/uploads\/2022\/03\/image-1647136811501.png\" alt=\"file\" \/><\/p>\n<pre><code>title WebRTC congestion control v1\n\nparticipant RtpSender as sender\nparticipant CongestionController as controller\nparticipant TransportFeedbackAdpater as adapter\nparticipant AcknowledgedBitrateEstimator as ack_estimator\nparticipant ProbeController as probe_controller\nparticipant DelayBasedBwe as delay_based_bwe\nparticipant BitrateController as bitrate_controller\n\nautonumber\n\n-&gt;sender: ReceiveRtcp\n\nalt RTCP of transport feedback\n    sender-&gt;controller: OnTransportFeedback(feedback)\n    controller-&gt;adapter: onTransportFeedback(feedback)\nend\n\nalt currently_in_alr\n    controller-&gt;ack_estimator: SetAlrEndedTimeMs(now_ms)\n    controller-&gt;probe_controller: SetAlrEndedTimeMs(now_ms)\nend\n\ncontroller-&gt;ack_estimator: IncomingPacketFeedbackVector(feedback_vector)\ncontroller-&gt;ack_estimator: bitrate_bps()\ncontroller-&gt;delay_based_bwe:IncomingPacketFeedbackVector(...)\ndelay_based_bwe--&gt;controller: result\n\nalt result.updated\n    controller-&gt;bitrate_controller: OnDelayBasedBweResult(result)\n    controller-&gt;controller: MaybeTriggerOnNetworkChanged()\nend\n\nalt result.recovered_from_overuse\n    controller-&gt;probe_controller: RequestProbe()\nend\n\nalt in_cwnd_experiment\n    controller-&gt;controller: LimitOutstandingBytes(adapter.GetOutstandingBytes())\nend<\/code><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/www.fanyamin.com\/wordpress\/wp-content\/uploads\/2022\/03\/image-1647163434018.png\" alt=\"\" \/><\/p>\n<p>1) \u5148\u7b97\u53cd\u9988\u786e\u8ba4\u7684\u5e26\u5bbd ack_bitrate<\/p>\n<pre><code class=\"language-cpp\">acknowledged_bitrate_estimator_-&gt;IncomingPacketFeedbackVector(packets);<\/code><\/pre>\n<p>2) \u518d\u7b97\u63a2\u6d4b\u7684\u5e26\u5bbd probe_bitrate<\/p>\n<pre><code class=\"language-cpp\">probe_bitrate_estimator_-&gt;HandleProbeAndEstimateBitrate(packet);<\/code><\/pre>\n<p>3) \u518d\u7b97\u57fa\u4e8e\u5ef6\u8fdf\u7684\u5e26\u5bbd delay_based target_bitrate<\/p>\n<pre><code class=\"language-cpp\">NetworkControlUpdate GoogCcNetworkController::OnTransportPacketsFeedback(\n    \/\/...\n    result = delay_based_bwe_-&gt;IncomingPacketFeedbackVector(\n        report, acknowledged_bitrate, probe_bitrate, estimate_,\n        alr_start_time.has_value());\n\n}<\/code><\/pre>\n<p>4) \u518d\u8ba1\u7b97\u57fa\u4e8e\u4e22\u5305\u7684\u5e26\u5bbd loss_based target_bitrate<\/p>\n<pre><code class=\"language-cpp\">    if (result.updated) {\n        if (result.probe) {\n          bandwidth_estimation_-&gt;SetSendBitrate(result.target_bitrate,\n                                                report.feedback_time);\n        }\n        \/\/ Since SetSendBitrate now resets the delay-based estimate, we have to\n        \/\/ call UpdateDelayBasedEstimate after SetSendBitrate.\n        bandwidth_estimation_-&gt;UpdateDelayBasedEstimate(report.feedback_time,\n                                                        result.target_bitrate);\n        \/\/ Update the estimate in the ProbeController, in case we want to probe.\n        MaybeTriggerOnNetworkChanged(&amp;update, report.feedback_time);\n    }<\/code><\/pre>\n<p>\u6ce8:   <\/p>\n<pre><code class=\"language-cpp\">std::unique_ptr&lt;SendSideBandwidthEstimation&gt; bandwidth_estimation_;<\/code><\/pre>\n<p>1), 2) \u4e3b\u8981\u662f\u901a\u8fc7\u5b9e\u9645\u53d1\u9001\u548c\u63a5\u6536\u7684\u5b57\u8282\u6765\u8ba1\u7b97\u6d41\u91cf,\u4f30\u7b97\u5e26\u5bbd<br \/>\n3) \u901a\u8fc7\u770b\u5355\u5411\u5ef6\u8fdf\u68af\u5ea6\u7684\u53d8\u5316\u6765\u4f30\u7b97\u5e26\u5bbd, \u7efc\u5408\u8003\u8651 1) \u548c 2)<br \/>\n4) \u901a\u8fc7\u770b\u4e22\u5305\u7387\u6765\u4f30\u7b97\u5e26\u5bbd, \u4e5f\u8981\u7efc\u5408\u8003\u8651 3)<\/p>\n<h1>Delay<\/h1>\n","protected":false},"excerpt":{"rendered":"<p>\u603b\u4f53\u6d41\u7a0b \u5f53\u6536\u5230 Transport Wide CC RTCP report \u65f6\u5019 \uff0c\u4f1a\u56de\u8c03 OnTransportPacketsFeedback \u65b9\u6cd5 s=&gt;start e=&gt;end s1=&gt;operation: send rtp with TWCC header s2=&gt;operation: receive rtp packet s3=&gt;operation: compose TWCC feedback s4=&gt;operation: send rtcp packet s5=&gt;operation: receive rtcp packet s6=&gt;operation: parse rtcp packet s7=&gt;operation: bandwidth estimate s8=&gt;operation: adjust send bitrate s-&gt;s1-&gt;s2-&gt;s3-&gt;s4-&gt;s5-&gt;s6-&gt;s7-&gt;s8-&gt;e \u4e3b\u8981\u7684\u903b\u8f91\u5728\u53d1\u9001\u65b9 title WebRTC congestion control v1 participant RtpSender [&hellip;] <a class=\"read-more\" href=\"https:\/\/www.fanyamin.com\/wordpress\/?p=503\" title=\"Permanent Link to: Google Congestion Control \u5b9e\u73b0\u5206\u6790\u4e4b\u4e8c\">&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":[15],"tags":[],"class_list":["post-503","post","type-post","status-publish","format-standard","hentry","category-webrtc"],"_links":{"self":[{"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/503"}],"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=503"}],"version-history":[{"count":14,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/503\/revisions"}],"predecessor-version":[{"id":604,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/503\/revisions\/604"}],"wp:attachment":[{"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=503"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=503"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=503"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}