Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1261)

Side by Side Diff: webrtc/video/video_send_stream.cc

Issue 2531383002: Wire up BitrateAllocation to be sent as RTCP TargetBitrate (Closed)
Patch Set: Flaky test, racy shutdown Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 #include "webrtc/video/video_send_stream.h" 10 #include "webrtc/video/video_send_stream.h"
11 11
12 #include <algorithm> 12 #include <algorithm>
13 #include <sstream> 13 #include <sstream>
14 #include <string> 14 #include <string>
15 #include <utility> 15 #include <utility>
16 #include <vector> 16 #include <vector>
17 17
18 #include "webrtc/common_types.h" 18 #include "webrtc/common_types.h"
19 #include "webrtc/common_video/include/video_bitrate_allocator.h"
19 #include "webrtc/base/checks.h" 20 #include "webrtc/base/checks.h"
20 #include "webrtc/base/file.h" 21 #include "webrtc/base/file.h"
21 #include "webrtc/base/logging.h" 22 #include "webrtc/base/logging.h"
22 #include "webrtc/base/trace_event.h" 23 #include "webrtc/base/trace_event.h"
23 #include "webrtc/base/weak_ptr.h" 24 #include "webrtc/base/weak_ptr.h"
24 #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h" 25 #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
25 #include "webrtc/modules/congestion_controller/include/congestion_controller.h" 26 #include "webrtc/modules/congestion_controller/include/congestion_controller.h"
26 #include "webrtc/modules/pacing/packet_router.h" 27 #include "webrtc/modules/pacing/packet_router.h"
27 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" 28 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
28 #include "webrtc/modules/utility/include/process_thread.h" 29 #include "webrtc/modules/utility/include/process_thread.h"
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 279
279 // VideoSendStreamImpl implements internal::VideoSendStream. 280 // VideoSendStreamImpl implements internal::VideoSendStream.
280 // It is created and destroyed on |worker_queue|. The intent is to decrease the 281 // It is created and destroyed on |worker_queue|. The intent is to decrease the
281 // need for locking and to ensure methods are called in sequence. 282 // need for locking and to ensure methods are called in sequence.
282 // Public methods except |DeliverRtcp| must be called on |worker_queue|. 283 // Public methods except |DeliverRtcp| must be called on |worker_queue|.
283 // DeliverRtcp is called on the libjingle worker thread or a network thread. 284 // DeliverRtcp is called on the libjingle worker thread or a network thread.
284 // An encoder may deliver frames through the EncodedImageCallback on an 285 // An encoder may deliver frames through the EncodedImageCallback on an
285 // arbitrary thread. 286 // arbitrary thread.
286 class VideoSendStreamImpl : public webrtc::BitrateAllocatorObserver, 287 class VideoSendStreamImpl : public webrtc::BitrateAllocatorObserver,
287 public webrtc::VCMProtectionCallback, 288 public webrtc::VCMProtectionCallback,
288 public ViEEncoder::EncoderSink { 289 public ViEEncoder::EncoderSink,
290 public VideoBitrateAllocationObserver {
289 public: 291 public:
290 VideoSendStreamImpl(SendStatisticsProxy* stats_proxy, 292 VideoSendStreamImpl(SendStatisticsProxy* stats_proxy,
291 rtc::TaskQueue* worker_queue, 293 rtc::TaskQueue* worker_queue,
292 CallStats* call_stats, 294 CallStats* call_stats,
293 CongestionController* congestion_controller, 295 CongestionController* congestion_controller,
294 BitrateAllocator* bitrate_allocator, 296 BitrateAllocator* bitrate_allocator,
295 SendDelayStats* send_delay_stats, 297 SendDelayStats* send_delay_stats,
296 VieRemb* remb, 298 VieRemb* remb,
297 ViEEncoder* vie_encoder, 299 ViEEncoder* vie_encoder,
298 RtcEventLog* event_log, 300 RtcEventLog* event_log,
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 int min_transmit_bitrate_bps) override; 343 int min_transmit_bitrate_bps) override;
342 344
343 // Implements EncodedImageCallback. The implementation routes encoded frames 345 // Implements EncodedImageCallback. The implementation routes encoded frames
344 // to the |payload_router_| and |config.pre_encode_callback| if set. 346 // to the |payload_router_| and |config.pre_encode_callback| if set.
345 // Called on an arbitrary encoder callback thread. 347 // Called on an arbitrary encoder callback thread.
346 EncodedImageCallback::Result OnEncodedImage( 348 EncodedImageCallback::Result OnEncodedImage(
347 const EncodedImage& encoded_image, 349 const EncodedImage& encoded_image,
348 const CodecSpecificInfo* codec_specific_info, 350 const CodecSpecificInfo* codec_specific_info,
349 const RTPFragmentationHeader* fragmentation) override; 351 const RTPFragmentationHeader* fragmentation) override;
350 352
353 // Implements VideoBitrateAllocationObserver.
354 void OnBitrateAllocationUpdated(const BitrateAllocation& allocation) override;
355
351 void ConfigureProtection(); 356 void ConfigureProtection();
352 void ConfigureSsrcs(); 357 void ConfigureSsrcs();
353 void SignalEncoderTimedOut(); 358 void SignalEncoderTimedOut();
354 void SignalEncoderActive(); 359 void SignalEncoderActive();
355 360
356 SendStatisticsProxy* const stats_proxy_; 361 SendStatisticsProxy* const stats_proxy_;
357 const VideoSendStream::Config* const config_; 362 const VideoSendStream::Config* const config_;
358 std::map<uint32_t, RtpState> suspended_ssrcs_; 363 std::map<uint32_t, RtpState> suspended_ssrcs_;
359 364
360 ProcessThread* module_process_thread_; 365 ProcessThread* module_process_thread_;
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
573 const std::map<uint32_t, RtpState>& suspended_ssrcs) 578 const std::map<uint32_t, RtpState>& suspended_ssrcs)
574 : worker_queue_(worker_queue), 579 : worker_queue_(worker_queue),
575 thread_sync_event_(false /* manual_reset */, false), 580 thread_sync_event_(false /* manual_reset */, false),
576 stats_proxy_(Clock::GetRealTimeClock(), 581 stats_proxy_(Clock::GetRealTimeClock(),
577 config, 582 config,
578 encoder_config.content_type), 583 encoder_config.content_type),
579 config_(std::move(config)) { 584 config_(std::move(config)) {
580 vie_encoder_.reset(new ViEEncoder( 585 vie_encoder_.reset(new ViEEncoder(
581 num_cpu_cores, &stats_proxy_, config_.encoder_settings, 586 num_cpu_cores, &stats_proxy_, config_.encoder_settings,
582 config_.pre_encode_callback, config_.post_encode_callback)); 587 config_.pre_encode_callback, config_.post_encode_callback));
583
584 worker_queue_->PostTask(std::unique_ptr<rtc::QueuedTask>(new ConstructionTask( 588 worker_queue_->PostTask(std::unique_ptr<rtc::QueuedTask>(new ConstructionTask(
585 &send_stream_, &thread_sync_event_, &stats_proxy_, vie_encoder_.get(), 589 &send_stream_, &thread_sync_event_, &stats_proxy_, vie_encoder_.get(),
586 module_process_thread, call_stats, congestion_controller, 590 module_process_thread, call_stats, congestion_controller,
587 bitrate_allocator, send_delay_stats, remb, event_log, &config_, 591 bitrate_allocator, send_delay_stats, remb, event_log, &config_,
588 encoder_config.max_bitrate_bps, suspended_ssrcs))); 592 encoder_config.max_bitrate_bps, suspended_ssrcs)));
589 593
590 // Wait for ConstructionTask to complete so that |send_stream_| can be used. 594 // Wait for ConstructionTask to complete so that |send_stream_| can be used.
591 // |module_process_thread| must be registered and deregistered on the thread 595 // |module_process_thread| must be registered and deregistered on the thread
592 // it was created on. 596 // it was created on.
593 thread_sync_event_.Wait(rtc::Event::kForever); 597 thread_sync_event_.Wait(rtc::Event::kForever);
594 send_stream_->RegisterProcessThread(module_process_thread); 598 send_stream_->RegisterProcessThread(module_process_thread);
595 599 vie_encoder_->SetBitrateObserver(send_stream_.get());
596 vie_encoder_->RegisterProcessThread(module_process_thread); 600 vie_encoder_->RegisterProcessThread(module_process_thread);
597 601
598 ReconfigureVideoEncoder(std::move(encoder_config)); 602 ReconfigureVideoEncoder(std::move(encoder_config));
599 } 603 }
600 604
601 VideoSendStream::~VideoSendStream() { 605 VideoSendStream::~VideoSendStream() {
602 RTC_DCHECK_RUN_ON(&thread_checker_); 606 RTC_DCHECK_RUN_ON(&thread_checker_);
603 RTC_DCHECK(!send_stream_); 607 RTC_DCHECK(!send_stream_);
604 } 608 }
605 609
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
819 } 823 }
820 824
821 void VideoSendStreamImpl::DeRegisterProcessThread() { 825 void VideoSendStreamImpl::DeRegisterProcessThread() {
822 RTC_DCHECK_RUN_ON(&module_process_thread_checker_); 826 RTC_DCHECK_RUN_ON(&module_process_thread_checker_);
823 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) 827 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
824 module_process_thread_->DeRegisterModule(rtp_rtcp); 828 module_process_thread_->DeRegisterModule(rtp_rtcp);
825 } 829 }
826 830
827 VideoSendStreamImpl::~VideoSendStreamImpl() { 831 VideoSendStreamImpl::~VideoSendStreamImpl() {
828 RTC_DCHECK_RUN_ON(worker_queue_); 832 RTC_DCHECK_RUN_ON(worker_queue_);
829 RTC_DCHECK(!payload_router_.active()) 833 RTC_DCHECK(!payload_router_.IsActive())
830 << "VideoSendStreamImpl::Stop not called"; 834 << "VideoSendStreamImpl::Stop not called";
831 LOG(LS_INFO) << "~VideoSendStreamInternal: " << config_->ToString(); 835 LOG(LS_INFO) << "~VideoSendStreamInternal: " << config_->ToString();
832 836
833 rtp_rtcp_modules_[0]->SetREMBStatus(false); 837 rtp_rtcp_modules_[0]->SetREMBStatus(false);
834 remb_->RemoveRembSender(rtp_rtcp_modules_[0]); 838 remb_->RemoveRembSender(rtp_rtcp_modules_[0]);
835 839
836 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { 840 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
837 congestion_controller_->packet_router()->RemoveRtpModule(rtp_rtcp); 841 congestion_controller_->packet_router()->RemoveRtpModule(rtp_rtcp);
838 delete rtp_rtcp; 842 delete rtp_rtcp;
839 } 843 }
840 } 844 }
841 845
842 bool VideoSendStreamImpl::DeliverRtcp(const uint8_t* packet, size_t length) { 846 bool VideoSendStreamImpl::DeliverRtcp(const uint8_t* packet, size_t length) {
843 // Runs on a network thread. 847 // Runs on a network thread.
844 RTC_DCHECK(!worker_queue_->IsCurrent()); 848 RTC_DCHECK(!worker_queue_->IsCurrent());
845 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) 849 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
846 rtp_rtcp->IncomingRtcpPacket(packet, length); 850 rtp_rtcp->IncomingRtcpPacket(packet, length);
847 return true; 851 return true;
848 } 852 }
849 853
850 void VideoSendStreamImpl::Start() { 854 void VideoSendStreamImpl::Start() {
851 RTC_DCHECK_RUN_ON(worker_queue_); 855 RTC_DCHECK_RUN_ON(worker_queue_);
852 LOG(LS_INFO) << "VideoSendStream::Start"; 856 LOG(LS_INFO) << "VideoSendStream::Start";
853 if (payload_router_.active()) 857 if (payload_router_.IsActive())
854 return; 858 return;
855 TRACE_EVENT_INSTANT0("webrtc", "VideoSendStream::Start"); 859 TRACE_EVENT_INSTANT0("webrtc", "VideoSendStream::Start");
856 payload_router_.set_active(true); 860 payload_router_.SetActive(true);
857 861
858 bitrate_allocator_->AddObserver( 862 bitrate_allocator_->AddObserver(
859 this, encoder_min_bitrate_bps_, encoder_max_bitrate_bps_, 863 this, encoder_min_bitrate_bps_, encoder_max_bitrate_bps_,
860 max_padding_bitrate_, !config_->suspend_below_min_bitrate); 864 max_padding_bitrate_, !config_->suspend_below_min_bitrate);
861 865
862 // Start monitoring encoder activity. 866 // Start monitoring encoder activity.
863 { 867 {
864 rtc::CritScope lock(&encoder_activity_crit_sect_); 868 rtc::CritScope lock(&encoder_activity_crit_sect_);
865 RTC_DCHECK(!check_encoder_activity_task_); 869 RTC_DCHECK(!check_encoder_activity_task_);
866 check_encoder_activity_task_ = new CheckEncoderActivityTask(weak_ptr_); 870 check_encoder_activity_task_ = new CheckEncoderActivityTask(weak_ptr_);
867 worker_queue_->PostDelayedTask( 871 worker_queue_->PostDelayedTask(
868 std::unique_ptr<rtc::QueuedTask>(check_encoder_activity_task_), 872 std::unique_ptr<rtc::QueuedTask>(check_encoder_activity_task_),
869 CheckEncoderActivityTask::kEncoderTimeOutMs); 873 CheckEncoderActivityTask::kEncoderTimeOutMs);
870 } 874 }
871 875
872 vie_encoder_->SendKeyFrame(); 876 vie_encoder_->SendKeyFrame();
873 } 877 }
874 878
875 void VideoSendStreamImpl::Stop() { 879 void VideoSendStreamImpl::Stop() {
876 RTC_DCHECK_RUN_ON(worker_queue_); 880 RTC_DCHECK_RUN_ON(worker_queue_);
877 LOG(LS_INFO) << "VideoSendStream::Stop"; 881 LOG(LS_INFO) << "VideoSendStream::Stop";
878 if (!payload_router_.active()) 882 if (!payload_router_.IsActive())
879 return; 883 return;
880 TRACE_EVENT_INSTANT0("webrtc", "VideoSendStream::Stop"); 884 TRACE_EVENT_INSTANT0("webrtc", "VideoSendStream::Stop");
881 payload_router_.set_active(false); 885 payload_router_.SetActive(false);
882 bitrate_allocator_->RemoveObserver(this); 886 bitrate_allocator_->RemoveObserver(this);
883 { 887 {
884 rtc::CritScope lock(&encoder_activity_crit_sect_); 888 rtc::CritScope lock(&encoder_activity_crit_sect_);
885 check_encoder_activity_task_->Stop(); 889 check_encoder_activity_task_->Stop();
886 check_encoder_activity_task_ = nullptr; 890 check_encoder_activity_task_ = nullptr;
887 } 891 }
888 vie_encoder_->OnBitrateUpdated(0, 0, 0); 892 vie_encoder_->OnBitrateUpdated(0, 0, 0);
889 stats_proxy_->OnSetEncoderTargetRate(0); 893 stats_proxy_->OnSetEncoderTargetRate(0);
890 } 894 }
891 895
892 void VideoSendStreamImpl::SignalEncoderTimedOut() { 896 void VideoSendStreamImpl::SignalEncoderTimedOut() {
893 RTC_DCHECK_RUN_ON(worker_queue_); 897 RTC_DCHECK_RUN_ON(worker_queue_);
894 // If the encoder has not produced anything the last kEncoderTimeOutMs and it 898 // If the encoder has not produced anything the last kEncoderTimeOutMs and it
895 // is supposed to, deregister as BitrateAllocatorObserver. This can happen 899 // is supposed to, deregister as BitrateAllocatorObserver. This can happen
896 // if a camera stops producing frames. 900 // if a camera stops producing frames.
897 if (encoder_target_rate_bps_ > 0) { 901 if (encoder_target_rate_bps_ > 0) {
898 LOG(LS_INFO) << "SignalEncoderTimedOut, Encoder timed out."; 902 LOG(LS_INFO) << "SignalEncoderTimedOut, Encoder timed out.";
899 bitrate_allocator_->RemoveObserver(this); 903 bitrate_allocator_->RemoveObserver(this);
900 } 904 }
901 } 905 }
902 906
907 void VideoSendStreamImpl::OnBitrateAllocationUpdated(
908 const BitrateAllocation& allocation) {
909 payload_router_.OnBitrateAllocationUpdated(allocation);
910 }
911
903 void VideoSendStreamImpl::SignalEncoderActive() { 912 void VideoSendStreamImpl::SignalEncoderActive() {
904 RTC_DCHECK_RUN_ON(worker_queue_); 913 RTC_DCHECK_RUN_ON(worker_queue_);
905 LOG(LS_INFO) << "SignalEncoderActive, Encoder is active."; 914 LOG(LS_INFO) << "SignalEncoderActive, Encoder is active.";
906 bitrate_allocator_->AddObserver( 915 bitrate_allocator_->AddObserver(
907 this, encoder_min_bitrate_bps_, encoder_max_bitrate_bps_, 916 this, encoder_min_bitrate_bps_, encoder_max_bitrate_bps_,
908 max_padding_bitrate_, !config_->suspend_below_min_bitrate); 917 max_padding_bitrate_, !config_->suspend_below_min_bitrate);
909 } 918 }
910 919
911 void VideoSendStreamImpl::OnEncoderConfigurationChanged( 920 void VideoSendStreamImpl::OnEncoderConfigurationChanged(
912 std::vector<VideoStream> streams, 921 std::vector<VideoStream> streams,
(...skipping 22 matching lines...) Expand all
935 for (size_t i = streams.size(); i < config_->rtp.ssrcs.size(); ++i) { 944 for (size_t i = streams.size(); i < config_->rtp.ssrcs.size(); ++i) {
936 stats_proxy_->OnInactiveSsrc(config_->rtp.ssrcs[i]); 945 stats_proxy_->OnInactiveSsrc(config_->rtp.ssrcs[i]);
937 } 946 }
938 947
939 size_t number_of_temporal_layers = 948 size_t number_of_temporal_layers =
940 streams.back().temporal_layer_thresholds_bps.size() + 1; 949 streams.back().temporal_layer_thresholds_bps.size() + 1;
941 protection_bitrate_calculator_.SetEncodingData( 950 protection_bitrate_calculator_.SetEncodingData(
942 streams[0].width, streams[0].height, number_of_temporal_layers, 951 streams[0].width, streams[0].height, number_of_temporal_layers,
943 config_->rtp.max_packet_size); 952 config_->rtp.max_packet_size);
944 953
945 if (payload_router_.active()) { 954 if (payload_router_.IsActive()) {
946 // The send stream is started already. Update the allocator with new bitrate 955 // The send stream is started already. Update the allocator with new bitrate
947 // limits. 956 // limits.
948 bitrate_allocator_->AddObserver( 957 bitrate_allocator_->AddObserver(
949 this, encoder_min_bitrate_bps_, encoder_max_bitrate_bps_, 958 this, encoder_min_bitrate_bps_, encoder_max_bitrate_bps_,
950 max_padding_bitrate_, !config_->suspend_below_min_bitrate); 959 max_padding_bitrate_, !config_->suspend_below_min_bitrate);
951 } 960 }
952 } 961 }
953 962
954 EncodedImageCallback::Result VideoSendStreamImpl::OnEncodedImage( 963 EncodedImageCallback::Result VideoSendStreamImpl::OnEncodedImage(
955 const EncodedImage& encoded_image, 964 const EncodedImage& encoded_image,
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
1143 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { 1152 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
1144 rtp_rtcp->SetRTCPStatus(state == kNetworkUp ? config_->rtp.rtcp_mode 1153 rtp_rtcp->SetRTCPStatus(state == kNetworkUp ? config_->rtp.rtcp_mode
1145 : RtcpMode::kOff); 1154 : RtcpMode::kOff);
1146 } 1155 }
1147 } 1156 }
1148 1157
1149 uint32_t VideoSendStreamImpl::OnBitrateUpdated(uint32_t bitrate_bps, 1158 uint32_t VideoSendStreamImpl::OnBitrateUpdated(uint32_t bitrate_bps,
1150 uint8_t fraction_loss, 1159 uint8_t fraction_loss,
1151 int64_t rtt) { 1160 int64_t rtt) {
1152 RTC_DCHECK_RUN_ON(worker_queue_); 1161 RTC_DCHECK_RUN_ON(worker_queue_);
1153 RTC_DCHECK(payload_router_.active()) 1162 RTC_DCHECK(payload_router_.IsActive())
1154 << "VideoSendStream::Start has not been called."; 1163 << "VideoSendStream::Start has not been called.";
1155 // Get the encoder target rate. It is the estimated network rate - 1164 // Get the encoder target rate. It is the estimated network rate -
1156 // protection overhead. 1165 // protection overhead.
1157 encoder_target_rate_bps_ = protection_bitrate_calculator_.SetTargetRates( 1166 encoder_target_rate_bps_ = protection_bitrate_calculator_.SetTargetRates(
1158 bitrate_bps, stats_proxy_->GetSendFrameRate(), fraction_loss, rtt); 1167 bitrate_bps, stats_proxy_->GetSendFrameRate(), fraction_loss, rtt);
1159 uint32_t protection_bitrate = bitrate_bps - encoder_target_rate_bps_; 1168 uint32_t protection_bitrate = bitrate_bps - encoder_target_rate_bps_;
1160 1169
1161 encoder_target_rate_bps_ = 1170 encoder_target_rate_bps_ =
1162 std::min(encoder_max_bitrate_bps_, encoder_target_rate_bps_); 1171 std::min(encoder_max_bitrate_bps_, encoder_target_rate_bps_);
1163 vie_encoder_->OnBitrateUpdated(encoder_target_rate_bps_, fraction_loss, rtt); 1172 vie_encoder_->OnBitrateUpdated(encoder_target_rate_bps_, fraction_loss, rtt);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1212 } 1221 }
1213 1222
1214 void VideoSendStreamImpl::SetTransportOverhead( 1223 void VideoSendStreamImpl::SetTransportOverhead(
1215 int transport_overhead_per_packet) { 1224 int transport_overhead_per_packet) {
1216 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) 1225 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
1217 rtp_rtcp->SetTransportOverhead(transport_overhead_per_packet); 1226 rtp_rtcp->SetTransportOverhead(transport_overhead_per_packet);
1218 } 1227 }
1219 1228
1220 } // namespace internal 1229 } // namespace internal
1221 } // namespace webrtc 1230 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698