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 730 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
741 } | 741 } |
742 | 742 |
743 if (!send_codec_ || supported_codecs.front() != *send_codec_) { | 743 if (!send_codec_ || supported_codecs.front() != *send_codec_) { |
744 changed_params->codec = | 744 changed_params->codec = |
745 rtc::Optional<VideoCodecSettings>(supported_codecs.front()); | 745 rtc::Optional<VideoCodecSettings>(supported_codecs.front()); |
746 } | 746 } |
747 | 747 |
748 // Handle RTP header extensions. | 748 // Handle RTP header extensions. |
749 std::vector<webrtc::RtpExtension> filtered_extensions = FilterRtpExtensions( | 749 std::vector<webrtc::RtpExtension> filtered_extensions = FilterRtpExtensions( |
750 params.extensions, webrtc::RtpExtension::IsSupportedForVideo, true); | 750 params.extensions, webrtc::RtpExtension::IsSupportedForVideo, true); |
751 if (send_rtp_extensions_ != filtered_extensions) { | 751 if (!send_rtp_extensions_ || (*send_rtp_extensions_ != filtered_extensions)) { |
752 changed_params->rtp_header_extensions = | 752 changed_params->rtp_header_extensions = |
753 rtc::Optional<std::vector<webrtc::RtpExtension>>(filtered_extensions); | 753 rtc::Optional<std::vector<webrtc::RtpExtension>>(filtered_extensions); |
754 } | 754 } |
755 | 755 |
756 // Handle max bitrate. | 756 // Handle max bitrate. |
757 if (params.max_bandwidth_bps != send_params_.max_bandwidth_bps && | 757 if (params.max_bandwidth_bps != send_params_.max_bandwidth_bps && |
758 params.max_bandwidth_bps >= 0) { | 758 params.max_bandwidth_bps >= 0) { |
759 // 0 uncaps max bitrate (-1). | 759 // 0 uncaps max bitrate (-1). |
760 changed_params->max_bandwidth_bps = rtc::Optional<int>( | 760 changed_params->max_bandwidth_bps = rtc::Optional<int>( |
761 params.max_bandwidth_bps == 0 ? -1 : params.max_bandwidth_bps); | 761 params.max_bandwidth_bps == 0 ? -1 : params.max_bandwidth_bps); |
(...skipping 27 matching lines...) Expand all Loading... |
789 return false; | 789 return false; |
790 } | 790 } |
791 | 791 |
792 if (changed_params.codec) { | 792 if (changed_params.codec) { |
793 const VideoCodecSettings& codec_settings = *changed_params.codec; | 793 const VideoCodecSettings& codec_settings = *changed_params.codec; |
794 send_codec_ = rtc::Optional<VideoCodecSettings>(codec_settings); | 794 send_codec_ = rtc::Optional<VideoCodecSettings>(codec_settings); |
795 LOG(LS_INFO) << "Using codec: " << codec_settings.codec.ToString(); | 795 LOG(LS_INFO) << "Using codec: " << codec_settings.codec.ToString(); |
796 } | 796 } |
797 | 797 |
798 if (changed_params.rtp_header_extensions) { | 798 if (changed_params.rtp_header_extensions) { |
799 send_rtp_extensions_ = *changed_params.rtp_header_extensions; | 799 send_rtp_extensions_ = changed_params.rtp_header_extensions; |
800 } | 800 } |
801 | 801 |
802 if (changed_params.codec || changed_params.max_bandwidth_bps) { | 802 if (changed_params.codec || changed_params.max_bandwidth_bps) { |
803 if (send_codec_) { | 803 if (send_codec_) { |
804 // TODO(holmer): Changing the codec parameters shouldn't necessarily mean | 804 // TODO(holmer): Changing the codec parameters shouldn't necessarily mean |
805 // that we change the min/max of bandwidth estimation. Reevaluate this. | 805 // that we change the min/max of bandwidth estimation. Reevaluate this. |
806 bitrate_config_ = GetBitrateConfigForCodec(send_codec_->codec); | 806 bitrate_config_ = GetBitrateConfigForCodec(send_codec_->codec); |
807 if (!changed_params.codec) { | 807 if (!changed_params.codec) { |
808 // If the codec isn't changing, set the start bitrate to -1 which means | 808 // If the codec isn't changing, set the start bitrate to -1 which means |
809 // "unchanged" so that BWE isn't affected. | 809 // "unchanged" so that BWE isn't affected. |
(...skipping 703 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1513 | 1513 |
1514 WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream( | 1514 WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream( |
1515 webrtc::Call* call, | 1515 webrtc::Call* call, |
1516 const StreamParams& sp, | 1516 const StreamParams& sp, |
1517 const webrtc::VideoSendStream::Config& config, | 1517 const webrtc::VideoSendStream::Config& config, |
1518 const VideoOptions& options, | 1518 const VideoOptions& options, |
1519 WebRtcVideoEncoderFactory* external_encoder_factory, | 1519 WebRtcVideoEncoderFactory* external_encoder_factory, |
1520 bool enable_cpu_overuse_detection, | 1520 bool enable_cpu_overuse_detection, |
1521 int max_bitrate_bps, | 1521 int max_bitrate_bps, |
1522 const rtc::Optional<VideoCodecSettings>& codec_settings, | 1522 const rtc::Optional<VideoCodecSettings>& codec_settings, |
1523 const std::vector<webrtc::RtpExtension>& rtp_extensions, | 1523 const rtc::Optional<std::vector<webrtc::RtpExtension>>& rtp_extensions, |
1524 // TODO(deadbeef): Don't duplicate information between send_params, | 1524 // TODO(deadbeef): Don't duplicate information between send_params, |
1525 // rtp_extensions, options, etc. | 1525 // rtp_extensions, options, etc. |
1526 const VideoSendParameters& send_params) | 1526 const VideoSendParameters& send_params) |
1527 : worker_thread_(rtc::Thread::Current()), | 1527 : worker_thread_(rtc::Thread::Current()), |
1528 ssrcs_(sp.ssrcs), | 1528 ssrcs_(sp.ssrcs), |
1529 ssrc_groups_(sp.ssrc_groups), | 1529 ssrc_groups_(sp.ssrc_groups), |
1530 call_(call), | 1530 call_(call), |
1531 cpu_restricted_counter_(0), | 1531 cpu_restricted_counter_(0), |
1532 number_of_cpu_adapt_changes_(0), | 1532 number_of_cpu_adapt_changes_(0), |
1533 source_(nullptr), | 1533 source_(nullptr), |
1534 external_encoder_factory_(external_encoder_factory), | 1534 external_encoder_factory_(external_encoder_factory), |
1535 stream_(nullptr), | 1535 stream_(nullptr), |
1536 parameters_(config, options, max_bitrate_bps, codec_settings), | 1536 parameters_(config, options, max_bitrate_bps, codec_settings), |
1537 rtp_parameters_(CreateRtpParametersWithOneEncoding()), | 1537 rtp_parameters_(CreateRtpParametersWithOneEncoding()), |
1538 pending_encoder_reconfiguration_(false), | 1538 pending_encoder_reconfiguration_(false), |
1539 allocated_encoder_(nullptr, webrtc::kVideoCodecUnknown, false), | 1539 allocated_encoder_(nullptr, webrtc::kVideoCodecUnknown, false), |
1540 sending_(false), | 1540 sending_(false), |
1541 last_frame_timestamp_ms_(0) { | 1541 last_frame_timestamp_ms_(0) { |
1542 parameters_.config.rtp.max_packet_size = kVideoMtu; | 1542 parameters_.config.rtp.max_packet_size = kVideoMtu; |
1543 parameters_.conference_mode = send_params.conference_mode; | 1543 parameters_.conference_mode = send_params.conference_mode; |
1544 | 1544 |
1545 sp.GetPrimarySsrcs(¶meters_.config.rtp.ssrcs); | 1545 sp.GetPrimarySsrcs(¶meters_.config.rtp.ssrcs); |
1546 sp.GetFidSsrcs(parameters_.config.rtp.ssrcs, | 1546 sp.GetFidSsrcs(parameters_.config.rtp.ssrcs, |
1547 ¶meters_.config.rtp.rtx.ssrcs); | 1547 ¶meters_.config.rtp.rtx.ssrcs); |
1548 parameters_.config.rtp.c_name = sp.cname; | 1548 parameters_.config.rtp.c_name = sp.cname; |
1549 parameters_.config.rtp.extensions = rtp_extensions; | 1549 if (rtp_extensions) { |
| 1550 parameters_.config.rtp.extensions = *rtp_extensions; |
| 1551 } |
1550 parameters_.config.rtp.rtcp_mode = send_params.rtcp.reduced_size | 1552 parameters_.config.rtp.rtcp_mode = send_params.rtcp.reduced_size |
1551 ? webrtc::RtcpMode::kReducedSize | 1553 ? webrtc::RtcpMode::kReducedSize |
1552 : webrtc::RtcpMode::kCompound; | 1554 : webrtc::RtcpMode::kCompound; |
1553 parameters_.config.overuse_callback = | 1555 parameters_.config.overuse_callback = |
1554 enable_cpu_overuse_detection ? this : nullptr; | 1556 enable_cpu_overuse_detection ? this : nullptr; |
1555 | 1557 |
1556 sink_wants_.rotation_applied = !ContainsHeaderExtension( | 1558 // Only request rotation at the source when we positively know that the remote |
1557 rtp_extensions, webrtc::RtpExtension::kVideoRotationUri); | 1559 // side doesn't support the rotation extension. This allows us to prepare the |
| 1560 // encoder in the expectation that rotation is supported - which is the common |
| 1561 // case. |
| 1562 sink_wants_.rotation_applied = |
| 1563 rtp_extensions && |
| 1564 !ContainsHeaderExtension(*rtp_extensions, |
| 1565 webrtc::RtpExtension::kVideoRotationUri); |
1558 | 1566 |
1559 if (codec_settings) { | 1567 if (codec_settings) { |
1560 SetCodec(*codec_settings); | 1568 SetCodec(*codec_settings); |
1561 } | 1569 } |
1562 } | 1570 } |
1563 | 1571 |
1564 WebRtcVideoChannel2::WebRtcVideoSendStream::~WebRtcVideoSendStream() { | 1572 WebRtcVideoChannel2::WebRtcVideoSendStream::~WebRtcVideoSendStream() { |
1565 DisconnectSource(); | 1573 DisconnectSource(); |
1566 if (stream_ != NULL) { | 1574 if (stream_ != NULL) { |
1567 call_->DestroyVideoSendStream(stream_); | 1575 call_->DestroyVideoSendStream(stream_); |
(...skipping 18 matching lines...) Expand all Loading... |
1586 frame.set_render_time_ms(render_time_ms_); | 1594 frame.set_render_time_ms(render_time_ms_); |
1587 return frame; | 1595 return frame; |
1588 } | 1596 } |
1589 | 1597 |
1590 void WebRtcVideoChannel2::WebRtcVideoSendStream::OnFrame( | 1598 void WebRtcVideoChannel2::WebRtcVideoSendStream::OnFrame( |
1591 const VideoFrame& frame) { | 1599 const VideoFrame& frame) { |
1592 TRACE_EVENT0("webrtc", "WebRtcVideoSendStream::OnFrame"); | 1600 TRACE_EVENT0("webrtc", "WebRtcVideoSendStream::OnFrame"); |
1593 webrtc::VideoFrame video_frame(frame.video_frame_buffer(), 0, 0, | 1601 webrtc::VideoFrame video_frame(frame.video_frame_buffer(), 0, 0, |
1594 frame.rotation()); | 1602 frame.rotation()); |
1595 rtc::CritScope cs(&lock_); | 1603 rtc::CritScope cs(&lock_); |
| 1604 |
| 1605 if (video_frame.width() != last_frame_info_.width || |
| 1606 video_frame.height() != last_frame_info_.height || |
| 1607 video_frame.rotation() != last_frame_info_.rotation || |
| 1608 video_frame.is_texture() != last_frame_info_.is_texture) { |
| 1609 last_frame_info_.width = video_frame.width(); |
| 1610 last_frame_info_.height = video_frame.height(); |
| 1611 last_frame_info_.rotation = video_frame.rotation(); |
| 1612 last_frame_info_.is_texture = video_frame.is_texture(); |
| 1613 pending_encoder_reconfiguration_ = true; |
| 1614 |
| 1615 LOG(LS_INFO) << "Video frame parameters changed: dimensions=" |
| 1616 << last_frame_info_.width << "x" << last_frame_info_.height |
| 1617 << ", rotation=" << last_frame_info_.rotation |
| 1618 << ", texture=" << last_frame_info_.is_texture; |
| 1619 } |
| 1620 |
1596 if (stream_ == NULL) { | 1621 if (stream_ == NULL) { |
1597 // Frame input before send codecs are configured, dropping frame. | 1622 // Frame input before send codecs are configured, dropping frame. |
1598 return; | 1623 return; |
1599 } | 1624 } |
1600 | 1625 |
1601 int64_t frame_delta_ms = frame.GetTimeStamp() / rtc::kNumNanosecsPerMillisec; | 1626 int64_t frame_delta_ms = frame.GetTimeStamp() / rtc::kNumNanosecsPerMillisec; |
1602 | 1627 |
1603 // frame->GetTimeStamp() is essentially a delta, align to webrtc time | 1628 // frame->GetTimeStamp() is essentially a delta, align to webrtc time |
1604 if (!first_frame_timestamp_ms_) { | 1629 if (!first_frame_timestamp_ms_) { |
1605 first_frame_timestamp_ms_ = | 1630 first_frame_timestamp_ms_ = |
1606 rtc::Optional<int64_t>(rtc::TimeMillis() - frame_delta_ms); | 1631 rtc::Optional<int64_t>(rtc::TimeMillis() - frame_delta_ms); |
1607 } | 1632 } |
1608 | 1633 |
1609 last_frame_timestamp_ms_ = *first_frame_timestamp_ms_ + frame_delta_ms; | 1634 last_frame_timestamp_ms_ = *first_frame_timestamp_ms_ + frame_delta_ms; |
1610 | 1635 |
1611 video_frame.set_render_time_ms(last_frame_timestamp_ms_); | 1636 video_frame.set_render_time_ms(last_frame_timestamp_ms_); |
1612 // Reconfigure codec if necessary. | 1637 |
1613 SetDimensions(video_frame.width(), video_frame.height()); | 1638 if (pending_encoder_reconfiguration_) { |
1614 last_rotation_ = video_frame.rotation(); | 1639 ReconfigureEncoder(); |
| 1640 pending_encoder_reconfiguration_ = false; |
| 1641 } |
1615 | 1642 |
1616 // Not sending, abort after reconfiguration. Reconfiguration should still | 1643 // Not sending, abort after reconfiguration. Reconfiguration should still |
1617 // occur to permit sending this input as quickly as possible once we start | 1644 // occur to permit sending this input as quickly as possible once we start |
1618 // sending (without having to reconfigure then). | 1645 // sending (without having to reconfigure then). |
1619 if (!sending_) { | 1646 if (!sending_) { |
1620 return; | 1647 return; |
1621 } | 1648 } |
1622 | 1649 |
1623 stream_->Input()->IncomingCapturedFrame(video_frame); | 1650 stream_->Input()->IncomingCapturedFrame(video_frame); |
1624 } | 1651 } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1657 first_frame_timestamp_ms_ = rtc::Optional<int64_t>(); | 1684 first_frame_timestamp_ms_ = rtc::Optional<int64_t>(); |
1658 | 1685 |
1659 if (source == nullptr && stream_ != nullptr) { | 1686 if (source == nullptr && stream_ != nullptr) { |
1660 LOG(LS_VERBOSE) << "Disabling capturer, sending black frame."; | 1687 LOG(LS_VERBOSE) << "Disabling capturer, sending black frame."; |
1661 // Force this black frame not to be dropped due to timestamp order | 1688 // Force this black frame not to be dropped due to timestamp order |
1662 // check. As IncomingCapturedFrame will drop the frame if this frame's | 1689 // check. As IncomingCapturedFrame will drop the frame if this frame's |
1663 // timestamp is less than or equal to last frame's timestamp, it is | 1690 // timestamp is less than or equal to last frame's timestamp, it is |
1664 // necessary to give this black frame a larger timestamp than the | 1691 // necessary to give this black frame a larger timestamp than the |
1665 // previous one. | 1692 // previous one. |
1666 last_frame_timestamp_ms_ += 1; | 1693 last_frame_timestamp_ms_ += 1; |
1667 stream_->Input()->IncomingCapturedFrame( | 1694 stream_->Input()->IncomingCapturedFrame(CreateBlackFrame( |
1668 CreateBlackFrame(last_dimensions_.width, last_dimensions_.height, | 1695 last_frame_info_.width, last_frame_info_.height, |
1669 last_frame_timestamp_ms_, last_rotation_)); | 1696 last_frame_timestamp_ms_, last_frame_info_.rotation)); |
1670 } | 1697 } |
1671 source_ = source; | 1698 source_ = source; |
1672 } | 1699 } |
1673 } | 1700 } |
1674 | 1701 |
1675 // |source_->AddOrUpdateSink| may not be called while holding |lock_| since | 1702 // |source_->AddOrUpdateSink| may not be called while holding |lock_| since |
1676 // that might cause a lock order inversion. | 1703 // that might cause a lock order inversion. |
1677 if (source_changing && source_) { | 1704 if (source_changing && source_) { |
1678 source_->AddOrUpdateSink(this, sink_wants_); | 1705 source_->AddOrUpdateSink(this, sink_wants_); |
1679 } | 1706 } |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1751 void WebRtcVideoChannel2::WebRtcVideoSendStream::DestroyVideoEncoder( | 1778 void WebRtcVideoChannel2::WebRtcVideoSendStream::DestroyVideoEncoder( |
1752 AllocatedEncoder* encoder) { | 1779 AllocatedEncoder* encoder) { |
1753 if (encoder->external) { | 1780 if (encoder->external) { |
1754 external_encoder_factory_->DestroyVideoEncoder(encoder->external_encoder); | 1781 external_encoder_factory_->DestroyVideoEncoder(encoder->external_encoder); |
1755 } | 1782 } |
1756 delete encoder->encoder; | 1783 delete encoder->encoder; |
1757 } | 1784 } |
1758 | 1785 |
1759 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetCodec( | 1786 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetCodec( |
1760 const VideoCodecSettings& codec_settings) { | 1787 const VideoCodecSettings& codec_settings) { |
1761 parameters_.encoder_config = | 1788 parameters_.encoder_config = CreateVideoEncoderConfig(codec_settings.codec); |
1762 CreateVideoEncoderConfig(last_dimensions_, codec_settings.codec); | |
1763 RTC_DCHECK(!parameters_.encoder_config.streams.empty()); | 1789 RTC_DCHECK(!parameters_.encoder_config.streams.empty()); |
1764 | 1790 |
1765 AllocatedEncoder new_encoder = CreateVideoEncoder(codec_settings.codec); | 1791 AllocatedEncoder new_encoder = CreateVideoEncoder(codec_settings.codec); |
1766 parameters_.config.encoder_settings.encoder = new_encoder.encoder; | 1792 parameters_.config.encoder_settings.encoder = new_encoder.encoder; |
1767 parameters_.config.encoder_settings.full_overuse_time = new_encoder.external; | 1793 parameters_.config.encoder_settings.full_overuse_time = new_encoder.external; |
1768 parameters_.config.encoder_settings.payload_name = codec_settings.codec.name; | 1794 parameters_.config.encoder_settings.payload_name = codec_settings.codec.name; |
1769 parameters_.config.encoder_settings.payload_type = codec_settings.codec.id; | 1795 parameters_.config.encoder_settings.payload_type = codec_settings.codec.id; |
1770 if (new_encoder.external) { | 1796 if (new_encoder.external) { |
1771 webrtc::VideoCodecType type = CodecTypeFromName(codec_settings.codec.name); | 1797 webrtc::VideoCodecType type = CodecTypeFromName(codec_settings.codec.name); |
1772 parameters_.config.encoder_settings.internal_source = | 1798 parameters_.config.encoder_settings.internal_source = |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1891 stream_->Start(); | 1917 stream_->Start(); |
1892 } else { | 1918 } else { |
1893 if (stream_ != nullptr) { | 1919 if (stream_ != nullptr) { |
1894 stream_->Stop(); | 1920 stream_->Stop(); |
1895 } | 1921 } |
1896 } | 1922 } |
1897 } | 1923 } |
1898 | 1924 |
1899 webrtc::VideoEncoderConfig | 1925 webrtc::VideoEncoderConfig |
1900 WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig( | 1926 WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig( |
1901 const Dimensions& dimensions, | |
1902 const VideoCodec& codec) const { | 1927 const VideoCodec& codec) const { |
1903 webrtc::VideoEncoderConfig encoder_config; | 1928 webrtc::VideoEncoderConfig encoder_config; |
1904 bool is_screencast = parameters_.options.is_screencast.value_or(false); | 1929 bool is_screencast = parameters_.options.is_screencast.value_or(false); |
1905 if (is_screencast) { | 1930 if (is_screencast) { |
1906 encoder_config.min_transmit_bitrate_bps = | 1931 encoder_config.min_transmit_bitrate_bps = |
1907 1000 * parameters_.options.screencast_min_bitrate_kbps.value_or(0); | 1932 1000 * parameters_.options.screencast_min_bitrate_kbps.value_or(0); |
1908 encoder_config.content_type = | 1933 encoder_config.content_type = |
1909 webrtc::VideoEncoderConfig::ContentType::kScreen; | 1934 webrtc::VideoEncoderConfig::ContentType::kScreen; |
1910 } else { | 1935 } else { |
1911 encoder_config.min_transmit_bitrate_bps = 0; | 1936 encoder_config.min_transmit_bitrate_bps = 0; |
1912 encoder_config.content_type = | 1937 encoder_config.content_type = |
1913 webrtc::VideoEncoderConfig::ContentType::kRealtimeVideo; | 1938 webrtc::VideoEncoderConfig::ContentType::kRealtimeVideo; |
1914 } | 1939 } |
1915 | 1940 |
1916 // Restrict dimensions according to codec max. | 1941 // Restrict dimensions according to codec max. |
1917 int width = dimensions.width; | 1942 int width = last_frame_info_.width; |
1918 int height = dimensions.height; | 1943 int height = last_frame_info_.height; |
1919 if (!is_screencast) { | 1944 if (!is_screencast) { |
1920 if (codec.width < width) | 1945 if (codec.width < width) |
1921 width = codec.width; | 1946 width = codec.width; |
1922 if (codec.height < height) | 1947 if (codec.height < height) |
1923 height = codec.height; | 1948 height = codec.height; |
1924 } | 1949 } |
1925 | 1950 |
1926 VideoCodec clamped_codec = codec; | 1951 VideoCodec clamped_codec = codec; |
1927 clamped_codec.width = width; | 1952 clamped_codec.width = width; |
1928 clamped_codec.height = height; | 1953 clamped_codec.height = height; |
1929 | 1954 |
1930 // By default, the stream count for the codec configuration should match the | 1955 // By default, the stream count for the codec configuration should match the |
1931 // number of negotiated ssrcs. But if the codec is blacklisted for simulcast | 1956 // number of negotiated ssrcs. But if the codec is blacklisted for simulcast |
1932 // or a screencast, only configure a single stream. | 1957 // or a screencast, only configure a single stream. |
1933 size_t stream_count = parameters_.config.rtp.ssrcs.size(); | 1958 size_t stream_count = parameters_.config.rtp.ssrcs.size(); |
1934 if (IsCodecBlacklistedForSimulcast(codec.name) || is_screencast) { | 1959 if (IsCodecBlacklistedForSimulcast(codec.name) || is_screencast) { |
1935 stream_count = 1; | 1960 stream_count = 1; |
1936 } | 1961 } |
1937 | 1962 |
1938 int stream_max_bitrate = | 1963 int stream_max_bitrate = |
1939 MinPositive(rtp_parameters_.encodings[0].max_bitrate_bps, | 1964 MinPositive(rtp_parameters_.encodings[0].max_bitrate_bps, |
1940 parameters_.max_bitrate_bps); | 1965 parameters_.max_bitrate_bps); |
1941 encoder_config.streams = CreateVideoStreams( | 1966 encoder_config.streams = CreateVideoStreams( |
1942 clamped_codec, parameters_.options, stream_max_bitrate, stream_count); | 1967 clamped_codec, parameters_.options, stream_max_bitrate, stream_count); |
| 1968 encoder_config.expect_encode_from_texture = last_frame_info_.is_texture; |
1943 | 1969 |
1944 // Conference mode screencast uses 2 temporal layers split at 100kbit. | 1970 // Conference mode screencast uses 2 temporal layers split at 100kbit. |
1945 if (parameters_.conference_mode && is_screencast && | 1971 if (parameters_.conference_mode && is_screencast && |
1946 encoder_config.streams.size() == 1) { | 1972 encoder_config.streams.size() == 1) { |
1947 ScreenshareLayerConfig config = ScreenshareLayerConfig::GetDefault(); | 1973 ScreenshareLayerConfig config = ScreenshareLayerConfig::GetDefault(); |
1948 | 1974 |
1949 // For screenshare in conference mode, tl0 and tl1 bitrates are piggybacked | 1975 // For screenshare in conference mode, tl0 and tl1 bitrates are piggybacked |
1950 // on the VideoCodec struct as target and max bitrates, respectively. | 1976 // on the VideoCodec struct as target and max bitrates, respectively. |
1951 // See eg. webrtc::VP8EncoderImpl::SetRates(). | 1977 // See eg. webrtc::VP8EncoderImpl::SetRates(). |
1952 encoder_config.streams[0].target_bitrate_bps = | 1978 encoder_config.streams[0].target_bitrate_bps = |
1953 config.tl0_bitrate_kbps * 1000; | 1979 config.tl0_bitrate_kbps * 1000; |
1954 encoder_config.streams[0].max_bitrate_bps = config.tl1_bitrate_kbps * 1000; | 1980 encoder_config.streams[0].max_bitrate_bps = config.tl1_bitrate_kbps * 1000; |
1955 encoder_config.streams[0].temporal_layer_thresholds_bps.clear(); | 1981 encoder_config.streams[0].temporal_layer_thresholds_bps.clear(); |
1956 encoder_config.streams[0].temporal_layer_thresholds_bps.push_back( | 1982 encoder_config.streams[0].temporal_layer_thresholds_bps.push_back( |
1957 config.tl0_bitrate_kbps * 1000); | 1983 config.tl0_bitrate_kbps * 1000); |
1958 } | 1984 } |
1959 if (CodecNamesEq(codec.name, kVp9CodecName) && !is_screencast && | 1985 if (CodecNamesEq(codec.name, kVp9CodecName) && !is_screencast && |
1960 encoder_config.streams.size() == 1) { | 1986 encoder_config.streams.size() == 1) { |
1961 encoder_config.streams[0].temporal_layer_thresholds_bps.resize( | 1987 encoder_config.streams[0].temporal_layer_thresholds_bps.resize( |
1962 GetDefaultVp9TemporalLayers() - 1); | 1988 GetDefaultVp9TemporalLayers() - 1); |
1963 } | 1989 } |
1964 return encoder_config; | 1990 return encoder_config; |
1965 } | 1991 } |
1966 | 1992 |
1967 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetDimensions( | 1993 void WebRtcVideoChannel2::WebRtcVideoSendStream::ReconfigureEncoder() { |
1968 int width, | |
1969 int height) { | |
1970 if (last_dimensions_.width == width && last_dimensions_.height == height && | |
1971 !pending_encoder_reconfiguration_) { | |
1972 // Configured using the same parameters, do not reconfigure. | |
1973 return; | |
1974 } | |
1975 | |
1976 last_dimensions_.width = width; | |
1977 last_dimensions_.height = height; | |
1978 | |
1979 RTC_DCHECK(!parameters_.encoder_config.streams.empty()); | 1994 RTC_DCHECK(!parameters_.encoder_config.streams.empty()); |
1980 | 1995 |
1981 RTC_CHECK(parameters_.codec_settings); | 1996 RTC_CHECK(parameters_.codec_settings); |
1982 VideoCodecSettings codec_settings = *parameters_.codec_settings; | 1997 VideoCodecSettings codec_settings = *parameters_.codec_settings; |
1983 | 1998 |
1984 webrtc::VideoEncoderConfig encoder_config = | 1999 webrtc::VideoEncoderConfig encoder_config = |
1985 CreateVideoEncoderConfig(last_dimensions_, codec_settings.codec); | 2000 CreateVideoEncoderConfig(codec_settings.codec); |
1986 | 2001 |
1987 encoder_config.encoder_specific_settings = ConfigureVideoEncoderSettings( | 2002 encoder_config.encoder_specific_settings = ConfigureVideoEncoderSettings( |
1988 codec_settings.codec); | 2003 codec_settings.codec); |
1989 | 2004 |
1990 stream_->ReconfigureVideoEncoder(encoder_config); | 2005 stream_->ReconfigureVideoEncoder(encoder_config); |
1991 | 2006 |
1992 encoder_config.encoder_specific_settings = NULL; | 2007 encoder_config.encoder_specific_settings = NULL; |
1993 pending_encoder_reconfiguration_ = false; | |
1994 | 2008 |
1995 parameters_.encoder_config = encoder_config; | 2009 parameters_.encoder_config = encoder_config; |
1996 } | 2010 } |
1997 | 2011 |
1998 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSend(bool send) { | 2012 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSend(bool send) { |
1999 rtc::CritScope cs(&lock_); | 2013 rtc::CritScope cs(&lock_); |
2000 sending_ = send; | 2014 sending_ = send; |
2001 UpdateSendState(); | 2015 UpdateSendState(); |
2002 } | 2016 } |
2003 | 2017 |
(...skipping 24 matching lines...) Expand all Loading... |
2028 rtc::Optional<int> max_pixel_count; | 2042 rtc::Optional<int> max_pixel_count; |
2029 rtc::Optional<int> max_pixel_count_step_up; | 2043 rtc::Optional<int> max_pixel_count_step_up; |
2030 if (load == kOveruse) { | 2044 if (load == kOveruse) { |
2031 if (cpu_restricted_counter_ >= kMaxCpuDowngrades) { | 2045 if (cpu_restricted_counter_ >= kMaxCpuDowngrades) { |
2032 return; | 2046 return; |
2033 } | 2047 } |
2034 // The input video frame size will have a resolution with less than or | 2048 // The input video frame size will have a resolution with less than or |
2035 // equal to |max_pixel_count| depending on how the source can scale the | 2049 // equal to |max_pixel_count| depending on how the source can scale the |
2036 // input frame size. | 2050 // input frame size. |
2037 max_pixel_count = rtc::Optional<int>( | 2051 max_pixel_count = rtc::Optional<int>( |
2038 (last_dimensions_.height * last_dimensions_.width * 3) / 5); | 2052 (last_frame_info_.height * last_frame_info_.width * 3) / 5); |
2039 // Increase |number_of_cpu_adapt_changes_| if | 2053 // Increase |number_of_cpu_adapt_changes_| if |
2040 // sink_wants_.max_pixel_count will be changed since | 2054 // sink_wants_.max_pixel_count will be changed since |
2041 // last time |source_->AddOrUpdateSink| was called. That is, this will | 2055 // last time |source_->AddOrUpdateSink| was called. That is, this will |
2042 // result in a new request for the source to change resolution. | 2056 // result in a new request for the source to change resolution. |
2043 if (!sink_wants_.max_pixel_count || | 2057 if (!sink_wants_.max_pixel_count || |
2044 *sink_wants_.max_pixel_count > *max_pixel_count) { | 2058 *sink_wants_.max_pixel_count > *max_pixel_count) { |
2045 ++number_of_cpu_adapt_changes_; | 2059 ++number_of_cpu_adapt_changes_; |
2046 ++cpu_restricted_counter_; | 2060 ++cpu_restricted_counter_; |
2047 } | 2061 } |
2048 } else { | 2062 } else { |
2049 RTC_DCHECK(load == kUnderuse); | 2063 RTC_DCHECK(load == kUnderuse); |
2050 // The input video frame size will have a resolution with "one step up" | 2064 // The input video frame size will have a resolution with "one step up" |
2051 // pixels than |max_pixel_count_step_up| where "one step up" depends on | 2065 // pixels than |max_pixel_count_step_up| where "one step up" depends on |
2052 // how the source can scale the input frame size. | 2066 // how the source can scale the input frame size. |
2053 max_pixel_count_step_up = rtc::Optional<int>(last_dimensions_.height * | 2067 max_pixel_count_step_up = |
2054 last_dimensions_.width); | 2068 rtc::Optional<int>(last_frame_info_.height * last_frame_info_.width); |
2055 // Increase |number_of_cpu_adapt_changes_| if | 2069 // Increase |number_of_cpu_adapt_changes_| if |
2056 // sink_wants_.max_pixel_count_step_up will be changed since | 2070 // sink_wants_.max_pixel_count_step_up will be changed since |
2057 // last time |source_->AddOrUpdateSink| was called. That is, this will | 2071 // last time |source_->AddOrUpdateSink| was called. That is, this will |
2058 // result in a new request for the source to change resolution. | 2072 // result in a new request for the source to change resolution. |
2059 if (sink_wants_.max_pixel_count || | 2073 if (sink_wants_.max_pixel_count || |
2060 (sink_wants_.max_pixel_count_step_up && | 2074 (sink_wants_.max_pixel_count_step_up && |
2061 *sink_wants_.max_pixel_count_step_up < *max_pixel_count_step_up)) { | 2075 *sink_wants_.max_pixel_count_step_up < *max_pixel_count_step_up)) { |
2062 ++number_of_cpu_adapt_changes_; | 2076 ++number_of_cpu_adapt_changes_; |
2063 --cpu_restricted_counter_; | 2077 --cpu_restricted_counter_; |
2064 } | 2078 } |
(...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2613 rtx_mapping[video_codecs[i].codec.id] != | 2627 rtx_mapping[video_codecs[i].codec.id] != |
2614 fec_settings.red_payload_type) { | 2628 fec_settings.red_payload_type) { |
2615 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; | 2629 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; |
2616 } | 2630 } |
2617 } | 2631 } |
2618 | 2632 |
2619 return video_codecs; | 2633 return video_codecs; |
2620 } | 2634 } |
2621 | 2635 |
2622 } // namespace cricket | 2636 } // namespace cricket |
OLD | NEW |