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

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

Issue 2710493008: Recreate WebrtcVideoSendStream if screen content setting is changed. (Closed)
Patch Set: readability 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 bool force_encoder_allocation = false;
1592 SetCodec(*codec_settings, force_encoder_allocation);
1592 } 1593 }
1593 } 1594 }
1594 1595
1595 WebRtcVideoChannel2::WebRtcVideoSendStream::~WebRtcVideoSendStream() { 1596 WebRtcVideoChannel2::WebRtcVideoSendStream::~WebRtcVideoSendStream() {
1596 if (stream_ != NULL) { 1597 if (stream_ != NULL) {
1597 call_->DestroyVideoSendStream(stream_); 1598 call_->DestroyVideoSendStream(stream_);
1598 } 1599 }
1599 DestroyVideoEncoder(&allocated_encoder_); 1600 DestroyVideoEncoder(&allocated_encoder_);
1600 } 1601 }
1601 1602
1602 bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetVideoSend( 1603 bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetVideoSend(
1603 bool enable, 1604 bool enable,
1604 const VideoOptions* options, 1605 const VideoOptions* options,
1605 rtc::VideoSourceInterface<webrtc::VideoFrame>* source) { 1606 rtc::VideoSourceInterface<webrtc::VideoFrame>* source) {
1606 TRACE_EVENT0("webrtc", "WebRtcVideoSendStream::SetVideoSend"); 1607 TRACE_EVENT0("webrtc", "WebRtcVideoSendStream::SetVideoSend");
1607 RTC_DCHECK_RUN_ON(&thread_checker_); 1608 RTC_DCHECK_RUN_ON(&thread_checker_);
1608 1609
1609 // Ignore |options| pointer if |enable| is false. 1610 // Ignore |options| pointer if |enable| is false.
1610 bool options_present = enable && options; 1611 bool options_present = enable && options;
1611 1612
1612 if (options_present) { 1613 if (options_present) {
1613 VideoOptions old_options = parameters_.options; 1614 VideoOptions old_options = parameters_.options;
1614 parameters_.options.SetAll(*options); 1615 parameters_.options.SetAll(*options);
1616 if (parameters_.options.is_screencast.value_or(false) !=
1617 old_options.is_screencast.value_or(false) &&
1618 parameters_.codec_settings) {
1619 // If screen content settings change, we may need to recreate the codec
1620 // instance so that the correct type is used.
1621
1622 bool force_encoder_allocation = true;
1623 SetCodec(*parameters_.codec_settings, force_encoder_allocation);
1624 // Mark screenshare parameter as being updated, then test for any other
1625 // changes that may require codec reconfiguration.
1626 old_options.is_screencast = options->is_screencast;
1627 }
1615 if (parameters_.options != old_options) { 1628 if (parameters_.options != old_options) {
1616 ReconfigureEncoder(); 1629 ReconfigureEncoder();
1617 } 1630 }
1618 } 1631 }
1619 1632
1620 if (source_ && stream_) { 1633 if (source_ && stream_) {
1621 stream_->SetSource( 1634 stream_->SetSource(
1622 nullptr, webrtc::VideoSendStream::DegradationPreference::kBalanced); 1635 nullptr, webrtc::VideoSendStream::DegradationPreference::kBalanced);
1623 } 1636 }
1624 // Switch to the new source. 1637 // Switch to the new source.
(...skipping 13 matching lines...) Expand all
1638 return true; 1651 return true;
1639 } 1652 }
1640 1653
1641 const std::vector<uint32_t>& 1654 const std::vector<uint32_t>&
1642 WebRtcVideoChannel2::WebRtcVideoSendStream::GetSsrcs() const { 1655 WebRtcVideoChannel2::WebRtcVideoSendStream::GetSsrcs() const {
1643 return ssrcs_; 1656 return ssrcs_;
1644 } 1657 }
1645 1658
1646 WebRtcVideoChannel2::WebRtcVideoSendStream::AllocatedEncoder 1659 WebRtcVideoChannel2::WebRtcVideoSendStream::AllocatedEncoder
1647 WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoder( 1660 WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoder(
1648 const VideoCodec& codec) { 1661 const VideoCodec& codec,
1662 bool force_encoder_allocation) {
1649 RTC_DCHECK_RUN_ON(&thread_checker_); 1663 RTC_DCHECK_RUN_ON(&thread_checker_);
1650 // Do not re-create encoders of the same type. 1664 // Do not re-create encoders of the same type.
1651 if (codec == allocated_encoder_.codec && 1665 if (!force_encoder_allocation && codec == allocated_encoder_.codec &&
1652 allocated_encoder_.encoder != nullptr) { 1666 allocated_encoder_.encoder != nullptr) {
1653 return allocated_encoder_; 1667 return allocated_encoder_;
1654 } 1668 }
1655 1669
1656 // Try creating external encoder. 1670 // Try creating external encoder.
1657 if (external_encoder_factory_ != nullptr && 1671 if (external_encoder_factory_ != nullptr &&
1658 FindMatchingCodec(external_encoder_factory_->supported_codecs(), codec)) { 1672 FindMatchingCodec(external_encoder_factory_->supported_codecs(), codec)) {
1659 webrtc::VideoEncoder* encoder = 1673 webrtc::VideoEncoder* encoder =
1660 external_encoder_factory_->CreateVideoEncoder(codec); 1674 external_encoder_factory_->CreateVideoEncoder(codec);
1661 if (encoder != nullptr) 1675 if (encoder != nullptr)
(...skipping 26 matching lines...) Expand all
1688 void WebRtcVideoChannel2::WebRtcVideoSendStream::DestroyVideoEncoder( 1702 void WebRtcVideoChannel2::WebRtcVideoSendStream::DestroyVideoEncoder(
1689 AllocatedEncoder* encoder) { 1703 AllocatedEncoder* encoder) {
1690 RTC_DCHECK_RUN_ON(&thread_checker_); 1704 RTC_DCHECK_RUN_ON(&thread_checker_);
1691 if (encoder->external) { 1705 if (encoder->external) {
1692 external_encoder_factory_->DestroyVideoEncoder(encoder->external_encoder); 1706 external_encoder_factory_->DestroyVideoEncoder(encoder->external_encoder);
1693 } 1707 }
1694 delete encoder->encoder; 1708 delete encoder->encoder;
1695 } 1709 }
1696 1710
1697 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetCodec( 1711 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetCodec(
1698 const VideoCodecSettings& codec_settings) { 1712 const VideoCodecSettings& codec_settings,
1713 bool force_encoder_allocation) {
1699 RTC_DCHECK_RUN_ON(&thread_checker_); 1714 RTC_DCHECK_RUN_ON(&thread_checker_);
1700 parameters_.encoder_config = CreateVideoEncoderConfig(codec_settings.codec); 1715 parameters_.encoder_config = CreateVideoEncoderConfig(codec_settings.codec);
1701 RTC_DCHECK_GT(parameters_.encoder_config.number_of_streams, 0); 1716 RTC_DCHECK_GT(parameters_.encoder_config.number_of_streams, 0);
1702 1717
1703 AllocatedEncoder new_encoder = CreateVideoEncoder(codec_settings.codec); 1718 AllocatedEncoder new_encoder =
1719 CreateVideoEncoder(codec_settings.codec, force_encoder_allocation);
1704 parameters_.config.encoder_settings.encoder = new_encoder.encoder; 1720 parameters_.config.encoder_settings.encoder = new_encoder.encoder;
1705 parameters_.config.encoder_settings.full_overuse_time = new_encoder.external; 1721 parameters_.config.encoder_settings.full_overuse_time = new_encoder.external;
1706 parameters_.config.encoder_settings.payload_name = codec_settings.codec.name; 1722 parameters_.config.encoder_settings.payload_name = codec_settings.codec.name;
1707 parameters_.config.encoder_settings.payload_type = codec_settings.codec.id; 1723 parameters_.config.encoder_settings.payload_type = codec_settings.codec.id;
1708 if (new_encoder.external) { 1724 if (new_encoder.external) {
1709 webrtc::VideoCodecType type = 1725 webrtc::VideoCodecType type =
1710 webrtc::PayloadNameToCodecType(codec_settings.codec.name) 1726 webrtc::PayloadNameToCodecType(codec_settings.codec.name)
1711 .value_or(webrtc::kVideoCodecUnknown); 1727 .value_or(webrtc::kVideoCodecUnknown);
1712 parameters_.config.encoder_settings.internal_source = 1728 parameters_.config.encoder_settings.internal_source =
1713 external_encoder_factory_->EncoderTypeHasInternalSource(type); 1729 external_encoder_factory_->EncoderTypeHasInternalSource(type);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1760 if (params.max_bandwidth_bps) { 1776 if (params.max_bandwidth_bps) {
1761 parameters_.max_bitrate_bps = *params.max_bandwidth_bps; 1777 parameters_.max_bitrate_bps = *params.max_bandwidth_bps;
1762 ReconfigureEncoder(); 1778 ReconfigureEncoder();
1763 } 1779 }
1764 if (params.conference_mode) { 1780 if (params.conference_mode) {
1765 parameters_.conference_mode = *params.conference_mode; 1781 parameters_.conference_mode = *params.conference_mode;
1766 } 1782 }
1767 1783
1768 // Set codecs and options. 1784 // Set codecs and options.
1769 if (params.codec) { 1785 if (params.codec) {
1770 SetCodec(*params.codec); 1786 bool force_encoder_allocation = false;
1787 SetCodec(*params.codec, force_encoder_allocation);
1771 recreate_stream = false; // SetCodec has already recreated the stream. 1788 recreate_stream = false; // SetCodec has already recreated the stream.
1772 } else if (params.conference_mode && parameters_.codec_settings) { 1789 } else if (params.conference_mode && parameters_.codec_settings) {
1773 SetCodec(*parameters_.codec_settings); 1790 bool force_encoder_allocation = false;
1791 SetCodec(*parameters_.codec_settings, force_encoder_allocation);
1774 recreate_stream = false; // SetCodec has already recreated the stream. 1792 recreate_stream = false; // SetCodec has already recreated the stream.
1775 } 1793 }
1776 if (recreate_stream) { 1794 if (recreate_stream) {
1777 LOG(LS_INFO) << "RecreateWebRtcStream (send) because of SetSendParameters"; 1795 LOG(LS_INFO) << "RecreateWebRtcStream (send) because of SetSendParameters";
1778 RecreateWebRtcStream(); 1796 RecreateWebRtcStream();
1779 } 1797 }
1780 } 1798 }
1781 1799
1782 bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetRtpParameters( 1800 bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetRtpParameters(
1783 const webrtc::RtpParameters& new_parameters) { 1801 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] != 2545 rtx_mapping[video_codecs[i].codec.id] !=
2528 ulpfec_config.red_payload_type) { 2546 ulpfec_config.red_payload_type) {
2529 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; 2547 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id];
2530 } 2548 }
2531 } 2549 }
2532 2550
2533 return video_codecs; 2551 return video_codecs;
2534 } 2552 }
2535 2553
2536 } // namespace cricket 2554 } // 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