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

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

Issue 2710493008: Recreate WebrtcVideoSendStream if screen content setting is changed. (Closed)
Patch Set: Fixed race in test, formatting Created 3 years, 9 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
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2014 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 10
(...skipping 1570 matching lines...) Expand 10 before | Expand all | Expand 10 after
1581 } 1581 }
1582 1582
1583 parameters_.config.rtp.c_name = sp.cname; 1583 parameters_.config.rtp.c_name = sp.cname;
1584 if (rtp_extensions) { 1584 if (rtp_extensions) {
1585 parameters_.config.rtp.extensions = *rtp_extensions; 1585 parameters_.config.rtp.extensions = *rtp_extensions;
1586 } 1586 }
1587 parameters_.config.rtp.rtcp_mode = send_params.rtcp.reduced_size 1587 parameters_.config.rtp.rtcp_mode = send_params.rtcp.reduced_size
1588 ? webrtc::RtcpMode::kReducedSize 1588 ? webrtc::RtcpMode::kReducedSize
1589 : webrtc::RtcpMode::kCompound; 1589 : webrtc::RtcpMode::kCompound;
1590 if (codec_settings) { 1590 if (codec_settings) {
1591 SetCodec(*codec_settings); 1591 SetCodec(*codec_settings, false);
pthatcher1 2017/02/27 18:30:38 This would be much more clear as: bool force_enco
sprang_webrtc 2017/02/27 19:37:23 Done.
1592 } 1592 }
1593 } 1593 }
1594 1594
1595 WebRtcVideoChannel2::WebRtcVideoSendStream::~WebRtcVideoSendStream() { 1595 WebRtcVideoChannel2::WebRtcVideoSendStream::~WebRtcVideoSendStream() {
1596 if (stream_ != NULL) { 1596 if (stream_ != NULL) {
1597 call_->DestroyVideoSendStream(stream_); 1597 call_->DestroyVideoSendStream(stream_);
1598 } 1598 }
1599 DestroyVideoEncoder(&allocated_encoder_); 1599 DestroyVideoEncoder(&allocated_encoder_);
1600 } 1600 }
1601 1601
1602 bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetVideoSend( 1602 bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetVideoSend(
1603 bool enable, 1603 bool enable,
1604 const VideoOptions* options, 1604 const VideoOptions* options,
1605 rtc::VideoSourceInterface<webrtc::VideoFrame>* source) { 1605 rtc::VideoSourceInterface<webrtc::VideoFrame>* source) {
1606 TRACE_EVENT0("webrtc", "WebRtcVideoSendStream::SetVideoSend"); 1606 TRACE_EVENT0("webrtc", "WebRtcVideoSendStream::SetVideoSend");
1607 RTC_DCHECK_RUN_ON(&thread_checker_); 1607 RTC_DCHECK_RUN_ON(&thread_checker_);
1608 1608
1609 // Ignore |options| pointer if |enable| is false. 1609 // Ignore |options| pointer if |enable| is false.
1610 bool options_present = enable && options; 1610 bool options_present = enable && options;
1611 1611
1612 if (options_present) { 1612 if (options_present) {
1613 VideoOptions old_options = parameters_.options; 1613 VideoOptions old_options = parameters_.options;
1614 parameters_.options.SetAll(*options); 1614 parameters_.options.SetAll(*options);
1615 if (parameters_.options.is_screencast.value_or(false) !=
1616 old_options.is_screencast.value_or(false) &&
1617 parameters_.codec_settings) {
1618 // If screen content settings change, we may need to recreate the codec
1619 // instance so that the correct type is used.
1620 SetCodec(*parameters_.codec_settings, true);
pthatcher1 2017/02/27 18:30:38 And here: bool force_encoder_allocation = true; S
sprang_webrtc 2017/02/27 19:37:23 Done.
1621 // Mark screenshare parameter as being updated, then test for any other
1622 // changes that may require codec reconfiguration.
1623 old_options.is_screencast = options->is_screencast;
1624 }
1615 if (parameters_.options != old_options) { 1625 if (parameters_.options != old_options) {
1616 ReconfigureEncoder(); 1626 ReconfigureEncoder();
1617 } 1627 }
1618 } 1628 }
1619 1629
1620 if (source_ && stream_) { 1630 if (source_ && stream_) {
1621 stream_->SetSource( 1631 stream_->SetSource(
1622 nullptr, webrtc::VideoSendStream::DegradationPreference::kBalanced); 1632 nullptr, webrtc::VideoSendStream::DegradationPreference::kBalanced);
1623 } 1633 }
1624 // Switch to the new source. 1634 // Switch to the new source.
(...skipping 13 matching lines...) Expand all
1638 return true; 1648 return true;
1639 } 1649 }
1640 1650
1641 const std::vector<uint32_t>& 1651 const std::vector<uint32_t>&
1642 WebRtcVideoChannel2::WebRtcVideoSendStream::GetSsrcs() const { 1652 WebRtcVideoChannel2::WebRtcVideoSendStream::GetSsrcs() const {
1643 return ssrcs_; 1653 return ssrcs_;
1644 } 1654 }
1645 1655
1646 WebRtcVideoChannel2::WebRtcVideoSendStream::AllocatedEncoder 1656 WebRtcVideoChannel2::WebRtcVideoSendStream::AllocatedEncoder
1647 WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoder( 1657 WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoder(
1648 const VideoCodec& codec) { 1658 const VideoCodec& codec,
1659 bool force_encoder_allocation) {
1649 RTC_DCHECK_RUN_ON(&thread_checker_); 1660 RTC_DCHECK_RUN_ON(&thread_checker_);
1650 // Do not re-create encoders of the same type. 1661 // Do not re-create encoders of the same type.
1651 if (codec == allocated_encoder_.codec && 1662 if (!force_encoder_allocation && codec == allocated_encoder_.codec &&
1652 allocated_encoder_.encoder != nullptr) { 1663 allocated_encoder_.encoder != nullptr) {
1653 return allocated_encoder_; 1664 return allocated_encoder_;
1654 } 1665 }
1655 1666
1656 // Try creating external encoder. 1667 // Try creating external encoder.
1657 if (external_encoder_factory_ != nullptr && 1668 if (external_encoder_factory_ != nullptr &&
1658 FindMatchingCodec(external_encoder_factory_->supported_codecs(), codec)) { 1669 FindMatchingCodec(external_encoder_factory_->supported_codecs(), codec)) {
1659 webrtc::VideoEncoder* encoder = 1670 webrtc::VideoEncoder* encoder =
1660 external_encoder_factory_->CreateVideoEncoder(codec); 1671 external_encoder_factory_->CreateVideoEncoder(codec);
1661 if (encoder != nullptr) 1672 if (encoder != nullptr)
(...skipping 26 matching lines...) Expand all
1688 void WebRtcVideoChannel2::WebRtcVideoSendStream::DestroyVideoEncoder( 1699 void WebRtcVideoChannel2::WebRtcVideoSendStream::DestroyVideoEncoder(
1689 AllocatedEncoder* encoder) { 1700 AllocatedEncoder* encoder) {
1690 RTC_DCHECK_RUN_ON(&thread_checker_); 1701 RTC_DCHECK_RUN_ON(&thread_checker_);
1691 if (encoder->external) { 1702 if (encoder->external) {
1692 external_encoder_factory_->DestroyVideoEncoder(encoder->external_encoder); 1703 external_encoder_factory_->DestroyVideoEncoder(encoder->external_encoder);
1693 } 1704 }
1694 delete encoder->encoder; 1705 delete encoder->encoder;
1695 } 1706 }
1696 1707
1697 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetCodec( 1708 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetCodec(
1698 const VideoCodecSettings& codec_settings) { 1709 const VideoCodecSettings& codec_settings,
1710 bool force_encoder_allocation) {
1699 RTC_DCHECK_RUN_ON(&thread_checker_); 1711 RTC_DCHECK_RUN_ON(&thread_checker_);
1700 parameters_.encoder_config = CreateVideoEncoderConfig(codec_settings.codec); 1712 parameters_.encoder_config = CreateVideoEncoderConfig(codec_settings.codec);
1701 RTC_DCHECK_GT(parameters_.encoder_config.number_of_streams, 0); 1713 RTC_DCHECK_GT(parameters_.encoder_config.number_of_streams, 0);
1702 1714
1703 AllocatedEncoder new_encoder = CreateVideoEncoder(codec_settings.codec); 1715 AllocatedEncoder new_encoder =
1716 CreateVideoEncoder(codec_settings.codec, force_encoder_allocation);
1704 parameters_.config.encoder_settings.encoder = new_encoder.encoder; 1717 parameters_.config.encoder_settings.encoder = new_encoder.encoder;
1705 parameters_.config.encoder_settings.full_overuse_time = new_encoder.external; 1718 parameters_.config.encoder_settings.full_overuse_time = new_encoder.external;
1706 parameters_.config.encoder_settings.payload_name = codec_settings.codec.name; 1719 parameters_.config.encoder_settings.payload_name = codec_settings.codec.name;
1707 parameters_.config.encoder_settings.payload_type = codec_settings.codec.id; 1720 parameters_.config.encoder_settings.payload_type = codec_settings.codec.id;
1708 if (new_encoder.external) { 1721 if (new_encoder.external) {
1709 webrtc::VideoCodecType type = 1722 webrtc::VideoCodecType type =
1710 webrtc::PayloadNameToCodecType(codec_settings.codec.name) 1723 webrtc::PayloadNameToCodecType(codec_settings.codec.name)
1711 .value_or(webrtc::kVideoCodecUnknown); 1724 .value_or(webrtc::kVideoCodecUnknown);
1712 parameters_.config.encoder_settings.internal_source = 1725 parameters_.config.encoder_settings.internal_source =
1713 external_encoder_factory_->EncoderTypeHasInternalSource(type); 1726 external_encoder_factory_->EncoderTypeHasInternalSource(type);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1760 if (params.max_bandwidth_bps) { 1773 if (params.max_bandwidth_bps) {
1761 parameters_.max_bitrate_bps = *params.max_bandwidth_bps; 1774 parameters_.max_bitrate_bps = *params.max_bandwidth_bps;
1762 ReconfigureEncoder(); 1775 ReconfigureEncoder();
1763 } 1776 }
1764 if (params.conference_mode) { 1777 if (params.conference_mode) {
1765 parameters_.conference_mode = *params.conference_mode; 1778 parameters_.conference_mode = *params.conference_mode;
1766 } 1779 }
1767 1780
1768 // Set codecs and options. 1781 // Set codecs and options.
1769 if (params.codec) { 1782 if (params.codec) {
1770 SetCodec(*params.codec); 1783 SetCodec(*params.codec, false);
1771 recreate_stream = false; // SetCodec has already recreated the stream. 1784 recreate_stream = false; // SetCodec has already recreated the stream.
1772 } else if (params.conference_mode && parameters_.codec_settings) { 1785 } else if (params.conference_mode && parameters_.codec_settings) {
1773 SetCodec(*parameters_.codec_settings); 1786 SetCodec(*parameters_.codec_settings, false);
pthatcher1 2017/02/27 18:30:38 And these two: bool force_encoder_allocation = fa
sprang_webrtc 2017/02/27 19:37:23 Done.
1774 recreate_stream = false; // SetCodec has already recreated the stream. 1787 recreate_stream = false; // SetCodec has already recreated the stream.
1775 } 1788 }
1776 if (recreate_stream) { 1789 if (recreate_stream) {
1777 LOG(LS_INFO) << "RecreateWebRtcStream (send) because of SetSendParameters"; 1790 LOG(LS_INFO) << "RecreateWebRtcStream (send) because of SetSendParameters";
1778 RecreateWebRtcStream(); 1791 RecreateWebRtcStream();
1779 } 1792 }
1780 } 1793 }
1781 1794
1782 bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetRtpParameters( 1795 bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetRtpParameters(
1783 const webrtc::RtpParameters& new_parameters) { 1796 const webrtc::RtpParameters& new_parameters) {
(...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after
2527 rtx_mapping[video_codecs[i].codec.id] != 2540 rtx_mapping[video_codecs[i].codec.id] !=
2528 ulpfec_config.red_payload_type) { 2541 ulpfec_config.red_payload_type) {
2529 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; 2542 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id];
2530 } 2543 }
2531 } 2544 }
2532 2545
2533 return video_codecs; 2546 return video_codecs;
2534 } 2547 }
2535 2548
2536 } // namespace cricket 2549 } // namespace cricket
OLDNEW
« no previous file with comments | « webrtc/media/engine/webrtcvideoengine2.h ('k') | webrtc/media/engine/webrtcvideoengine2_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698