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 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 for (const auto& codec : codecs) { | 94 for (const auto& codec : codecs) { |
95 if (CodecNamesEq(codec.name.c_str(), kVp8CodecName)) { | 95 if (CodecNamesEq(codec.name.c_str(), kVp8CodecName)) { |
96 return true; | 96 return true; |
97 } | 97 } |
98 } | 98 } |
99 return false; | 99 return false; |
100 } | 100 } |
101 | 101 |
102 webrtc::VideoEncoder* CreateVideoEncoder( | 102 webrtc::VideoEncoder* CreateVideoEncoder( |
103 const cricket::VideoCodec& codec) override { | 103 const cricket::VideoCodec& codec) override { |
104 RTC_DCHECK(factory_ != NULL); | 104 RTC_DCHECK(factory_ != nullptr); |
105 // If it's a codec type we can simulcast, create a wrapped encoder. | 105 // If it's a codec type we can simulcast, create a wrapped encoder. |
106 if (CodecNamesEq(codec.name.c_str(), kVp8CodecName)) { | 106 if (CodecNamesEq(codec.name.c_str(), kVp8CodecName)) { |
107 return new webrtc::SimulcastEncoderAdapter( | 107 return new webrtc::SimulcastEncoderAdapter( |
108 new EncoderFactoryAdapter(factory_)); | 108 new EncoderFactoryAdapter(factory_)); |
109 } | 109 } |
110 webrtc::VideoEncoder* encoder = factory_->CreateVideoEncoder(codec); | 110 webrtc::VideoEncoder* encoder = factory_->CreateVideoEncoder(codec); |
111 if (encoder) { | 111 if (encoder) { |
112 non_simulcast_encoders_.push_back(encoder); | 112 non_simulcast_encoders_.push_back(encoder); |
113 } | 113 } |
114 return encoder; | 114 return encoder; |
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
416 // VP9 denoising is disabled by default. | 416 // VP9 denoising is disabled by default. |
417 vp9_settings.denoisingOn = codec_default_denoising ? false : denoising; | 417 vp9_settings.denoisingOn = codec_default_denoising ? false : denoising; |
418 vp9_settings.frameDroppingOn = frame_dropping; | 418 vp9_settings.frameDroppingOn = frame_dropping; |
419 return new rtc::RefCountedObject< | 419 return new rtc::RefCountedObject< |
420 webrtc::VideoEncoderConfig::Vp9EncoderSpecificSettings>(vp9_settings); | 420 webrtc::VideoEncoderConfig::Vp9EncoderSpecificSettings>(vp9_settings); |
421 } | 421 } |
422 return nullptr; | 422 return nullptr; |
423 } | 423 } |
424 | 424 |
425 DefaultUnsignalledSsrcHandler::DefaultUnsignalledSsrcHandler() | 425 DefaultUnsignalledSsrcHandler::DefaultUnsignalledSsrcHandler() |
426 : default_recv_ssrc_(0), default_sink_(NULL) {} | 426 : default_recv_ssrc_(0), default_sink_(nullptr) {} |
427 | 427 |
428 UnsignalledSsrcHandler::Action DefaultUnsignalledSsrcHandler::OnUnsignalledSsrc( | 428 UnsignalledSsrcHandler::Action DefaultUnsignalledSsrcHandler::OnUnsignalledSsrc( |
429 WebRtcVideoChannel2* channel, | 429 WebRtcVideoChannel2* channel, |
430 uint32_t ssrc) { | 430 uint32_t ssrc) { |
431 if (default_recv_ssrc_ != 0) { // Already one default stream. | 431 if (default_recv_ssrc_ != 0) { // Already one default stream. |
432 LOG(LS_WARNING) << "Unknown SSRC, but default receive stream already set."; | 432 LOG(LS_WARNING) << "Unknown SSRC, but default receive stream already set."; |
433 return kDropPacket; | 433 return kDropPacket; |
434 } | 434 } |
435 | 435 |
436 StreamParams sp; | 436 StreamParams sp; |
(...skipping 17 matching lines...) Expand all Loading... |
454 VideoMediaChannel* channel, | 454 VideoMediaChannel* channel, |
455 rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) { | 455 rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) { |
456 default_sink_ = sink; | 456 default_sink_ = sink; |
457 if (default_recv_ssrc_ != 0) { | 457 if (default_recv_ssrc_ != 0) { |
458 channel->SetSink(default_recv_ssrc_, default_sink_); | 458 channel->SetSink(default_recv_ssrc_, default_sink_); |
459 } | 459 } |
460 } | 460 } |
461 | 461 |
462 WebRtcVideoEngine2::WebRtcVideoEngine2() | 462 WebRtcVideoEngine2::WebRtcVideoEngine2() |
463 : initialized_(false), | 463 : initialized_(false), |
464 external_decoder_factory_(NULL), | 464 external_decoder_factory_(nullptr), |
465 external_encoder_factory_(NULL) { | 465 external_encoder_factory_(nullptr) { |
466 LOG(LS_INFO) << "WebRtcVideoEngine2::WebRtcVideoEngine2()"; | 466 LOG(LS_INFO) << "WebRtcVideoEngine2::WebRtcVideoEngine2()"; |
467 } | 467 } |
468 | 468 |
469 WebRtcVideoEngine2::~WebRtcVideoEngine2() { | 469 WebRtcVideoEngine2::~WebRtcVideoEngine2() { |
470 LOG(LS_INFO) << "WebRtcVideoEngine2::~WebRtcVideoEngine2"; | 470 LOG(LS_INFO) << "WebRtcVideoEngine2::~WebRtcVideoEngine2"; |
471 } | 471 } |
472 | 472 |
473 void WebRtcVideoEngine2::Init() { | 473 void WebRtcVideoEngine2::Init() { |
474 LOG(LS_INFO) << "WebRtcVideoEngine2::Init"; | 474 LOG(LS_INFO) << "WebRtcVideoEngine2::Init"; |
475 initialized_ = true; | 475 initialized_ = true; |
(...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1010 // been moved to VideoBroadcaster. So remove the argument from this | 1010 // been moved to VideoBroadcaster. So remove the argument from this |
1011 // method. | 1011 // method. |
1012 bool WebRtcVideoChannel2::SetVideoSend( | 1012 bool WebRtcVideoChannel2::SetVideoSend( |
1013 uint32_t ssrc, | 1013 uint32_t ssrc, |
1014 bool enable, | 1014 bool enable, |
1015 const VideoOptions* options, | 1015 const VideoOptions* options, |
1016 rtc::VideoSourceInterface<webrtc::VideoFrame>* source) { | 1016 rtc::VideoSourceInterface<webrtc::VideoFrame>* source) { |
1017 TRACE_EVENT0("webrtc", "SetVideoSend"); | 1017 TRACE_EVENT0("webrtc", "SetVideoSend"); |
1018 RTC_DCHECK(ssrc != 0); | 1018 RTC_DCHECK(ssrc != 0); |
1019 LOG(LS_INFO) << "SetVideoSend (ssrc= " << ssrc << ", enable = " << enable | 1019 LOG(LS_INFO) << "SetVideoSend (ssrc= " << ssrc << ", enable = " << enable |
1020 << ", options: " << (options ? options->ToString() : "nullptr") | 1020 << ", options: " << (options ? options->ToString() : "null") |
1021 << ", source = " << (source ? "(source)" : "nullptr") << ")"; | 1021 << ", source = " << (source ? "(source)" : "null") << ")"; |
1022 | 1022 |
1023 rtc::CritScope stream_lock(&stream_crit_); | 1023 rtc::CritScope stream_lock(&stream_crit_); |
1024 const auto& kv = send_streams_.find(ssrc); | 1024 const auto& kv = send_streams_.find(ssrc); |
1025 if (kv == send_streams_.end()) { | 1025 if (kv == send_streams_.end()) { |
1026 // Allow unknown ssrc only if source is null. | 1026 // Allow unknown ssrc only if source is null. |
1027 RTC_CHECK(source == nullptr); | 1027 RTC_CHECK(source == nullptr); |
1028 LOG(LS_ERROR) << "No sending stream on ssrc " << ssrc; | 1028 LOG(LS_ERROR) << "No sending stream on ssrc " << ssrc; |
1029 return false; | 1029 return false; |
1030 } | 1030 } |
1031 | 1031 |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1256 } | 1256 } |
1257 DeleteReceiveStream(stream->second); | 1257 DeleteReceiveStream(stream->second); |
1258 receive_streams_.erase(stream); | 1258 receive_streams_.erase(stream); |
1259 | 1259 |
1260 return true; | 1260 return true; |
1261 } | 1261 } |
1262 | 1262 |
1263 bool WebRtcVideoChannel2::SetSink( | 1263 bool WebRtcVideoChannel2::SetSink( |
1264 uint32_t ssrc, | 1264 uint32_t ssrc, |
1265 rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) { | 1265 rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) { |
1266 LOG(LS_INFO) << "SetSink: ssrc:" << ssrc << " " | 1266 LOG(LS_INFO) << "SetSink: ssrc:" << ssrc << " " << (sink ? "(ptr)" : "null"); |
1267 << (sink ? "(ptr)" : "nullptr"); | |
1268 if (ssrc == 0) { | 1267 if (ssrc == 0) { |
1269 default_unsignalled_ssrc_handler_.SetDefaultSink(this, sink); | 1268 default_unsignalled_ssrc_handler_.SetDefaultSink(this, sink); |
1270 return true; | 1269 return true; |
1271 } | 1270 } |
1272 | 1271 |
1273 rtc::CritScope stream_lock(&stream_crit_); | 1272 rtc::CritScope stream_lock(&stream_crit_); |
1274 std::map<uint32_t, WebRtcVideoReceiveStream*>::iterator it = | 1273 std::map<uint32_t, WebRtcVideoReceiveStream*>::iterator it = |
1275 receive_streams_.find(ssrc); | 1274 receive_streams_.find(ssrc); |
1276 if (it == receive_streams_.end()) { | 1275 if (it == receive_streams_.end()) { |
1277 return false; | 1276 return false; |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1586 } | 1585 } |
1587 parameters_.config.rtp.rtcp_mode = send_params.rtcp.reduced_size | 1586 parameters_.config.rtp.rtcp_mode = send_params.rtcp.reduced_size |
1588 ? webrtc::RtcpMode::kReducedSize | 1587 ? webrtc::RtcpMode::kReducedSize |
1589 : webrtc::RtcpMode::kCompound; | 1588 : webrtc::RtcpMode::kCompound; |
1590 if (codec_settings) { | 1589 if (codec_settings) { |
1591 SetCodec(*codec_settings); | 1590 SetCodec(*codec_settings); |
1592 } | 1591 } |
1593 } | 1592 } |
1594 | 1593 |
1595 WebRtcVideoChannel2::WebRtcVideoSendStream::~WebRtcVideoSendStream() { | 1594 WebRtcVideoChannel2::WebRtcVideoSendStream::~WebRtcVideoSendStream() { |
1596 if (stream_ != NULL) { | 1595 if (stream_ != nullptr) { |
1597 call_->DestroyVideoSendStream(stream_); | 1596 call_->DestroyVideoSendStream(stream_); |
1598 } | 1597 } |
1599 DestroyVideoEncoder(&allocated_encoder_); | 1598 DestroyVideoEncoder(&allocated_encoder_); |
1600 } | 1599 } |
1601 | 1600 |
1602 bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetVideoSend( | 1601 bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetVideoSend( |
1603 bool enable, | 1602 bool enable, |
1604 const VideoOptions* options, | 1603 const VideoOptions* options, |
1605 rtc::VideoSourceInterface<webrtc::VideoFrame>* source) { | 1604 rtc::VideoSourceInterface<webrtc::VideoFrame>* source) { |
1606 TRACE_EVENT0("webrtc", "WebRtcVideoSendStream::SetVideoSend"); | 1605 TRACE_EVENT0("webrtc", "WebRtcVideoSendStream::SetVideoSend"); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1675 false /* is_external */); | 1674 false /* is_external */); |
1676 } | 1675 } |
1677 return AllocatedEncoder( | 1676 return AllocatedEncoder( |
1678 internal_encoder_factory_->CreateVideoEncoder(codec), codec, | 1677 internal_encoder_factory_->CreateVideoEncoder(codec), codec, |
1679 false /* is_external */); | 1678 false /* is_external */); |
1680 } | 1679 } |
1681 | 1680 |
1682 // This shouldn't happen, we should not be trying to create something we don't | 1681 // This shouldn't happen, we should not be trying to create something we don't |
1683 // support. | 1682 // support. |
1684 RTC_NOTREACHED(); | 1683 RTC_NOTREACHED(); |
1685 return AllocatedEncoder(NULL, cricket::VideoCodec(), false); | 1684 return AllocatedEncoder(nullptr, cricket::VideoCodec(), false); |
1686 } | 1685 } |
1687 | 1686 |
1688 void WebRtcVideoChannel2::WebRtcVideoSendStream::DestroyVideoEncoder( | 1687 void WebRtcVideoChannel2::WebRtcVideoSendStream::DestroyVideoEncoder( |
1689 AllocatedEncoder* encoder) { | 1688 AllocatedEncoder* encoder) { |
1690 RTC_DCHECK_RUN_ON(&thread_checker_); | 1689 RTC_DCHECK_RUN_ON(&thread_checker_); |
1691 if (encoder->external) { | 1690 if (encoder->external) { |
1692 external_encoder_factory_->DestroyVideoEncoder(encoder->external_encoder); | 1691 external_encoder_factory_->DestroyVideoEncoder(encoder->external_encoder); |
1693 } | 1692 } |
1694 delete encoder->encoder; | 1693 delete encoder->encoder; |
1695 } | 1694 } |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1897 VideoCodecSettings codec_settings = *parameters_.codec_settings; | 1896 VideoCodecSettings codec_settings = *parameters_.codec_settings; |
1898 | 1897 |
1899 webrtc::VideoEncoderConfig encoder_config = | 1898 webrtc::VideoEncoderConfig encoder_config = |
1900 CreateVideoEncoderConfig(codec_settings.codec); | 1899 CreateVideoEncoderConfig(codec_settings.codec); |
1901 | 1900 |
1902 encoder_config.encoder_specific_settings = ConfigureVideoEncoderSettings( | 1901 encoder_config.encoder_specific_settings = ConfigureVideoEncoderSettings( |
1903 codec_settings.codec); | 1902 codec_settings.codec); |
1904 | 1903 |
1905 stream_->ReconfigureVideoEncoder(encoder_config.Copy()); | 1904 stream_->ReconfigureVideoEncoder(encoder_config.Copy()); |
1906 | 1905 |
1907 encoder_config.encoder_specific_settings = NULL; | 1906 encoder_config.encoder_specific_settings = nullptr; |
1908 | 1907 |
1909 parameters_.encoder_config = std::move(encoder_config); | 1908 parameters_.encoder_config = std::move(encoder_config); |
1910 } | 1909 } |
1911 | 1910 |
1912 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSend(bool send) { | 1911 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSend(bool send) { |
1913 RTC_DCHECK_RUN_ON(&thread_checker_); | 1912 RTC_DCHECK_RUN_ON(&thread_checker_); |
1914 sending_ = send; | 1913 sending_ = send; |
1915 UpdateSendState(); | 1914 UpdateSendState(); |
1916 } | 1915 } |
1917 | 1916 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1954 RTC_DCHECK_RUN_ON(&thread_checker_); | 1953 RTC_DCHECK_RUN_ON(&thread_checker_); |
1955 for (uint32_t ssrc : parameters_.config.rtp.ssrcs) | 1954 for (uint32_t ssrc : parameters_.config.rtp.ssrcs) |
1956 info.add_ssrc(ssrc); | 1955 info.add_ssrc(ssrc); |
1957 | 1956 |
1958 if (parameters_.codec_settings) { | 1957 if (parameters_.codec_settings) { |
1959 info.codec_name = parameters_.codec_settings->codec.name; | 1958 info.codec_name = parameters_.codec_settings->codec.name; |
1960 info.codec_payload_type = rtc::Optional<int>( | 1959 info.codec_payload_type = rtc::Optional<int>( |
1961 parameters_.codec_settings->codec.id); | 1960 parameters_.codec_settings->codec.id); |
1962 } | 1961 } |
1963 | 1962 |
1964 if (stream_ == NULL) | 1963 if (stream_ == nullptr) |
1965 return info; | 1964 return info; |
1966 | 1965 |
1967 webrtc::VideoSendStream::Stats stats = stream_->GetStats(); | 1966 webrtc::VideoSendStream::Stats stats = stream_->GetStats(); |
1968 | 1967 |
1969 if (log_stats) | 1968 if (log_stats) |
1970 LOG(LS_INFO) << stats.ToString(rtc::TimeMillis()); | 1969 LOG(LS_INFO) << stats.ToString(rtc::TimeMillis()); |
1971 | 1970 |
1972 info.adapt_changes = stats.number_of_cpu_adapt_changes; | 1971 info.adapt_changes = stats.number_of_cpu_adapt_changes; |
1973 info.adapt_reason = | 1972 info.adapt_reason = |
1974 stats.cpu_limited_resolution ? ADAPTREASON_CPU : ADAPTREASON_NONE; | 1973 stats.cpu_limited_resolution ? ADAPTREASON_CPU : ADAPTREASON_NONE; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2021 static_cast<float>(first_stream_stats.rtcp_stats.fraction_lost) / | 2020 static_cast<float>(first_stream_stats.rtcp_stats.fraction_lost) / |
2022 (1 << 8); | 2021 (1 << 8); |
2023 } | 2022 } |
2024 | 2023 |
2025 return info; | 2024 return info; |
2026 } | 2025 } |
2027 | 2026 |
2028 void WebRtcVideoChannel2::WebRtcVideoSendStream::FillBandwidthEstimationInfo( | 2027 void WebRtcVideoChannel2::WebRtcVideoSendStream::FillBandwidthEstimationInfo( |
2029 BandwidthEstimationInfo* bwe_info) { | 2028 BandwidthEstimationInfo* bwe_info) { |
2030 RTC_DCHECK_RUN_ON(&thread_checker_); | 2029 RTC_DCHECK_RUN_ON(&thread_checker_); |
2031 if (stream_ == NULL) { | 2030 if (stream_ == nullptr) { |
2032 return; | 2031 return; |
2033 } | 2032 } |
2034 webrtc::VideoSendStream::Stats stats = stream_->GetStats(); | 2033 webrtc::VideoSendStream::Stats stats = stream_->GetStats(); |
2035 for (std::map<uint32_t, webrtc::VideoSendStream::StreamStats>::iterator it = | 2034 for (std::map<uint32_t, webrtc::VideoSendStream::StreamStats>::iterator it = |
2036 stats.substreams.begin(); | 2035 stats.substreams.begin(); |
2037 it != stats.substreams.end(); ++it) { | 2036 it != stats.substreams.end(); ++it) { |
2038 bwe_info->transmit_bitrate += it->second.total_bitrate_bps; | 2037 bwe_info->transmit_bitrate += it->second.total_bitrate_bps; |
2039 bwe_info->retransmit_bitrate += it->second.retransmit_bitrate_bps; | 2038 bwe_info->retransmit_bitrate += it->second.retransmit_bitrate_bps; |
2040 } | 2039 } |
2041 bwe_info->target_enc_bitrate += stats.target_media_bitrate_bps; | 2040 bwe_info->target_enc_bitrate += stats.target_media_bitrate_bps; |
2042 bwe_info->actual_enc_bitrate += stats.media_bitrate_bps; | 2041 bwe_info->actual_enc_bitrate += stats.media_bitrate_bps; |
2043 } | 2042 } |
2044 | 2043 |
2045 void WebRtcVideoChannel2::WebRtcVideoSendStream::RecreateWebRtcStream() { | 2044 void WebRtcVideoChannel2::WebRtcVideoSendStream::RecreateWebRtcStream() { |
2046 RTC_DCHECK_RUN_ON(&thread_checker_); | 2045 RTC_DCHECK_RUN_ON(&thread_checker_); |
2047 if (stream_ != NULL) { | 2046 if (stream_ != nullptr) { |
2048 call_->DestroyVideoSendStream(stream_); | 2047 call_->DestroyVideoSendStream(stream_); |
2049 } | 2048 } |
2050 | 2049 |
2051 RTC_CHECK(parameters_.codec_settings); | 2050 RTC_CHECK(parameters_.codec_settings); |
2052 RTC_DCHECK_EQ((parameters_.encoder_config.content_type == | 2051 RTC_DCHECK_EQ((parameters_.encoder_config.content_type == |
2053 webrtc::VideoEncoderConfig::ContentType::kScreen), | 2052 webrtc::VideoEncoderConfig::ContentType::kScreen), |
2054 parameters_.options.is_screencast.value_or(false)) | 2053 parameters_.options.is_screencast.value_or(false)) |
2055 << "encoder content type inconsistent with screencast option"; | 2054 << "encoder content type inconsistent with screencast option"; |
2056 parameters_.encoder_config.encoder_specific_settings = | 2055 parameters_.encoder_config.encoder_specific_settings = |
2057 ConfigureVideoEncoderSettings(parameters_.codec_settings->codec); | 2056 ConfigureVideoEncoderSettings(parameters_.codec_settings->codec); |
2058 | 2057 |
2059 webrtc::VideoSendStream::Config config = parameters_.config.Copy(); | 2058 webrtc::VideoSendStream::Config config = parameters_.config.Copy(); |
2060 if (!config.rtp.rtx.ssrcs.empty() && config.rtp.rtx.payload_type == -1) { | 2059 if (!config.rtp.rtx.ssrcs.empty() && config.rtp.rtx.payload_type == -1) { |
2061 LOG(LS_WARNING) << "RTX SSRCs configured but there's no configured RTX " | 2060 LOG(LS_WARNING) << "RTX SSRCs configured but there's no configured RTX " |
2062 "payload type the set codec. Ignoring RTX."; | 2061 "payload type the set codec. Ignoring RTX."; |
2063 config.rtp.rtx.ssrcs.clear(); | 2062 config.rtp.rtx.ssrcs.clear(); |
2064 } | 2063 } |
2065 stream_ = call_->CreateVideoSendStream(std::move(config), | 2064 stream_ = call_->CreateVideoSendStream(std::move(config), |
2066 parameters_.encoder_config.Copy()); | 2065 parameters_.encoder_config.Copy()); |
2067 | 2066 |
2068 parameters_.encoder_config.encoder_specific_settings = NULL; | 2067 parameters_.encoder_config.encoder_specific_settings = nullptr; |
2069 | 2068 |
2070 if (source_) { | 2069 if (source_) { |
2071 // Do not adapt resolution for screen content as this will likely result in | 2070 // Do not adapt resolution for screen content as this will likely result in |
2072 // blurry and unreadable text. | 2071 // blurry and unreadable text. |
2073 // |this| acts like a VideoSource to make sure SinkWants are handled on the | 2072 // |this| acts like a VideoSource to make sure SinkWants are handled on the |
2074 // correct thread. | 2073 // correct thread. |
2075 stream_->SetSource( | 2074 stream_->SetSource( |
2076 this, enable_cpu_overuse_detection_ && | 2075 this, enable_cpu_overuse_detection_ && |
2077 !parameters_.options.is_screencast.value_or(false) | 2076 !parameters_.options.is_screencast.value_or(false) |
2078 ? webrtc::VideoSendStream::DegradationPreference::kBalanced | 2077 ? webrtc::VideoSendStream::DegradationPreference::kBalanced |
2079 : webrtc::VideoSendStream::DegradationPreference:: | 2078 : webrtc::VideoSendStream::DegradationPreference:: |
2080 kMaintainResolution); | 2079 kMaintainResolution); |
2081 } | 2080 } |
2082 | 2081 |
2083 // Call stream_->Start() if necessary conditions are met. | 2082 // Call stream_->Start() if necessary conditions are met. |
2084 UpdateSendState(); | 2083 UpdateSendState(); |
2085 } | 2084 } |
2086 | 2085 |
2087 WebRtcVideoChannel2::WebRtcVideoReceiveStream::WebRtcVideoReceiveStream( | 2086 WebRtcVideoChannel2::WebRtcVideoReceiveStream::WebRtcVideoReceiveStream( |
2088 webrtc::Call* call, | 2087 webrtc::Call* call, |
2089 const StreamParams& sp, | 2088 const StreamParams& sp, |
2090 webrtc::VideoReceiveStream::Config config, | 2089 webrtc::VideoReceiveStream::Config config, |
2091 WebRtcVideoDecoderFactory* external_decoder_factory, | 2090 WebRtcVideoDecoderFactory* external_decoder_factory, |
2092 bool default_stream, | 2091 bool default_stream, |
2093 const std::vector<VideoCodecSettings>& recv_codecs, | 2092 const std::vector<VideoCodecSettings>& recv_codecs, |
2094 const webrtc::FlexfecReceiveStream::Config& flexfec_config) | 2093 const webrtc::FlexfecReceiveStream::Config& flexfec_config) |
2095 : call_(call), | 2094 : call_(call), |
2096 stream_params_(sp), | 2095 stream_params_(sp), |
2097 stream_(NULL), | 2096 stream_(nullptr), |
2098 default_stream_(default_stream), | 2097 default_stream_(default_stream), |
2099 config_(std::move(config)), | 2098 config_(std::move(config)), |
2100 flexfec_config_(flexfec_config), | 2099 flexfec_config_(flexfec_config), |
2101 flexfec_stream_(nullptr), | 2100 flexfec_stream_(nullptr), |
2102 external_decoder_factory_(external_decoder_factory), | 2101 external_decoder_factory_(external_decoder_factory), |
2103 sink_(NULL), | 2102 sink_(nullptr), |
2104 first_frame_timestamp_(-1), | 2103 first_frame_timestamp_(-1), |
2105 estimated_remote_start_ntp_time_ms_(0) { | 2104 estimated_remote_start_ntp_time_ms_(0) { |
2106 config_.renderer = this; | 2105 config_.renderer = this; |
2107 std::vector<AllocatedDecoder> old_decoders; | 2106 std::vector<AllocatedDecoder> old_decoders; |
2108 ConfigureCodecs(recv_codecs, &old_decoders); | 2107 ConfigureCodecs(recv_codecs, &old_decoders); |
2109 RecreateWebRtcStream(); | 2108 RecreateWebRtcStream(); |
2110 RTC_DCHECK(old_decoders.empty()); | 2109 RTC_DCHECK(old_decoders.empty()); |
2111 } | 2110 } |
2112 | 2111 |
2113 WebRtcVideoChannel2::WebRtcVideoReceiveStream::AllocatedDecoder:: | 2112 WebRtcVideoChannel2::WebRtcVideoReceiveStream::AllocatedDecoder:: |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2160 | 2159 |
2161 for (size_t i = 0; i < old_decoders->size(); ++i) { | 2160 for (size_t i = 0; i < old_decoders->size(); ++i) { |
2162 if ((*old_decoders)[i].type == type) { | 2161 if ((*old_decoders)[i].type == type) { |
2163 AllocatedDecoder decoder = (*old_decoders)[i]; | 2162 AllocatedDecoder decoder = (*old_decoders)[i]; |
2164 (*old_decoders)[i] = old_decoders->back(); | 2163 (*old_decoders)[i] = old_decoders->back(); |
2165 old_decoders->pop_back(); | 2164 old_decoders->pop_back(); |
2166 return decoder; | 2165 return decoder; |
2167 } | 2166 } |
2168 } | 2167 } |
2169 | 2168 |
2170 if (external_decoder_factory_ != NULL) { | 2169 if (external_decoder_factory_ != nullptr) { |
2171 webrtc::VideoDecoder* decoder = | 2170 webrtc::VideoDecoder* decoder = |
2172 external_decoder_factory_->CreateVideoDecoderWithParams( | 2171 external_decoder_factory_->CreateVideoDecoderWithParams( |
2173 type, {stream_params_.id}); | 2172 type, {stream_params_.id}); |
2174 if (decoder != NULL) { | 2173 if (decoder != nullptr) { |
2175 return AllocatedDecoder(decoder, type, true /* is_external */); | 2174 return AllocatedDecoder(decoder, type, true /* is_external */); |
2176 } | 2175 } |
2177 } | 2176 } |
2178 | 2177 |
2179 InternalDecoderFactory internal_decoder_factory; | 2178 InternalDecoderFactory internal_decoder_factory; |
2180 return AllocatedDecoder(internal_decoder_factory.CreateVideoDecoderWithParams( | 2179 return AllocatedDecoder(internal_decoder_factory.CreateVideoDecoderWithParams( |
2181 type, {stream_params_.id}), | 2180 type, {stream_params_.id}), |
2182 type, false /* is_external */); | 2181 type, false /* is_external */); |
2183 } | 2182 } |
2184 | 2183 |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2322 if (first_frame_timestamp_ < 0) | 2321 if (first_frame_timestamp_ < 0) |
2323 first_frame_timestamp_ = frame.timestamp(); | 2322 first_frame_timestamp_ = frame.timestamp(); |
2324 int64_t rtp_time_elapsed_since_first_frame = | 2323 int64_t rtp_time_elapsed_since_first_frame = |
2325 (timestamp_wraparound_handler_.Unwrap(frame.timestamp()) - | 2324 (timestamp_wraparound_handler_.Unwrap(frame.timestamp()) - |
2326 first_frame_timestamp_); | 2325 first_frame_timestamp_); |
2327 int64_t elapsed_time_ms = rtp_time_elapsed_since_first_frame / | 2326 int64_t elapsed_time_ms = rtp_time_elapsed_since_first_frame / |
2328 (cricket::kVideoCodecClockrate / 1000); | 2327 (cricket::kVideoCodecClockrate / 1000); |
2329 if (frame.ntp_time_ms() > 0) | 2328 if (frame.ntp_time_ms() > 0) |
2330 estimated_remote_start_ntp_time_ms_ = frame.ntp_time_ms() - elapsed_time_ms; | 2329 estimated_remote_start_ntp_time_ms_ = frame.ntp_time_ms() - elapsed_time_ms; |
2331 | 2330 |
2332 if (sink_ == NULL) { | 2331 if (sink_ == nullptr) { |
2333 LOG(LS_WARNING) << "VideoReceiveStream not connected to a VideoSink."; | 2332 LOG(LS_WARNING) << "VideoReceiveStream not connected to a VideoSink."; |
2334 return; | 2333 return; |
2335 } | 2334 } |
2336 | 2335 |
2337 sink_->OnFrame(frame); | 2336 sink_->OnFrame(frame); |
2338 } | 2337 } |
2339 | 2338 |
2340 bool WebRtcVideoChannel2::WebRtcVideoReceiveStream::IsDefaultStream() const { | 2339 bool WebRtcVideoChannel2::WebRtcVideoReceiveStream::IsDefaultStream() const { |
2341 return default_stream_; | 2340 return default_stream_; |
2342 } | 2341 } |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2527 rtx_mapping[video_codecs[i].codec.id] != | 2526 rtx_mapping[video_codecs[i].codec.id] != |
2528 ulpfec_config.red_payload_type) { | 2527 ulpfec_config.red_payload_type) { |
2529 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; | 2528 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; |
2530 } | 2529 } |
2531 } | 2530 } |
2532 | 2531 |
2533 return video_codecs; | 2532 return video_codecs; |
2534 } | 2533 } |
2535 | 2534 |
2536 } // namespace cricket | 2535 } // namespace cricket |
OLD | NEW |