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

Side by Side Diff: talk/media/webrtc/webrtcvideoengine2.cc

Issue 1608793004: Apply VideoOptions per stream. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Set default options, in particular, suspend_below_min_bitrate Created 4 years, 11 months 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
« no previous file with comments | « talk/media/webrtc/webrtcvideoengine2.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * libjingle 2 * libjingle
3 * Copyright 2014 Google Inc. 3 * Copyright 2014 Google Inc.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met: 6 * modification, are permitted provided that the following conditions are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright notice, 8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer. 9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice, 10 * 2. Redistributions in binary form must reproduce the above copyright notice,
(...skipping 604 matching lines...) Expand 10 before | Expand all | Expand 10 after
615 webrtc::Call* call, 615 webrtc::Call* call,
616 const VideoOptions& options, 616 const VideoOptions& options,
617 const std::vector<VideoCodec>& recv_codecs, 617 const std::vector<VideoCodec>& recv_codecs,
618 WebRtcVideoEncoderFactory* external_encoder_factory, 618 WebRtcVideoEncoderFactory* external_encoder_factory,
619 WebRtcVideoDecoderFactory* external_decoder_factory) 619 WebRtcVideoDecoderFactory* external_decoder_factory)
620 : call_(call), 620 : call_(call),
621 unsignalled_ssrc_handler_(&default_unsignalled_ssrc_handler_), 621 unsignalled_ssrc_handler_(&default_unsignalled_ssrc_handler_),
622 external_encoder_factory_(external_encoder_factory), 622 external_encoder_factory_(external_encoder_factory),
623 external_decoder_factory_(external_decoder_factory) { 623 external_decoder_factory_(external_decoder_factory) {
624 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 624 RTC_DCHECK(thread_checker_.CalledOnValidThread());
625 SetDefaultOptions(); 625
626 options_.SetAll(options); 626 signal_cpu_adaptation_ = options.cpu_overuse_detection.value_or(true);
627 if (options_.cpu_overuse_detection)
628 signal_cpu_adaptation_ = *options_.cpu_overuse_detection;
629 rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc; 627 rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc;
630 sending_ = false; 628 sending_ = false;
631 default_send_ssrc_ = 0; 629 default_send_ssrc_ = 0;
632 SetRecvCodecs(recv_codecs); 630 SetRecvCodecs(recv_codecs);
633 } 631 }
634 632
635 void WebRtcVideoChannel2::SetDefaultOptions() { 633 void WebRtcVideoChannel2::SetDefaultOptions(VideoOptions *options) {
636 options_.cpu_overuse_detection = rtc::Optional<bool>(true); 634 options->cpu_overuse_detection = rtc::Optional<bool>(true);
637 options_.dscp = rtc::Optional<bool>(false); 635 options->dscp = rtc::Optional<bool>(false);
638 options_.suspend_below_min_bitrate = rtc::Optional<bool>(false); 636 options->suspend_below_min_bitrate = rtc::Optional<bool>(false);
639 options_.screencast_min_bitrate = rtc::Optional<int>(0); 637 options->screencast_min_bitrate = rtc::Optional<int>(0);
640 } 638 }
641 639
642 WebRtcVideoChannel2::~WebRtcVideoChannel2() { 640 WebRtcVideoChannel2::~WebRtcVideoChannel2() {
643 for (auto& kv : send_streams_) 641 for (auto& kv : send_streams_)
644 delete kv.second; 642 delete kv.second;
645 for (auto& kv : receive_streams_) 643 for (auto& kv : receive_streams_)
646 delete kv.second; 644 delete kv.second;
647 } 645 }
648 646
649 bool WebRtcVideoChannel2::CodecIsExternallySupported( 647 bool WebRtcVideoChannel2::CodecIsExternallySupported(
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
710 return false; 708 return false;
711 } 709 }
712 710
713 bool WebRtcVideoChannel2::SetSendParameters(const VideoSendParameters& params) { 711 bool WebRtcVideoChannel2::SetSendParameters(const VideoSendParameters& params) {
714 TRACE_EVENT0("webrtc", "WebRtcVideoChannel2::SetSendParameters"); 712 TRACE_EVENT0("webrtc", "WebRtcVideoChannel2::SetSendParameters");
715 LOG(LS_INFO) << "SetSendParameters: " << params.ToString(); 713 LOG(LS_INFO) << "SetSendParameters: " << params.ToString();
716 // TODO(pbos): Refactor this to only recreate the send streams once 714 // TODO(pbos): Refactor this to only recreate the send streams once
717 // instead of 4 times. 715 // instead of 4 times.
718 if (!SetSendCodecs(params.codecs) || 716 if (!SetSendCodecs(params.codecs) ||
719 !SetSendRtpHeaderExtensions(params.extensions) || 717 !SetSendRtpHeaderExtensions(params.extensions) ||
720 !SetMaxSendBandwidth(params.max_bandwidth_bps) || 718 !SetMaxSendBandwidth(params.max_bandwidth_bps)) {
721 !SetOptions(params.options)) {
722 return false; 719 return false;
723 } 720 }
721 SetSharedOptions(params.options);
724 if (send_params_.rtcp.reduced_size != params.rtcp.reduced_size) { 722 if (send_params_.rtcp.reduced_size != params.rtcp.reduced_size) {
725 rtc::CritScope stream_lock(&stream_crit_); 723 rtc::CritScope stream_lock(&stream_crit_);
726 for (auto& kv : send_streams_) { 724 for (auto& kv : send_streams_) {
727 kv.second->SetSendParameters(params); 725 kv.second->SetSendParameters(params);
728 } 726 }
729 } 727 }
730 send_params_ = params; 728 send_params_ = params;
731 return true; 729 return true;
732 } 730 }
733 731
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
916 } 914 }
917 915
918 bool WebRtcVideoChannel2::SetVideoSend(uint32_t ssrc, bool enable, 916 bool WebRtcVideoChannel2::SetVideoSend(uint32_t ssrc, bool enable,
919 const VideoOptions* options) { 917 const VideoOptions* options) {
920 // TODO(solenberg): The state change should be fully rolled back if any one of 918 // TODO(solenberg): The state change should be fully rolled back if any one of
921 // these calls fail. 919 // these calls fail.
922 if (!MuteStream(ssrc, !enable)) { 920 if (!MuteStream(ssrc, !enable)) {
923 return false; 921 return false;
924 } 922 }
925 if (enable && options) { 923 if (enable && options) {
926 return SetOptions(*options); 924 return SetOptions(ssrc, *options);
927 } else { 925 } else {
928 return true; 926 return true;
929 } 927 }
930 } 928 }
931 929
932 bool WebRtcVideoChannel2::ValidateSendSsrcAvailability( 930 bool WebRtcVideoChannel2::ValidateSendSsrcAvailability(
933 const StreamParams& sp) const { 931 const StreamParams& sp) const {
934 for (uint32_t ssrc: sp.ssrcs) { 932 for (uint32_t ssrc: sp.ssrcs) {
935 if (send_ssrcs_.find(ssrc) != send_ssrcs_.end()) { 933 if (send_ssrcs_.find(ssrc) != send_ssrcs_.end()) {
936 LOG(LS_ERROR) << "Send stream with SSRC '" << ssrc << "' already exists."; 934 LOG(LS_ERROR) << "Send stream with SSRC '" << ssrc << "' already exists.";
(...skipping 24 matching lines...) Expand all
961 959
962 if (!ValidateSendSsrcAvailability(sp)) 960 if (!ValidateSendSsrcAvailability(sp))
963 return false; 961 return false;
964 962
965 for (uint32_t used_ssrc : sp.ssrcs) 963 for (uint32_t used_ssrc : sp.ssrcs)
966 send_ssrcs_.insert(used_ssrc); 964 send_ssrcs_.insert(used_ssrc);
967 965
968 webrtc::VideoSendStream::Config config(this); 966 webrtc::VideoSendStream::Config config(this);
969 config.overuse_callback = this; 967 config.overuse_callback = this;
970 968
969 // Initial options
970 VideoOptions options;
971 SetDefaultOptions(&options);
972
971 WebRtcVideoSendStream* stream = new WebRtcVideoSendStream( 973 WebRtcVideoSendStream* stream = new WebRtcVideoSendStream(
972 call_, sp, config, external_encoder_factory_, options_, 974 call_, sp, config, external_encoder_factory_, options,
973 bitrate_config_.max_bitrate_bps, send_codec_, send_rtp_extensions_, 975 bitrate_config_.max_bitrate_bps, send_codec_, send_rtp_extensions_,
974 send_params_); 976 send_params_);
975 977
976 uint32_t ssrc = sp.first_ssrc(); 978 uint32_t ssrc = sp.first_ssrc();
977 RTC_DCHECK(ssrc != 0); 979 RTC_DCHECK(ssrc != 0);
978 send_streams_[ssrc] = stream; 980 send_streams_[ssrc] = stream;
979 981
980 if (rtcp_receiver_report_ssrc_ == kDefaultRtcpReceiverReportSsrc) { 982 if (rtcp_receiver_report_ssrc_ == kDefaultRtcpReceiverReportSsrc) {
981 rtcp_receiver_report_ssrc_ = ssrc; 983 rtcp_receiver_report_ssrc_ = ssrc;
982 LOG(LS_INFO) << "SetLocalSsrc on all the receive streams because we added " 984 LOG(LS_INFO) << "SetLocalSsrc on all the receive streams because we added "
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
1092 1094
1093 // Set up A/V sync group based on sync label. 1095 // Set up A/V sync group based on sync label.
1094 config.sync_group = sp.sync_label; 1096 config.sync_group = sp.sync_label;
1095 1097
1096 config.rtp.remb = send_codec_ ? HasRemb(send_codec_->codec) : false; 1098 config.rtp.remb = send_codec_ ? HasRemb(send_codec_->codec) : false;
1097 config.rtp.transport_cc = 1099 config.rtp.transport_cc =
1098 send_codec_ ? HasTransportCc(send_codec_->codec) : false; 1100 send_codec_ ? HasTransportCc(send_codec_->codec) : false;
1099 1101
1100 receive_streams_[ssrc] = new WebRtcVideoReceiveStream( 1102 receive_streams_[ssrc] = new WebRtcVideoReceiveStream(
1101 call_, sp, config, external_decoder_factory_, default_stream, 1103 call_, sp, config, external_decoder_factory_, default_stream,
1102 recv_codecs_, options_.disable_prerenderer_smoothing.value_or(false)); 1104 recv_codecs_,
1105 // TODO(nisse): Used to pass
pbos-webrtc 2016/01/28 14:55:44 This should be const on construction, this needs t
1106 // options_.disable_prerenderer_smoothing.value_or(false),
1107 // unclear if it needs to be configurable here, but there's no
1108 // other method to change it.
1109 false);
1103 1110
1104 return true; 1111 return true;
1105 } 1112 }
1106 1113
1107 void WebRtcVideoChannel2::ConfigureReceiverRtp( 1114 void WebRtcVideoChannel2::ConfigureReceiverRtp(
1108 webrtc::VideoReceiveStream::Config* config, 1115 webrtc::VideoReceiveStream::Config* config,
1109 const StreamParams& sp) const { 1116 const StreamParams& sp) const {
1110 uint32_t ssrc = sp.first_ssrc(); 1117 uint32_t ssrc = sp.first_ssrc();
1111 1118
1112 config->rtp.remote_ssrc = ssrc; 1119 config->rtp.remote_ssrc = ssrc;
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
1459 bitrate_config_.min_bitrate_bps > max_bitrate_bps) { 1466 bitrate_config_.min_bitrate_bps > max_bitrate_bps) {
1460 bitrate_config_.min_bitrate_bps = max_bitrate_bps; 1467 bitrate_config_.min_bitrate_bps = max_bitrate_bps;
1461 } 1468 }
1462 call_->SetBitrateConfig(bitrate_config_); 1469 call_->SetBitrateConfig(bitrate_config_);
1463 rtc::CritScope stream_lock(&stream_crit_); 1470 rtc::CritScope stream_lock(&stream_crit_);
1464 for (auto& kv : send_streams_) 1471 for (auto& kv : send_streams_)
1465 kv.second->SetMaxBitrateBps(max_bitrate_bps); 1472 kv.second->SetMaxBitrateBps(max_bitrate_bps);
1466 return true; 1473 return true;
1467 } 1474 }
1468 1475
1469 bool WebRtcVideoChannel2::SetOptions(const VideoOptions& options) { 1476 void WebRtcVideoChannel2::SetSharedOptions(const VideoOptions& options) {
1470 TRACE_EVENT0("webrtc", "WebRtcVideoChannel2::SetOptions");
1471 LOG(LS_INFO) << "SetOptions: " << options.ToString();
1472 VideoOptions old_options = options_;
1473 options_.SetAll(options);
1474 if (options_ == old_options) {
1475 // No new options to set.
1476 return true;
1477 }
1478 { 1477 {
1479 rtc::CritScope lock(&capturer_crit_); 1478 rtc::CritScope lock(&capturer_crit_);
1480 if (options_.cpu_overuse_detection) 1479 if (options.cpu_overuse_detection)
1481 signal_cpu_adaptation_ = *options_.cpu_overuse_detection; 1480 signal_cpu_adaptation_ = *options.cpu_overuse_detection;
1482 } 1481 }
1483 rtc::DiffServCodePoint dscp = 1482 rtc::DiffServCodePoint dscp =
1484 options_.dscp.value_or(false) ? rtc::DSCP_AF41 : rtc::DSCP_DEFAULT; 1483 options.dscp.value_or(false) ? rtc::DSCP_AF41 : rtc::DSCP_DEFAULT;
1485 MediaChannel::SetDscp(dscp); 1484 MediaChannel::SetDscp(dscp);
1485 }
1486
1487 bool WebRtcVideoChannel2::SetOptions(uint32_t ssrc,
1488 const VideoOptions& options) {
1489 TRACE_EVENT0("webrtc", "WebRtcVideoChannel2::SetOptions");
1490 LOG(LS_INFO) << "SetOptions: ssrc " << ssrc << ": " << options.ToString();
1491 SetSharedOptions(options);
1492
1486 rtc::CritScope stream_lock(&stream_crit_); 1493 rtc::CritScope stream_lock(&stream_crit_);
1487 for (std::map<uint32_t, WebRtcVideoSendStream*>::iterator it = 1494 if (send_streams_.find(ssrc) == send_streams_.end()) {
1488 send_streams_.begin(); 1495 return false;
1489 it != send_streams_.end(); ++it) {
1490 it->second->SetOptions(options_);
1491 } 1496 }
1497 send_streams_[ssrc]->SetOptions(options);
1498
1492 return true; 1499 return true;
1493 } 1500 }
1494 1501
1495 void WebRtcVideoChannel2::SetInterface(NetworkInterface* iface) { 1502 void WebRtcVideoChannel2::SetInterface(NetworkInterface* iface) {
1496 MediaChannel::SetInterface(iface); 1503 MediaChannel::SetInterface(iface);
1497 // Set the RTP recv/send buffer to a bigger size 1504 // Set the RTP recv/send buffer to a bigger size
1498 MediaChannel::SetOption(NetworkInterface::ST_RTP, 1505 MediaChannel::SetOption(NetworkInterface::ST_RTP,
1499 rtc::Socket::OPT_RCVBUF, 1506 rtc::Socket::OPT_RCVBUF,
1500 kVideoRtpBufferSize); 1507 kVideoRtpBufferSize);
1501 1508
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after
1801 bool apply_rotation) { 1808 bool apply_rotation) {
1802 rtc::CritScope cs(&lock_); 1809 rtc::CritScope cs(&lock_);
1803 if (capturer_ == NULL) 1810 if (capturer_ == NULL)
1804 return; 1811 return;
1805 1812
1806 capturer_->SetApplyRotation(apply_rotation); 1813 capturer_->SetApplyRotation(apply_rotation);
1807 } 1814 }
1808 1815
1809 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetOptions( 1816 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetOptions(
1810 const VideoOptions& options) { 1817 const VideoOptions& options) {
1818
1811 rtc::CritScope cs(&lock_); 1819 rtc::CritScope cs(&lock_);
1812 if (parameters_.codec_settings) { 1820 if (parameters_.codec_settings) {
1813 LOG(LS_INFO) << "SetCodecAndOptions because of SetOptions; options=" 1821 LOG(LS_INFO) << "SetCodecAndOptions because of SetOptions; options="
1814 << options.ToString(); 1822 << options.ToString();
1815 SetCodecAndOptions(*parameters_.codec_settings, options); 1823 SetCodecAndOptions(*parameters_.codec_settings, options);
1816 } else { 1824 } else {
1817 parameters_.options = options; 1825 parameters_.options = options;
1818 } 1826 }
1819 } 1827 }
1820 1828
(...skipping 828 matching lines...) Expand 10 before | Expand all | Expand 10 after
2649 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; 2657 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id];
2650 } 2658 }
2651 } 2659 }
2652 2660
2653 return video_codecs; 2661 return video_codecs;
2654 } 2662 }
2655 2663
2656 } // namespace cricket 2664 } // namespace cricket
2657 2665
2658 #endif // HAVE_WEBRTC_VIDEO 2666 #endif // HAVE_WEBRTC_VIDEO
OLDNEW
« no previous file with comments | « talk/media/webrtc/webrtcvideoengine2.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698