Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(176)

Side by Side Diff: webrtc/media/engine/webrtcvideoengine.cc

Issue 3009973002: Prepare for injectable SW decoders (Closed)
Patch Set: Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698