OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |