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 |
11 #include "webrtc/media/engine/webrtcvideoengine.h" | 11 #include "webrtc/media/engine/webrtcvideoengine.h" |
12 | 12 |
13 #include <stdio.h> | 13 #include <stdio.h> |
14 #include <algorithm> | 14 #include <algorithm> |
15 #include <set> | 15 #include <set> |
16 #include <string> | 16 #include <string> |
17 #include <utility> | 17 #include <utility> |
18 | 18 |
19 #include "webrtc/api/video/i420_buffer.h" | 19 #include "webrtc/api/video/i420_buffer.h" |
20 #include "webrtc/api/video_codecs/video_decoder.h" | 20 #include "webrtc/api/video_codecs/video_decoder.h" |
21 #include "webrtc/api/video_codecs/video_encoder.h" | 21 #include "webrtc/api/video_codecs/video_encoder.h" |
22 #include "webrtc/call/call.h" | 22 #include "webrtc/call/call.h" |
23 #include "webrtc/common_video/h264/profile_level_id.h" | 23 #include "webrtc/common_video/h264/profile_level_id.h" |
24 #include "webrtc/media/engine/constants.h" | 24 #include "webrtc/media/engine/constants.h" |
25 #include "webrtc/media/engine/internaldecoderfactory.h" | 25 #include "webrtc/media/engine/internaldecoderfactory.h" |
26 #include "webrtc/media/engine/internalencoderfactory.h" | 26 #include "webrtc/media/engine/internalencoderfactory.h" |
27 #include "webrtc/media/engine/scopedvideodecoder.h" | |
27 #include "webrtc/media/engine/scopedvideoencoder.h" | 28 #include "webrtc/media/engine/scopedvideoencoder.h" |
28 #include "webrtc/media/engine/simulcast.h" | 29 #include "webrtc/media/engine/simulcast.h" |
29 #include "webrtc/media/engine/simulcast_encoder_adapter.h" | 30 #include "webrtc/media/engine/simulcast_encoder_adapter.h" |
30 #include "webrtc/media/engine/videodecodersoftwarefallbackwrapper.h" | 31 #include "webrtc/media/engine/videodecodersoftwarefallbackwrapper.h" |
31 #include "webrtc/media/engine/videoencodersoftwarefallbackwrapper.h" | 32 #include "webrtc/media/engine/videoencodersoftwarefallbackwrapper.h" |
32 #include "webrtc/media/engine/webrtcmediaengine.h" | 33 #include "webrtc/media/engine/webrtcmediaengine.h" |
33 #include "webrtc/media/engine/webrtcvideoencoderfactory.h" | 34 #include "webrtc/media/engine/webrtcvideoencoderfactory.h" |
34 #include "webrtc/media/engine/webrtcvoiceengine.h" | 35 #include "webrtc/media/engine/webrtcvoiceengine.h" |
35 #include "webrtc/rtc_base/copyonwritebuffer.h" | 36 #include "webrtc/rtc_base/copyonwritebuffer.h" |
36 #include "webrtc/rtc_base/logging.h" | 37 #include "webrtc/rtc_base/logging.h" |
(...skipping 27 matching lines...) Expand all Loading... | |
64 | 65 |
65 virtual AllocatedEncoder CreateVideoEncoder( | 66 virtual AllocatedEncoder CreateVideoEncoder( |
66 const VideoCodec& codec, | 67 const VideoCodec& codec, |
67 bool is_conference_mode_screenshare) const = 0; | 68 bool is_conference_mode_screenshare) const = 0; |
68 | 69 |
69 virtual std::vector<VideoCodec> GetSupportedCodecs() const = 0; | 70 virtual std::vector<VideoCodec> GetSupportedCodecs() const = 0; |
70 | 71 |
71 virtual std::unique_ptr<EncoderFactoryAdapter> clone() const = 0; | 72 virtual std::unique_ptr<EncoderFactoryAdapter> clone() const = 0; |
72 }; | 73 }; |
73 | 74 |
75 class DecoderFactoryAdapter { | |
76 public: | |
77 struct AllocatedDecoder { | |
78 AllocatedDecoder() = default; | |
79 AllocatedDecoder(std::unique_ptr<webrtc::VideoDecoder> decoder, | |
80 bool is_hardware_accelerated); | |
81 | |
82 std::unique_ptr<webrtc::VideoDecoder> decoder; | |
83 bool is_hardware_accelerated; | |
magjed_webrtc
2017/09/01 11:15:04
The variable 'is_hardware_accelerated' is not need
andersc
2017/09/01 12:43:45
Removed in CL https://codereview.webrtc.org/301182
magjed_webrtc
2017/09/01 13:04:30
Since you are already changing this logic I think
andersc
2017/09/01 13:16:08
Done.
| |
84 }; | |
85 | |
86 virtual ~DecoderFactoryAdapter() {} | |
87 | |
88 virtual AllocatedDecoder CreateVideoDecoder( | |
89 const webrtc::VideoCodecType type, | |
90 const StreamParams stream_params) const = 0; | |
91 | |
92 virtual std::unique_ptr<DecoderFactoryAdapter> clone() const = 0; | |
93 }; | |
94 | |
74 namespace { | 95 namespace { |
75 | 96 |
76 // Wraps cricket::WebRtcVideoEncoderFactory* into common EncoderFactoryAdapter | 97 // Wraps cricket::WebRtcVideoEncoderFactory* into common EncoderFactoryAdapter |
77 // interface. | 98 // interface. |
78 // TODO(magjed): Add wrapper class for future webrtc::VideoEncoderFactory | 99 // TODO(magjed): Add wrapper class for future webrtc::VideoEncoderFactory |
79 // interface, https://bugs.chromium.org/p/webrtc/issues/detail?id=7925. | 100 // interface, https://bugs.chromium.org/p/webrtc/issues/detail?id=7925. |
80 class CricketEncoderFactoryAdapter : public EncoderFactoryAdapter { | 101 class CricketEncoderFactoryAdapter : public EncoderFactoryAdapter { |
81 public: | 102 public: |
82 explicit CricketEncoderFactoryAdapter( | 103 explicit CricketEncoderFactoryAdapter( |
83 WebRtcVideoEncoderFactory* external_encoder_factory) | 104 WebRtcVideoEncoderFactory* external_encoder_factory) |
(...skipping 13 matching lines...) Expand all Loading... | |
97 | 118 |
98 std::unique_ptr<EncoderFactoryAdapter> clone() const override { | 119 std::unique_ptr<EncoderFactoryAdapter> clone() const override { |
99 return std::unique_ptr<EncoderFactoryAdapter>( | 120 return std::unique_ptr<EncoderFactoryAdapter>( |
100 new CricketEncoderFactoryAdapter(*this)); | 121 new CricketEncoderFactoryAdapter(*this)); |
101 } | 122 } |
102 | 123 |
103 const std::unique_ptr<WebRtcVideoEncoderFactory> internal_encoder_factory_; | 124 const std::unique_ptr<WebRtcVideoEncoderFactory> internal_encoder_factory_; |
104 WebRtcVideoEncoderFactory* const external_encoder_factory_; | 125 WebRtcVideoEncoderFactory* const external_encoder_factory_; |
105 }; | 126 }; |
106 | 127 |
128 class CricketDecoderFactoryAdapter : public DecoderFactoryAdapter { | |
129 public: | |
130 explicit CricketDecoderFactoryAdapter( | |
131 WebRtcVideoDecoderFactory* external_decoder_factory) | |
132 : internal_decoder_factory_(new InternalDecoderFactory()), | |
133 external_decoder_factory_(external_decoder_factory) {} | |
134 | |
135 private: | |
136 explicit CricketDecoderFactoryAdapter( | |
137 const CricketDecoderFactoryAdapter& other) | |
138 : CricketDecoderFactoryAdapter(other.external_decoder_factory_) {} | |
139 | |
140 AllocatedDecoder CreateVideoDecoder( | |
141 const webrtc::VideoCodecType type, | |
142 const StreamParams stream_params) const override; | |
143 | |
144 std::unique_ptr<DecoderFactoryAdapter> clone() const override { | |
145 return std::unique_ptr<DecoderFactoryAdapter>( | |
146 new CricketDecoderFactoryAdapter(*this)); | |
147 } | |
148 | |
149 const std::unique_ptr<WebRtcVideoDecoderFactory> internal_decoder_factory_; | |
150 WebRtcVideoDecoderFactory* const external_decoder_factory_; | |
151 }; | |
152 | |
107 // If this field trial is enabled, we will enable sending FlexFEC and disable | 153 // If this field trial is enabled, we will enable sending FlexFEC and disable |
108 // sending ULPFEC whenever the former has been negotiated in the SDPs. | 154 // sending ULPFEC whenever the former has been negotiated in the SDPs. |
109 bool IsFlexfecFieldTrialEnabled() { | 155 bool IsFlexfecFieldTrialEnabled() { |
110 return webrtc::field_trial::IsEnabled("WebRTC-FlexFEC-03"); | 156 return webrtc::field_trial::IsEnabled("WebRTC-FlexFEC-03"); |
111 } | 157 } |
112 | 158 |
113 // If this field trial is enabled, the "flexfec-03" codec may have been | 159 // If this field trial is enabled, the "flexfec-03" codec may have been |
114 // advertised as being supported in the local SDP. That means that we must be | 160 // advertised as being supported in the local SDP. That means that we must be |
115 // ready to receive FlexFEC packets. See internalencoderfactory.cc. | 161 // ready to receive FlexFEC packets. See internalencoderfactory.cc. |
116 bool IsFlexfecAdvertisedFieldTrialEnabled() { | 162 bool IsFlexfecAdvertisedFieldTrialEnabled() { |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
360 default_sink_ = sink; | 406 default_sink_ = sink; |
361 rtc::Optional<uint32_t> default_recv_ssrc = | 407 rtc::Optional<uint32_t> default_recv_ssrc = |
362 channel->GetDefaultReceiveStreamSsrc(); | 408 channel->GetDefaultReceiveStreamSsrc(); |
363 if (default_recv_ssrc) { | 409 if (default_recv_ssrc) { |
364 channel->SetSink(*default_recv_ssrc, default_sink_); | 410 channel->SetSink(*default_recv_ssrc, default_sink_); |
365 } | 411 } |
366 } | 412 } |
367 | 413 |
368 WebRtcVideoEngine::WebRtcVideoEngine() | 414 WebRtcVideoEngine::WebRtcVideoEngine() |
369 : initialized_(false), | 415 : initialized_(false), |
370 external_decoder_factory_(NULL), | 416 decoder_factory_(new CricketDecoderFactoryAdapter( |
417 nullptr /* external_decoder_factory */)), | |
371 encoder_factory_(new CricketEncoderFactoryAdapter( | 418 encoder_factory_(new CricketEncoderFactoryAdapter( |
372 nullptr /* external_encoder_factory */)) { | 419 nullptr /* external_encoder_factory */)) { |
373 LOG(LS_INFO) << "WebRtcVideoEngine::WebRtcVideoEngine()"; | 420 LOG(LS_INFO) << "WebRtcVideoEngine::WebRtcVideoEngine()"; |
374 } | 421 } |
375 | 422 |
376 WebRtcVideoEngine::~WebRtcVideoEngine() { | 423 WebRtcVideoEngine::~WebRtcVideoEngine() { |
377 LOG(LS_INFO) << "WebRtcVideoEngine::~WebRtcVideoEngine"; | 424 LOG(LS_INFO) << "WebRtcVideoEngine::~WebRtcVideoEngine"; |
378 } | 425 } |
379 | 426 |
380 void WebRtcVideoEngine::Init() { | 427 void WebRtcVideoEngine::Init() { |
381 LOG(LS_INFO) << "WebRtcVideoEngine::Init"; | 428 LOG(LS_INFO) << "WebRtcVideoEngine::Init"; |
382 initialized_ = true; | 429 initialized_ = true; |
383 } | 430 } |
384 | 431 |
385 WebRtcVideoChannel* WebRtcVideoEngine::CreateChannel( | 432 WebRtcVideoChannel* WebRtcVideoEngine::CreateChannel( |
386 webrtc::Call* call, | 433 webrtc::Call* call, |
387 const MediaConfig& config, | 434 const MediaConfig& config, |
388 const VideoOptions& options) { | 435 const VideoOptions& options) { |
389 RTC_DCHECK(initialized_); | 436 RTC_DCHECK(initialized_); |
390 LOG(LS_INFO) << "CreateChannel. Options: " << options.ToString(); | 437 LOG(LS_INFO) << "CreateChannel. Options: " << options.ToString(); |
391 return new WebRtcVideoChannel(call, config, options, *encoder_factory_, | 438 return new WebRtcVideoChannel(call, config, options, *encoder_factory_, |
392 external_decoder_factory_); | 439 *decoder_factory_); |
393 } | 440 } |
394 | 441 |
395 std::vector<VideoCodec> WebRtcVideoEngine::codecs() const { | 442 std::vector<VideoCodec> WebRtcVideoEngine::codecs() const { |
396 return encoder_factory_->GetSupportedCodecs(); | 443 return encoder_factory_->GetSupportedCodecs(); |
397 } | 444 } |
398 | 445 |
399 RtpCapabilities WebRtcVideoEngine::GetCapabilities() const { | 446 RtpCapabilities WebRtcVideoEngine::GetCapabilities() const { |
400 RtpCapabilities capabilities; | 447 RtpCapabilities capabilities; |
401 capabilities.header_extensions.push_back( | 448 capabilities.header_extensions.push_back( |
402 webrtc::RtpExtension(webrtc::RtpExtension::kTimestampOffsetUri, | 449 webrtc::RtpExtension(webrtc::RtpExtension::kTimestampOffsetUri, |
(...skipping 15 matching lines...) Expand all Loading... | |
418 webrtc::RtpExtension::kVideoContentTypeDefaultId)); | 465 webrtc::RtpExtension::kVideoContentTypeDefaultId)); |
419 capabilities.header_extensions.push_back( | 466 capabilities.header_extensions.push_back( |
420 webrtc::RtpExtension(webrtc::RtpExtension::kVideoTimingUri, | 467 webrtc::RtpExtension(webrtc::RtpExtension::kVideoTimingUri, |
421 webrtc::RtpExtension::kVideoTimingDefaultId)); | 468 webrtc::RtpExtension::kVideoTimingDefaultId)); |
422 return capabilities; | 469 return capabilities; |
423 } | 470 } |
424 | 471 |
425 void WebRtcVideoEngine::SetExternalDecoderFactory( | 472 void WebRtcVideoEngine::SetExternalDecoderFactory( |
426 WebRtcVideoDecoderFactory* decoder_factory) { | 473 WebRtcVideoDecoderFactory* decoder_factory) { |
427 RTC_DCHECK(!initialized_); | 474 RTC_DCHECK(!initialized_); |
428 external_decoder_factory_ = decoder_factory; | 475 decoder_factory_.reset(new CricketDecoderFactoryAdapter(decoder_factory)); |
429 } | 476 } |
430 | 477 |
431 void WebRtcVideoEngine::SetExternalEncoderFactory( | 478 void WebRtcVideoEngine::SetExternalEncoderFactory( |
432 WebRtcVideoEncoderFactory* encoder_factory) { | 479 WebRtcVideoEncoderFactory* encoder_factory) { |
433 RTC_DCHECK(!initialized_); | 480 RTC_DCHECK(!initialized_); |
434 encoder_factory_.reset(new CricketEncoderFactoryAdapter(encoder_factory)); | 481 encoder_factory_.reset(new CricketEncoderFactoryAdapter(encoder_factory)); |
435 } | 482 } |
436 | 483 |
437 // This function will assign dynamic payload types (in the range [96, 127]) to | 484 // This function will assign dynamic payload types (in the range [96, 127]) to |
438 // the input codecs, and also add associated RTX codecs for recognized codecs | 485 // the input codecs, and also add associated RTX codecs for recognized codecs |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
496 } | 543 } |
497 | 544 |
498 return AssignPayloadTypesAndAddAssociatedRtxCodecs(codecs); | 545 return AssignPayloadTypesAndAddAssociatedRtxCodecs(codecs); |
499 } | 546 } |
500 | 547 |
501 WebRtcVideoChannel::WebRtcVideoChannel( | 548 WebRtcVideoChannel::WebRtcVideoChannel( |
502 webrtc::Call* call, | 549 webrtc::Call* call, |
503 const MediaConfig& config, | 550 const MediaConfig& config, |
504 const VideoOptions& options, | 551 const VideoOptions& options, |
505 const EncoderFactoryAdapter& encoder_factory, | 552 const EncoderFactoryAdapter& encoder_factory, |
506 WebRtcVideoDecoderFactory* external_decoder_factory) | 553 const DecoderFactoryAdapter& decoder_factory) |
507 : VideoMediaChannel(config), | 554 : VideoMediaChannel(config), |
508 call_(call), | 555 call_(call), |
509 unsignalled_ssrc_handler_(&default_unsignalled_ssrc_handler_), | 556 unsignalled_ssrc_handler_(&default_unsignalled_ssrc_handler_), |
510 video_config_(config.video), | 557 video_config_(config.video), |
511 encoder_factory_(encoder_factory.clone()), | 558 encoder_factory_(encoder_factory.clone()), |
512 external_decoder_factory_(external_decoder_factory), | 559 decoder_factory_(decoder_factory.clone()), |
513 default_send_options_(options), | 560 default_send_options_(options), |
514 last_stats_log_ms_(-1) { | 561 last_stats_log_ms_(-1) { |
515 RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 562 RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
516 | 563 |
517 rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc; | 564 rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc; |
518 sending_ = false; | 565 sending_ = false; |
519 recv_codecs_ = MapCodecs(encoder_factory_->GetSupportedCodecs()); | 566 recv_codecs_ = MapCodecs(encoder_factory_->GetSupportedCodecs()); |
520 recv_flexfec_payload_type_ = recv_codecs_.front().flexfec_payload_type; | 567 recv_flexfec_payload_type_ = recv_codecs_.front().flexfec_payload_type; |
521 } | 568 } |
522 | 569 |
(...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1118 | 1165 |
1119 webrtc::VideoReceiveStream::Config config(this); | 1166 webrtc::VideoReceiveStream::Config config(this); |
1120 webrtc::FlexfecReceiveStream::Config flexfec_config(this); | 1167 webrtc::FlexfecReceiveStream::Config flexfec_config(this); |
1121 ConfigureReceiverRtp(&config, &flexfec_config, sp); | 1168 ConfigureReceiverRtp(&config, &flexfec_config, sp); |
1122 | 1169 |
1123 config.disable_prerenderer_smoothing = | 1170 config.disable_prerenderer_smoothing = |
1124 video_config_.disable_prerenderer_smoothing; | 1171 video_config_.disable_prerenderer_smoothing; |
1125 config.sync_group = sp.sync_label; | 1172 config.sync_group = sp.sync_label; |
1126 | 1173 |
1127 receive_streams_[ssrc] = new WebRtcVideoReceiveStream( | 1174 receive_streams_[ssrc] = new WebRtcVideoReceiveStream( |
1128 call_, sp, std::move(config), external_decoder_factory_, default_stream, | 1175 call_, sp, std::move(config), *decoder_factory_, default_stream, |
1129 recv_codecs_, flexfec_config); | 1176 recv_codecs_, flexfec_config); |
1130 | 1177 |
1131 return true; | 1178 return true; |
1132 } | 1179 } |
1133 | 1180 |
1134 void WebRtcVideoChannel::ConfigureReceiverRtp( | 1181 void WebRtcVideoChannel::ConfigureReceiverRtp( |
1135 webrtc::VideoReceiveStream::Config* config, | 1182 webrtc::VideoReceiveStream::Config* config, |
1136 webrtc::FlexfecReceiveStream::Config* flexfec_config, | 1183 webrtc::FlexfecReceiveStream::Config* flexfec_config, |
1137 const StreamParams& sp) const { | 1184 const StreamParams& sp) const { |
1138 uint32_t ssrc = sp.first_ssrc(); | 1185 uint32_t ssrc = sp.first_ssrc(); |
(...skipping 917 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2056 } | 2103 } |
2057 | 2104 |
2058 // Call stream_->Start() if necessary conditions are met. | 2105 // Call stream_->Start() if necessary conditions are met. |
2059 UpdateSendState(); | 2106 UpdateSendState(); |
2060 } | 2107 } |
2061 | 2108 |
2062 WebRtcVideoChannel::WebRtcVideoReceiveStream::WebRtcVideoReceiveStream( | 2109 WebRtcVideoChannel::WebRtcVideoReceiveStream::WebRtcVideoReceiveStream( |
2063 webrtc::Call* call, | 2110 webrtc::Call* call, |
2064 const StreamParams& sp, | 2111 const StreamParams& sp, |
2065 webrtc::VideoReceiveStream::Config config, | 2112 webrtc::VideoReceiveStream::Config config, |
2066 WebRtcVideoDecoderFactory* external_decoder_factory, | 2113 const DecoderFactoryAdapter& decoder_factory, |
2067 bool default_stream, | 2114 bool default_stream, |
2068 const std::vector<VideoCodecSettings>& recv_codecs, | 2115 const std::vector<VideoCodecSettings>& recv_codecs, |
2069 const webrtc::FlexfecReceiveStream::Config& flexfec_config) | 2116 const webrtc::FlexfecReceiveStream::Config& flexfec_config) |
2070 : call_(call), | 2117 : call_(call), |
2071 stream_params_(sp), | 2118 stream_params_(sp), |
2072 stream_(NULL), | 2119 stream_(NULL), |
2073 default_stream_(default_stream), | 2120 default_stream_(default_stream), |
2074 config_(std::move(config)), | 2121 config_(std::move(config)), |
2075 flexfec_config_(flexfec_config), | 2122 flexfec_config_(flexfec_config), |
2076 flexfec_stream_(nullptr), | 2123 flexfec_stream_(nullptr), |
2077 external_decoder_factory_(external_decoder_factory), | 2124 decoder_factory_(decoder_factory.clone()), |
2078 sink_(NULL), | 2125 sink_(NULL), |
2079 first_frame_timestamp_(-1), | 2126 first_frame_timestamp_(-1), |
2080 estimated_remote_start_ntp_time_ms_(0) { | 2127 estimated_remote_start_ntp_time_ms_(0) { |
2081 config_.renderer = this; | 2128 config_.renderer = this; |
2082 std::vector<AllocatedDecoder> old_decoders; | 2129 std::map<webrtc::VideoCodecType, std::unique_ptr<webrtc::VideoDecoder>> |
2130 old_decoders; | |
2083 ConfigureCodecs(recv_codecs, &old_decoders); | 2131 ConfigureCodecs(recv_codecs, &old_decoders); |
2084 ConfigureFlexfecCodec(flexfec_config.payload_type); | 2132 ConfigureFlexfecCodec(flexfec_config.payload_type); |
2085 MaybeRecreateWebRtcFlexfecStream(); | 2133 MaybeRecreateWebRtcFlexfecStream(); |
2086 RecreateWebRtcVideoStream(); | 2134 RecreateWebRtcVideoStream(); |
2087 RTC_DCHECK(old_decoders.empty()); | 2135 RTC_DCHECK(old_decoders.empty()); |
2088 } | 2136 } |
2089 | 2137 |
2090 WebRtcVideoChannel::WebRtcVideoReceiveStream::AllocatedDecoder:: | 2138 DecoderFactoryAdapter::AllocatedDecoder::AllocatedDecoder( |
2091 AllocatedDecoder(webrtc::VideoDecoder* decoder, | 2139 std::unique_ptr<webrtc::VideoDecoder> decoder, |
2092 webrtc::VideoCodecType type, | 2140 bool is_hardware_accelerated) |
2093 bool external) | 2141 : decoder(std::move(decoder)), |
2094 : decoder(decoder), | 2142 is_hardware_accelerated(is_hardware_accelerated) {} |
2095 external_decoder(nullptr), | |
2096 type(type), | |
2097 external(external) { | |
2098 if (external) { | |
2099 external_decoder = decoder; | |
2100 this->decoder = | |
2101 new webrtc::VideoDecoderSoftwareFallbackWrapper(type, external_decoder); | |
2102 } | |
2103 } | |
2104 | 2143 |
2105 WebRtcVideoChannel::WebRtcVideoReceiveStream::~WebRtcVideoReceiveStream() { | 2144 WebRtcVideoChannel::WebRtcVideoReceiveStream::~WebRtcVideoReceiveStream() { |
2106 if (flexfec_stream_) { | 2145 if (flexfec_stream_) { |
2107 MaybeDissociateFlexfecFromVideo(); | 2146 MaybeDissociateFlexfecFromVideo(); |
2108 call_->DestroyFlexfecReceiveStream(flexfec_stream_); | 2147 call_->DestroyFlexfecReceiveStream(flexfec_stream_); |
2109 } | 2148 } |
2110 call_->DestroyVideoReceiveStream(stream_); | 2149 call_->DestroyVideoReceiveStream(stream_); |
2111 ClearDecoders(&allocated_decoders_); | 2150 allocated_decoders_.clear(); |
2112 } | 2151 } |
2113 | 2152 |
2114 const std::vector<uint32_t>& | 2153 const std::vector<uint32_t>& |
2115 WebRtcVideoChannel::WebRtcVideoReceiveStream::GetSsrcs() const { | 2154 WebRtcVideoChannel::WebRtcVideoReceiveStream::GetSsrcs() const { |
2116 return stream_params_.ssrcs; | 2155 return stream_params_.ssrcs; |
2117 } | 2156 } |
2118 | 2157 |
2119 rtc::Optional<uint32_t> | 2158 rtc::Optional<uint32_t> |
2120 WebRtcVideoChannel::WebRtcVideoReceiveStream::GetFirstPrimarySsrc() const { | 2159 WebRtcVideoChannel::WebRtcVideoReceiveStream::GetFirstPrimarySsrc() const { |
2121 std::vector<uint32_t> primary_ssrcs; | 2160 std::vector<uint32_t> primary_ssrcs; |
2122 stream_params_.GetPrimarySsrcs(&primary_ssrcs); | 2161 stream_params_.GetPrimarySsrcs(&primary_ssrcs); |
2123 | 2162 |
2124 if (primary_ssrcs.empty()) { | 2163 if (primary_ssrcs.empty()) { |
2125 LOG(LS_WARNING) << "Empty primary ssrcs vector, returning empty optional"; | 2164 LOG(LS_WARNING) << "Empty primary ssrcs vector, returning empty optional"; |
2126 return rtc::Optional<uint32_t>(); | 2165 return rtc::Optional<uint32_t>(); |
2127 } else { | 2166 } else { |
2128 return rtc::Optional<uint32_t>(primary_ssrcs[0]); | 2167 return rtc::Optional<uint32_t>(primary_ssrcs[0]); |
2129 } | 2168 } |
2130 } | 2169 } |
2131 | 2170 |
2132 WebRtcVideoChannel::WebRtcVideoReceiveStream::AllocatedDecoder | 2171 DecoderFactoryAdapter::AllocatedDecoder |
2133 WebRtcVideoChannel::WebRtcVideoReceiveStream::CreateOrReuseVideoDecoder( | 2172 CricketDecoderFactoryAdapter::CreateVideoDecoder( |
2134 std::vector<AllocatedDecoder>* old_decoders, | 2173 const webrtc::VideoCodecType type, |
2135 const VideoCodec& codec) { | 2174 const StreamParams stream_params) const { |
magjed_webrtc
2017/09/01 11:15:04
This should be a reference, i.e. 'const StreamPara
andersc
2017/09/01 12:43:45
Yes, that is nicer
| |
2136 webrtc::VideoCodecType type = webrtc::PayloadStringToCodecType(codec.name); | 2175 if (external_decoder_factory_ != nullptr) { |
2137 | 2176 std::unique_ptr<webrtc::VideoDecoder> external_decoder = |
2138 for (size_t i = 0; i < old_decoders->size(); ++i) { | 2177 CreateScopedVideoDecoder(external_decoder_factory_, type, |
2139 if ((*old_decoders)[i].type == type) { | 2178 {stream_params.id}); |
2140 AllocatedDecoder decoder = (*old_decoders)[i]; | 2179 if (external_decoder) { |
2141 (*old_decoders)[i] = old_decoders->back(); | 2180 std::unique_ptr<webrtc::VideoDecoder> internal_decoder( |
2142 old_decoders->pop_back(); | 2181 new webrtc::VideoDecoderSoftwareFallbackWrapper( |
2143 return decoder; | 2182 type, std::move(external_decoder))); |
2183 return AllocatedDecoder(std::move(internal_decoder), | |
2184 true /* is_hardware_accelerated */); | |
2144 } | 2185 } |
2145 } | 2186 } |
2146 | 2187 |
2147 if (external_decoder_factory_ != NULL) { | 2188 std::unique_ptr<webrtc::VideoDecoder> internal_decoder = |
2148 webrtc::VideoDecoder* decoder = | 2189 CreateScopedVideoDecoder(internal_decoder_factory_.get(), type, |
magjed_webrtc
2017/09/01 11:15:04
I looked at the InternalDecoderFactory::DestroyVid
andersc
2017/09/01 12:43:45
Acknowledged.
| |
2149 external_decoder_factory_->CreateVideoDecoderWithParams( | 2190 {stream_params.id}); |
2150 type, {stream_params_.id}); | 2191 return AllocatedDecoder(std::move(internal_decoder), |
2151 if (decoder != NULL) { | 2192 false /* is_hardware_accelerated */); |
2152 return AllocatedDecoder(decoder, type, true /* is_external */); | |
2153 } | |
2154 } | |
2155 | |
2156 InternalDecoderFactory internal_decoder_factory; | |
2157 return AllocatedDecoder(internal_decoder_factory.CreateVideoDecoderWithParams( | |
2158 type, {stream_params_.id}), | |
2159 type, false /* is_external */); | |
2160 } | 2193 } |
2161 | 2194 |
2162 void WebRtcVideoChannel::WebRtcVideoReceiveStream::ConfigureCodecs( | 2195 void WebRtcVideoChannel::WebRtcVideoReceiveStream::ConfigureCodecs( |
2163 const std::vector<VideoCodecSettings>& recv_codecs, | 2196 const std::vector<VideoCodecSettings>& recv_codecs, |
2164 std::vector<AllocatedDecoder>* old_decoders) { | 2197 std::map<webrtc::VideoCodecType, std::unique_ptr<webrtc::VideoDecoder>>* |
2165 *old_decoders = allocated_decoders_; | 2198 old_decoders) { |
2199 *old_decoders = std::move(allocated_decoders_); | |
magjed_webrtc
2017/09/01 11:15:04
Hmm, this is a very interesting use case of std::m
andersc
2017/09/01 12:43:45
Makes sense.
| |
2166 allocated_decoders_.clear(); | 2200 allocated_decoders_.clear(); |
2167 config_.decoders.clear(); | 2201 config_.decoders.clear(); |
2168 for (size_t i = 0; i < recv_codecs.size(); ++i) { | 2202 for (size_t i = 0; i < recv_codecs.size(); ++i) { |
2169 AllocatedDecoder allocated_decoder = | 2203 webrtc::VideoCodecType type = |
2170 CreateOrReuseVideoDecoder(old_decoders, recv_codecs[i].codec); | 2204 webrtc::PayloadStringToCodecType(recv_codecs[i].codec.name); |
2171 allocated_decoders_.push_back(allocated_decoder); | 2205 std::unique_ptr<webrtc::VideoDecoder> new_decoder; |
2206 | |
2207 auto it = old_decoders->find(type); | |
2208 if (it != old_decoders->end()) { | |
2209 new_decoder = std::move((*old_decoders)[type]); | |
2210 old_decoders->erase(type); | |
magjed_webrtc
2017/09/01 11:15:04
You have an iterator to the object now, so you sho
andersc
2017/09/01 12:43:45
Acknowledged.
| |
2211 } | |
2212 | |
2213 if (!new_decoder) { | |
2214 DecoderFactoryAdapter::AllocatedDecoder new_allocated_decoder = | |
2215 decoder_factory_->CreateVideoDecoder(type, stream_params_); | |
2216 new_decoder = std::unique_ptr<webrtc::VideoDecoder>( | |
2217 std::move(new_allocated_decoder.decoder)); | |
2218 // TODO(andersc): are we using the is_hardware_accelerated field for | |
magjed_webrtc
2017/09/01 11:15:04
Indeed this does not seem to be used.
andersc
2017/09/01 12:43:45
Acknowledged.
| |
2219 // anything? | |
2220 } | |
2172 | 2221 |
2173 webrtc::VideoReceiveStream::Decoder decoder; | 2222 webrtc::VideoReceiveStream::Decoder decoder; |
2174 decoder.decoder = allocated_decoder.decoder; | 2223 decoder.decoder = new_decoder.get(); |
2175 decoder.payload_type = recv_codecs[i].codec.id; | 2224 decoder.payload_type = recv_codecs[i].codec.id; |
2176 decoder.payload_name = recv_codecs[i].codec.name; | 2225 decoder.payload_name = recv_codecs[i].codec.name; |
2177 decoder.codec_params = recv_codecs[i].codec.params; | 2226 decoder.codec_params = recv_codecs[i].codec.params; |
2178 config_.decoders.push_back(decoder); | 2227 config_.decoders.push_back(decoder); |
2228 | |
2229 allocated_decoders_.insert(std::make_pair(type, std::move(new_decoder))); | |
2179 } | 2230 } |
2180 | 2231 |
2181 config_.rtp.rtx_associated_payload_types.clear(); | 2232 config_.rtp.rtx_associated_payload_types.clear(); |
2182 for (const VideoCodecSettings& recv_codec : recv_codecs) { | 2233 for (const VideoCodecSettings& recv_codec : recv_codecs) { |
2183 config_.rtp.rtx_associated_payload_types[recv_codec.rtx_payload_type] = | 2234 config_.rtp.rtx_associated_payload_types[recv_codec.rtx_payload_type] = |
2184 recv_codec.codec.id; | 2235 recv_codec.codec.id; |
2185 } | 2236 } |
2186 | 2237 |
2187 config_.rtp.ulpfec = recv_codecs.front().ulpfec; | 2238 config_.rtp.ulpfec = recv_codecs.front().ulpfec; |
2188 | 2239 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2246 << nack_enabled << ", remb=" << remb_enabled | 2297 << nack_enabled << ", remb=" << remb_enabled |
2247 << ", transport_cc=" << transport_cc_enabled; | 2298 << ", transport_cc=" << transport_cc_enabled; |
2248 MaybeRecreateWebRtcFlexfecStream(); | 2299 MaybeRecreateWebRtcFlexfecStream(); |
2249 RecreateWebRtcVideoStream(); | 2300 RecreateWebRtcVideoStream(); |
2250 } | 2301 } |
2251 | 2302 |
2252 void WebRtcVideoChannel::WebRtcVideoReceiveStream::SetRecvParameters( | 2303 void WebRtcVideoChannel::WebRtcVideoReceiveStream::SetRecvParameters( |
2253 const ChangedRecvParameters& params) { | 2304 const ChangedRecvParameters& params) { |
2254 bool video_needs_recreation = false; | 2305 bool video_needs_recreation = false; |
2255 bool flexfec_needs_recreation = false; | 2306 bool flexfec_needs_recreation = false; |
2256 std::vector<AllocatedDecoder> old_decoders; | 2307 std::map<webrtc::VideoCodecType, std::unique_ptr<webrtc::VideoDecoder>> |
2308 old_decoders; | |
2257 if (params.codec_settings) { | 2309 if (params.codec_settings) { |
2258 ConfigureCodecs(*params.codec_settings, &old_decoders); | 2310 ConfigureCodecs(*params.codec_settings, &old_decoders); |
2259 video_needs_recreation = true; | 2311 video_needs_recreation = true; |
2260 } | 2312 } |
2261 if (params.rtp_header_extensions) { | 2313 if (params.rtp_header_extensions) { |
2262 config_.rtp.extensions = *params.rtp_header_extensions; | 2314 config_.rtp.extensions = *params.rtp_header_extensions; |
2263 flexfec_config_.rtp_header_extensions = *params.rtp_header_extensions; | 2315 flexfec_config_.rtp_header_extensions = *params.rtp_header_extensions; |
2264 video_needs_recreation = true; | 2316 video_needs_recreation = true; |
2265 flexfec_needs_recreation = true; | 2317 flexfec_needs_recreation = true; |
2266 } | 2318 } |
2267 if (params.flexfec_payload_type) { | 2319 if (params.flexfec_payload_type) { |
2268 ConfigureFlexfecCodec(*params.flexfec_payload_type); | 2320 ConfigureFlexfecCodec(*params.flexfec_payload_type); |
2269 flexfec_needs_recreation = true; | 2321 flexfec_needs_recreation = true; |
2270 } | 2322 } |
2271 if (flexfec_needs_recreation) { | 2323 if (flexfec_needs_recreation) { |
2272 LOG(LS_INFO) << "MaybeRecreateWebRtcFlexfecStream (recv) because of " | 2324 LOG(LS_INFO) << "MaybeRecreateWebRtcFlexfecStream (recv) because of " |
2273 "SetRecvParameters"; | 2325 "SetRecvParameters"; |
2274 MaybeRecreateWebRtcFlexfecStream(); | 2326 MaybeRecreateWebRtcFlexfecStream(); |
2275 } | 2327 } |
2276 if (video_needs_recreation) { | 2328 if (video_needs_recreation) { |
2277 LOG(LS_INFO) | 2329 LOG(LS_INFO) |
2278 << "RecreateWebRtcVideoStream (recv) because of SetRecvParameters"; | 2330 << "RecreateWebRtcVideoStream (recv) because of SetRecvParameters"; |
2279 RecreateWebRtcVideoStream(); | 2331 RecreateWebRtcVideoStream(); |
2280 ClearDecoders(&old_decoders); | 2332 old_decoders.clear(); |
2281 } | 2333 } |
2282 } | 2334 } |
2283 | 2335 |
2284 void WebRtcVideoChannel::WebRtcVideoReceiveStream:: | 2336 void WebRtcVideoChannel::WebRtcVideoReceiveStream:: |
2285 RecreateWebRtcVideoStream() { | 2337 RecreateWebRtcVideoStream() { |
2286 if (stream_) { | 2338 if (stream_) { |
2287 MaybeDissociateFlexfecFromVideo(); | 2339 MaybeDissociateFlexfecFromVideo(); |
2288 call_->DestroyVideoReceiveStream(stream_); | 2340 call_->DestroyVideoReceiveStream(stream_); |
2289 stream_ = nullptr; | 2341 stream_ = nullptr; |
2290 } | 2342 } |
(...skipping 24 matching lines...) Expand all Loading... | |
2315 } | 2367 } |
2316 } | 2368 } |
2317 | 2369 |
2318 void WebRtcVideoChannel::WebRtcVideoReceiveStream:: | 2370 void WebRtcVideoChannel::WebRtcVideoReceiveStream:: |
2319 MaybeDissociateFlexfecFromVideo() { | 2371 MaybeDissociateFlexfecFromVideo() { |
2320 if (stream_ && flexfec_stream_) { | 2372 if (stream_ && flexfec_stream_) { |
2321 stream_->RemoveSecondarySink(flexfec_stream_); | 2373 stream_->RemoveSecondarySink(flexfec_stream_); |
2322 } | 2374 } |
2323 } | 2375 } |
2324 | 2376 |
2325 void WebRtcVideoChannel::WebRtcVideoReceiveStream::ClearDecoders( | |
2326 std::vector<AllocatedDecoder>* allocated_decoders) { | |
2327 for (size_t i = 0; i < allocated_decoders->size(); ++i) { | |
2328 if ((*allocated_decoders)[i].external) { | |
2329 external_decoder_factory_->DestroyVideoDecoder( | |
2330 (*allocated_decoders)[i].external_decoder); | |
2331 } | |
2332 delete (*allocated_decoders)[i].decoder; | |
2333 } | |
2334 allocated_decoders->clear(); | |
2335 } | |
2336 | |
2337 void WebRtcVideoChannel::WebRtcVideoReceiveStream::OnFrame( | 2377 void WebRtcVideoChannel::WebRtcVideoReceiveStream::OnFrame( |
2338 const webrtc::VideoFrame& frame) { | 2378 const webrtc::VideoFrame& frame) { |
2339 rtc::CritScope crit(&sink_lock_); | 2379 rtc::CritScope crit(&sink_lock_); |
2340 | 2380 |
2341 if (first_frame_timestamp_ < 0) | 2381 if (first_frame_timestamp_ < 0) |
2342 first_frame_timestamp_ = frame.timestamp(); | 2382 first_frame_timestamp_ = frame.timestamp(); |
2343 int64_t rtp_time_elapsed_since_first_frame = | 2383 int64_t rtp_time_elapsed_since_first_frame = |
2344 (timestamp_wraparound_handler_.Unwrap(frame.timestamp()) - | 2384 (timestamp_wraparound_handler_.Unwrap(frame.timestamp()) - |
2345 first_frame_timestamp_); | 2385 first_frame_timestamp_); |
2346 int64_t elapsed_time_ms = rtp_time_elapsed_since_first_frame / | 2386 int64_t elapsed_time_ms = rtp_time_elapsed_since_first_frame / |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2608 stream.temporal_layer_thresholds_bps.resize(GetDefaultVp9TemporalLayers() - | 2648 stream.temporal_layer_thresholds_bps.resize(GetDefaultVp9TemporalLayers() - |
2609 1); | 2649 1); |
2610 } | 2650 } |
2611 | 2651 |
2612 std::vector<webrtc::VideoStream> streams; | 2652 std::vector<webrtc::VideoStream> streams; |
2613 streams.push_back(stream); | 2653 streams.push_back(stream); |
2614 return streams; | 2654 return streams; |
2615 } | 2655 } |
2616 | 2656 |
2617 } // namespace cricket | 2657 } // namespace cricket |
OLD | NEW |