| 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 |