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

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

Issue 3010953002: Revert of 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
« no previous file with comments | « webrtc/media/engine/webrtcvideoengine.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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"
28 #include "webrtc/media/engine/scopedvideoencoder.h" 27 #include "webrtc/media/engine/scopedvideoencoder.h"
29 #include "webrtc/media/engine/simulcast.h" 28 #include "webrtc/media/engine/simulcast.h"
30 #include "webrtc/media/engine/simulcast_encoder_adapter.h" 29 #include "webrtc/media/engine/simulcast_encoder_adapter.h"
31 #include "webrtc/media/engine/videodecodersoftwarefallbackwrapper.h" 30 #include "webrtc/media/engine/videodecodersoftwarefallbackwrapper.h"
32 #include "webrtc/media/engine/videoencodersoftwarefallbackwrapper.h" 31 #include "webrtc/media/engine/videoencodersoftwarefallbackwrapper.h"
33 #include "webrtc/media/engine/webrtcmediaengine.h" 32 #include "webrtc/media/engine/webrtcmediaengine.h"
34 #include "webrtc/media/engine/webrtcvideoencoderfactory.h" 33 #include "webrtc/media/engine/webrtcvideoencoderfactory.h"
35 #include "webrtc/media/engine/webrtcvoiceengine.h" 34 #include "webrtc/media/engine/webrtcvoiceengine.h"
36 #include "webrtc/rtc_base/copyonwritebuffer.h" 35 #include "webrtc/rtc_base/copyonwritebuffer.h"
37 #include "webrtc/rtc_base/logging.h" 36 #include "webrtc/rtc_base/logging.h"
(...skipping 27 matching lines...) Expand all
65 64
66 virtual AllocatedEncoder CreateVideoEncoder( 65 virtual AllocatedEncoder CreateVideoEncoder(
67 const VideoCodec& codec, 66 const VideoCodec& codec,
68 bool is_conference_mode_screenshare) const = 0; 67 bool is_conference_mode_screenshare) const = 0;
69 68
70 virtual std::vector<VideoCodec> GetSupportedCodecs() const = 0; 69 virtual std::vector<VideoCodec> GetSupportedCodecs() const = 0;
71 70
72 virtual std::unique_ptr<EncoderFactoryAdapter> clone() const = 0; 71 virtual std::unique_ptr<EncoderFactoryAdapter> clone() const = 0;
73 }; 72 };
74 73
75 class DecoderFactoryAdapter {
76 public:
77 virtual ~DecoderFactoryAdapter() {}
78
79 virtual std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder(
80 webrtc::VideoCodecType type,
81 const VideoDecoderParams& decoder_params) const = 0;
82
83 virtual std::unique_ptr<DecoderFactoryAdapter> clone() const = 0;
84 };
85
86 namespace { 74 namespace {
87 75
88 // Wraps cricket::WebRtcVideoEncoderFactory* into common EncoderFactoryAdapter 76 // Wraps cricket::WebRtcVideoEncoderFactory* into common EncoderFactoryAdapter
89 // interface. 77 // interface.
90 // TODO(magjed): Add wrapper class for future webrtc::VideoEncoderFactory 78 // TODO(magjed): Add wrapper class for future webrtc::VideoEncoderFactory
91 // interface, https://bugs.chromium.org/p/webrtc/issues/detail?id=7925. 79 // interface, https://bugs.chromium.org/p/webrtc/issues/detail?id=7925.
92 class CricketEncoderFactoryAdapter : public EncoderFactoryAdapter { 80 class CricketEncoderFactoryAdapter : public EncoderFactoryAdapter {
93 public: 81 public:
94 explicit CricketEncoderFactoryAdapter( 82 explicit CricketEncoderFactoryAdapter(
95 WebRtcVideoEncoderFactory* external_encoder_factory) 83 WebRtcVideoEncoderFactory* external_encoder_factory)
(...skipping 13 matching lines...) Expand all
109 97
110 std::unique_ptr<EncoderFactoryAdapter> clone() const override { 98 std::unique_ptr<EncoderFactoryAdapter> clone() const override {
111 return std::unique_ptr<EncoderFactoryAdapter>( 99 return std::unique_ptr<EncoderFactoryAdapter>(
112 new CricketEncoderFactoryAdapter(*this)); 100 new CricketEncoderFactoryAdapter(*this));
113 } 101 }
114 102
115 const std::unique_ptr<WebRtcVideoEncoderFactory> internal_encoder_factory_; 103 const std::unique_ptr<WebRtcVideoEncoderFactory> internal_encoder_factory_;
116 WebRtcVideoEncoderFactory* const external_encoder_factory_; 104 WebRtcVideoEncoderFactory* const external_encoder_factory_;
117 }; 105 };
118 106
119 class CricketDecoderFactoryAdapter : public DecoderFactoryAdapter {
120 public:
121 explicit CricketDecoderFactoryAdapter(
122 WebRtcVideoDecoderFactory* external_decoder_factory)
123 : internal_decoder_factory_(new InternalDecoderFactory()),
124 external_decoder_factory_(external_decoder_factory) {}
125
126 private:
127 explicit CricketDecoderFactoryAdapter(
128 const CricketDecoderFactoryAdapter& other)
129 : CricketDecoderFactoryAdapter(other.external_decoder_factory_) {}
130
131 std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder(
132 webrtc::VideoCodecType type,
133 const VideoDecoderParams& decoder_params) const override;
134
135 std::unique_ptr<DecoderFactoryAdapter> clone() const override {
136 return std::unique_ptr<DecoderFactoryAdapter>(
137 new CricketDecoderFactoryAdapter(*this));
138 }
139
140 const std::unique_ptr<WebRtcVideoDecoderFactory> internal_decoder_factory_;
141 WebRtcVideoDecoderFactory* const external_decoder_factory_;
142 };
143
144 // If this field trial is enabled, we will enable sending FlexFEC and disable 107 // If this field trial is enabled, we will enable sending FlexFEC and disable
145 // sending ULPFEC whenever the former has been negotiated in the SDPs. 108 // sending ULPFEC whenever the former has been negotiated in the SDPs.
146 bool IsFlexfecFieldTrialEnabled() { 109 bool IsFlexfecFieldTrialEnabled() {
147 return webrtc::field_trial::IsEnabled("WebRTC-FlexFEC-03"); 110 return webrtc::field_trial::IsEnabled("WebRTC-FlexFEC-03");
148 } 111 }
149 112
150 // If this field trial is enabled, the "flexfec-03" codec may have been 113 // If this field trial is enabled, the "flexfec-03" codec may have been
151 // advertised as being supported in the local SDP. That means that we must be 114 // advertised as being supported in the local SDP. That means that we must be
152 // ready to receive FlexFEC packets. See internalencoderfactory.cc. 115 // ready to receive FlexFEC packets. See internalencoderfactory.cc.
153 bool IsFlexfecAdvertisedFieldTrialEnabled() { 116 bool IsFlexfecAdvertisedFieldTrialEnabled() {
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 default_sink_ = sink; 360 default_sink_ = sink;
398 rtc::Optional<uint32_t> default_recv_ssrc = 361 rtc::Optional<uint32_t> default_recv_ssrc =
399 channel->GetDefaultReceiveStreamSsrc(); 362 channel->GetDefaultReceiveStreamSsrc();
400 if (default_recv_ssrc) { 363 if (default_recv_ssrc) {
401 channel->SetSink(*default_recv_ssrc, default_sink_); 364 channel->SetSink(*default_recv_ssrc, default_sink_);
402 } 365 }
403 } 366 }
404 367
405 WebRtcVideoEngine::WebRtcVideoEngine() 368 WebRtcVideoEngine::WebRtcVideoEngine()
406 : initialized_(false), 369 : initialized_(false),
407 decoder_factory_(new CricketDecoderFactoryAdapter( 370 external_decoder_factory_(NULL),
408 nullptr /* external_decoder_factory */)),
409 encoder_factory_(new CricketEncoderFactoryAdapter( 371 encoder_factory_(new CricketEncoderFactoryAdapter(
410 nullptr /* external_encoder_factory */)) { 372 nullptr /* external_encoder_factory */)) {
411 LOG(LS_INFO) << "WebRtcVideoEngine::WebRtcVideoEngine()"; 373 LOG(LS_INFO) << "WebRtcVideoEngine::WebRtcVideoEngine()";
412 } 374 }
413 375
414 WebRtcVideoEngine::~WebRtcVideoEngine() { 376 WebRtcVideoEngine::~WebRtcVideoEngine() {
415 LOG(LS_INFO) << "WebRtcVideoEngine::~WebRtcVideoEngine"; 377 LOG(LS_INFO) << "WebRtcVideoEngine::~WebRtcVideoEngine";
416 } 378 }
417 379
418 void WebRtcVideoEngine::Init() { 380 void WebRtcVideoEngine::Init() {
419 LOG(LS_INFO) << "WebRtcVideoEngine::Init"; 381 LOG(LS_INFO) << "WebRtcVideoEngine::Init";
420 initialized_ = true; 382 initialized_ = true;
421 } 383 }
422 384
423 WebRtcVideoChannel* WebRtcVideoEngine::CreateChannel( 385 WebRtcVideoChannel* WebRtcVideoEngine::CreateChannel(
424 webrtc::Call* call, 386 webrtc::Call* call,
425 const MediaConfig& config, 387 const MediaConfig& config,
426 const VideoOptions& options) { 388 const VideoOptions& options) {
427 RTC_DCHECK(initialized_); 389 RTC_DCHECK(initialized_);
428 LOG(LS_INFO) << "CreateChannel. Options: " << options.ToString(); 390 LOG(LS_INFO) << "CreateChannel. Options: " << options.ToString();
429 return new WebRtcVideoChannel(call, config, options, *encoder_factory_, 391 return new WebRtcVideoChannel(call, config, options, *encoder_factory_,
430 *decoder_factory_); 392 external_decoder_factory_);
431 } 393 }
432 394
433 std::vector<VideoCodec> WebRtcVideoEngine::codecs() const { 395 std::vector<VideoCodec> WebRtcVideoEngine::codecs() const {
434 return encoder_factory_->GetSupportedCodecs(); 396 return encoder_factory_->GetSupportedCodecs();
435 } 397 }
436 398
437 RtpCapabilities WebRtcVideoEngine::GetCapabilities() const { 399 RtpCapabilities WebRtcVideoEngine::GetCapabilities() const {
438 RtpCapabilities capabilities; 400 RtpCapabilities capabilities;
439 capabilities.header_extensions.push_back( 401 capabilities.header_extensions.push_back(
440 webrtc::RtpExtension(webrtc::RtpExtension::kTimestampOffsetUri, 402 webrtc::RtpExtension(webrtc::RtpExtension::kTimestampOffsetUri,
(...skipping 15 matching lines...) Expand all
456 webrtc::RtpExtension::kVideoContentTypeDefaultId)); 418 webrtc::RtpExtension::kVideoContentTypeDefaultId));
457 capabilities.header_extensions.push_back( 419 capabilities.header_extensions.push_back(
458 webrtc::RtpExtension(webrtc::RtpExtension::kVideoTimingUri, 420 webrtc::RtpExtension(webrtc::RtpExtension::kVideoTimingUri,
459 webrtc::RtpExtension::kVideoTimingDefaultId)); 421 webrtc::RtpExtension::kVideoTimingDefaultId));
460 return capabilities; 422 return capabilities;
461 } 423 }
462 424
463 void WebRtcVideoEngine::SetExternalDecoderFactory( 425 void WebRtcVideoEngine::SetExternalDecoderFactory(
464 WebRtcVideoDecoderFactory* decoder_factory) { 426 WebRtcVideoDecoderFactory* decoder_factory) {
465 RTC_DCHECK(!initialized_); 427 RTC_DCHECK(!initialized_);
466 decoder_factory_.reset(new CricketDecoderFactoryAdapter(decoder_factory)); 428 external_decoder_factory_ = decoder_factory;
467 } 429 }
468 430
469 void WebRtcVideoEngine::SetExternalEncoderFactory( 431 void WebRtcVideoEngine::SetExternalEncoderFactory(
470 WebRtcVideoEncoderFactory* encoder_factory) { 432 WebRtcVideoEncoderFactory* encoder_factory) {
471 RTC_DCHECK(!initialized_); 433 RTC_DCHECK(!initialized_);
472 encoder_factory_.reset(new CricketEncoderFactoryAdapter(encoder_factory)); 434 encoder_factory_.reset(new CricketEncoderFactoryAdapter(encoder_factory));
473 } 435 }
474 436
475 // This function will assign dynamic payload types (in the range [96, 127]) to 437 // This function will assign dynamic payload types (in the range [96, 127]) to
476 // the input codecs, and also add associated RTX codecs for recognized codecs 438 // the input codecs, and also add associated RTX codecs for recognized codecs
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 } 496 }
535 497
536 return AssignPayloadTypesAndAddAssociatedRtxCodecs(codecs); 498 return AssignPayloadTypesAndAddAssociatedRtxCodecs(codecs);
537 } 499 }
538 500
539 WebRtcVideoChannel::WebRtcVideoChannel( 501 WebRtcVideoChannel::WebRtcVideoChannel(
540 webrtc::Call* call, 502 webrtc::Call* call,
541 const MediaConfig& config, 503 const MediaConfig& config,
542 const VideoOptions& options, 504 const VideoOptions& options,
543 const EncoderFactoryAdapter& encoder_factory, 505 const EncoderFactoryAdapter& encoder_factory,
544 const DecoderFactoryAdapter& decoder_factory) 506 WebRtcVideoDecoderFactory* external_decoder_factory)
545 : VideoMediaChannel(config), 507 : VideoMediaChannel(config),
546 call_(call), 508 call_(call),
547 unsignalled_ssrc_handler_(&default_unsignalled_ssrc_handler_), 509 unsignalled_ssrc_handler_(&default_unsignalled_ssrc_handler_),
548 video_config_(config.video), 510 video_config_(config.video),
549 encoder_factory_(encoder_factory.clone()), 511 encoder_factory_(encoder_factory.clone()),
550 decoder_factory_(decoder_factory.clone()), 512 external_decoder_factory_(external_decoder_factory),
551 default_send_options_(options), 513 default_send_options_(options),
552 last_stats_log_ms_(-1) { 514 last_stats_log_ms_(-1) {
553 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 515 RTC_DCHECK(thread_checker_.CalledOnValidThread());
554 516
555 rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc; 517 rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc;
556 sending_ = false; 518 sending_ = false;
557 recv_codecs_ = MapCodecs(encoder_factory_->GetSupportedCodecs()); 519 recv_codecs_ = MapCodecs(encoder_factory_->GetSupportedCodecs());
558 recv_flexfec_payload_type_ = recv_codecs_.front().flexfec_payload_type; 520 recv_flexfec_payload_type_ = recv_codecs_.front().flexfec_payload_type;
559 } 521 }
560 522
(...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after
1156 1118
1157 webrtc::VideoReceiveStream::Config config(this); 1119 webrtc::VideoReceiveStream::Config config(this);
1158 webrtc::FlexfecReceiveStream::Config flexfec_config(this); 1120 webrtc::FlexfecReceiveStream::Config flexfec_config(this);
1159 ConfigureReceiverRtp(&config, &flexfec_config, sp); 1121 ConfigureReceiverRtp(&config, &flexfec_config, sp);
1160 1122
1161 config.disable_prerenderer_smoothing = 1123 config.disable_prerenderer_smoothing =
1162 video_config_.disable_prerenderer_smoothing; 1124 video_config_.disable_prerenderer_smoothing;
1163 config.sync_group = sp.sync_label; 1125 config.sync_group = sp.sync_label;
1164 1126
1165 receive_streams_[ssrc] = new WebRtcVideoReceiveStream( 1127 receive_streams_[ssrc] = new WebRtcVideoReceiveStream(
1166 call_, sp, std::move(config), *decoder_factory_, default_stream, 1128 call_, sp, std::move(config), external_decoder_factory_, default_stream,
1167 recv_codecs_, flexfec_config); 1129 recv_codecs_, flexfec_config);
1168 1130
1169 return true; 1131 return true;
1170 } 1132 }
1171 1133
1172 void WebRtcVideoChannel::ConfigureReceiverRtp( 1134 void WebRtcVideoChannel::ConfigureReceiverRtp(
1173 webrtc::VideoReceiveStream::Config* config, 1135 webrtc::VideoReceiveStream::Config* config,
1174 webrtc::FlexfecReceiveStream::Config* flexfec_config, 1136 webrtc::FlexfecReceiveStream::Config* flexfec_config,
1175 const StreamParams& sp) const { 1137 const StreamParams& sp) const {
1176 uint32_t ssrc = sp.first_ssrc(); 1138 uint32_t ssrc = sp.first_ssrc();
(...skipping 917 matching lines...) Expand 10 before | Expand all | Expand 10 after
2094 } 2056 }
2095 2057
2096 // Call stream_->Start() if necessary conditions are met. 2058 // Call stream_->Start() if necessary conditions are met.
2097 UpdateSendState(); 2059 UpdateSendState();
2098 } 2060 }
2099 2061
2100 WebRtcVideoChannel::WebRtcVideoReceiveStream::WebRtcVideoReceiveStream( 2062 WebRtcVideoChannel::WebRtcVideoReceiveStream::WebRtcVideoReceiveStream(
2101 webrtc::Call* call, 2063 webrtc::Call* call,
2102 const StreamParams& sp, 2064 const StreamParams& sp,
2103 webrtc::VideoReceiveStream::Config config, 2065 webrtc::VideoReceiveStream::Config config,
2104 const DecoderFactoryAdapter& decoder_factory, 2066 WebRtcVideoDecoderFactory* external_decoder_factory,
2105 bool default_stream, 2067 bool default_stream,
2106 const std::vector<VideoCodecSettings>& recv_codecs, 2068 const std::vector<VideoCodecSettings>& recv_codecs,
2107 const webrtc::FlexfecReceiveStream::Config& flexfec_config) 2069 const webrtc::FlexfecReceiveStream::Config& flexfec_config)
2108 : call_(call), 2070 : call_(call),
2109 stream_params_(sp), 2071 stream_params_(sp),
2110 stream_(NULL), 2072 stream_(NULL),
2111 default_stream_(default_stream), 2073 default_stream_(default_stream),
2112 config_(std::move(config)), 2074 config_(std::move(config)),
2113 flexfec_config_(flexfec_config), 2075 flexfec_config_(flexfec_config),
2114 flexfec_stream_(nullptr), 2076 flexfec_stream_(nullptr),
2115 decoder_factory_(decoder_factory.clone()), 2077 external_decoder_factory_(external_decoder_factory),
2116 sink_(NULL), 2078 sink_(NULL),
2117 first_frame_timestamp_(-1), 2079 first_frame_timestamp_(-1),
2118 estimated_remote_start_ntp_time_ms_(0) { 2080 estimated_remote_start_ntp_time_ms_(0) {
2119 config_.renderer = this; 2081 config_.renderer = this;
2120 std::map<webrtc::VideoCodecType, std::unique_ptr<webrtc::VideoDecoder>> 2082 std::vector<AllocatedDecoder> old_decoders;
2121 old_decoders;
2122 ConfigureCodecs(recv_codecs, &old_decoders); 2083 ConfigureCodecs(recv_codecs, &old_decoders);
2123 ConfigureFlexfecCodec(flexfec_config.payload_type); 2084 ConfigureFlexfecCodec(flexfec_config.payload_type);
2124 MaybeRecreateWebRtcFlexfecStream(); 2085 MaybeRecreateWebRtcFlexfecStream();
2125 RecreateWebRtcVideoStream(); 2086 RecreateWebRtcVideoStream();
2126 RTC_DCHECK(old_decoders.empty()); 2087 RTC_DCHECK(old_decoders.empty());
2127 } 2088 }
2128 2089
2090 WebRtcVideoChannel::WebRtcVideoReceiveStream::AllocatedDecoder::
2091 AllocatedDecoder(webrtc::VideoDecoder* decoder,
2092 webrtc::VideoCodecType type,
2093 bool external)
2094 : decoder(decoder),
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
2129 WebRtcVideoChannel::WebRtcVideoReceiveStream::~WebRtcVideoReceiveStream() { 2105 WebRtcVideoChannel::WebRtcVideoReceiveStream::~WebRtcVideoReceiveStream() {
2130 if (flexfec_stream_) { 2106 if (flexfec_stream_) {
2131 MaybeDissociateFlexfecFromVideo(); 2107 MaybeDissociateFlexfecFromVideo();
2132 call_->DestroyFlexfecReceiveStream(flexfec_stream_); 2108 call_->DestroyFlexfecReceiveStream(flexfec_stream_);
2133 } 2109 }
2134 call_->DestroyVideoReceiveStream(stream_); 2110 call_->DestroyVideoReceiveStream(stream_);
2135 allocated_decoders_.clear(); 2111 ClearDecoders(&allocated_decoders_);
2136 } 2112 }
2137 2113
2138 const std::vector<uint32_t>& 2114 const std::vector<uint32_t>&
2139 WebRtcVideoChannel::WebRtcVideoReceiveStream::GetSsrcs() const { 2115 WebRtcVideoChannel::WebRtcVideoReceiveStream::GetSsrcs() const {
2140 return stream_params_.ssrcs; 2116 return stream_params_.ssrcs;
2141 } 2117 }
2142 2118
2143 rtc::Optional<uint32_t> 2119 rtc::Optional<uint32_t>
2144 WebRtcVideoChannel::WebRtcVideoReceiveStream::GetFirstPrimarySsrc() const { 2120 WebRtcVideoChannel::WebRtcVideoReceiveStream::GetFirstPrimarySsrc() const {
2145 std::vector<uint32_t> primary_ssrcs; 2121 std::vector<uint32_t> primary_ssrcs;
2146 stream_params_.GetPrimarySsrcs(&primary_ssrcs); 2122 stream_params_.GetPrimarySsrcs(&primary_ssrcs);
2147 2123
2148 if (primary_ssrcs.empty()) { 2124 if (primary_ssrcs.empty()) {
2149 LOG(LS_WARNING) << "Empty primary ssrcs vector, returning empty optional"; 2125 LOG(LS_WARNING) << "Empty primary ssrcs vector, returning empty optional";
2150 return rtc::Optional<uint32_t>(); 2126 return rtc::Optional<uint32_t>();
2151 } else { 2127 } else {
2152 return rtc::Optional<uint32_t>(primary_ssrcs[0]); 2128 return rtc::Optional<uint32_t>(primary_ssrcs[0]);
2153 } 2129 }
2154 } 2130 }
2155 2131
2156 std::unique_ptr<webrtc::VideoDecoder> 2132 WebRtcVideoChannel::WebRtcVideoReceiveStream::AllocatedDecoder
2157 CricketDecoderFactoryAdapter::CreateVideoDecoder( 2133 WebRtcVideoChannel::WebRtcVideoReceiveStream::CreateOrReuseVideoDecoder(
2158 webrtc::VideoCodecType type, 2134 std::vector<AllocatedDecoder>* old_decoders,
2159 const VideoDecoderParams& decoder_params) const { 2135 const VideoCodec& codec) {
2160 if (external_decoder_factory_ != nullptr) { 2136 webrtc::VideoCodecType type = webrtc::PayloadStringToCodecType(codec.name);
2161 std::unique_ptr<webrtc::VideoDecoder> external_decoder = 2137
2162 CreateScopedVideoDecoder(external_decoder_factory_, type, 2138 for (size_t i = 0; i < old_decoders->size(); ++i) {
2163 decoder_params); 2139 if ((*old_decoders)[i].type == type) {
2164 if (external_decoder) { 2140 AllocatedDecoder decoder = (*old_decoders)[i];
2165 std::unique_ptr<webrtc::VideoDecoder> internal_decoder( 2141 (*old_decoders)[i] = old_decoders->back();
2166 new webrtc::VideoDecoderSoftwareFallbackWrapper( 2142 old_decoders->pop_back();
2167 type, std::move(external_decoder))); 2143 return decoder;
2168 return internal_decoder;
2169 } 2144 }
2170 } 2145 }
2171 2146
2172 std::unique_ptr<webrtc::VideoDecoder> internal_decoder( 2147 if (external_decoder_factory_ != NULL) {
2173 internal_decoder_factory_->CreateVideoDecoderWithParams(type, 2148 webrtc::VideoDecoder* decoder =
2174 decoder_params)); 2149 external_decoder_factory_->CreateVideoDecoderWithParams(
2175 return internal_decoder; 2150 type, {stream_params_.id});
2151 if (decoder != NULL) {
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 */);
2176 } 2160 }
2177 2161
2178 void WebRtcVideoChannel::WebRtcVideoReceiveStream::ConfigureCodecs( 2162 void WebRtcVideoChannel::WebRtcVideoReceiveStream::ConfigureCodecs(
2179 const std::vector<VideoCodecSettings>& recv_codecs, 2163 const std::vector<VideoCodecSettings>& recv_codecs,
2180 std::map<webrtc::VideoCodecType, std::unique_ptr<webrtc::VideoDecoder>>* 2164 std::vector<AllocatedDecoder>* old_decoders) {
2181 old_decoders) { 2165 *old_decoders = allocated_decoders_;
2182 *old_decoders = std::move(allocated_decoders_);
2183 allocated_decoders_.clear(); 2166 allocated_decoders_.clear();
2184 config_.decoders.clear(); 2167 config_.decoders.clear();
2185 for (size_t i = 0; i < recv_codecs.size(); ++i) { 2168 for (size_t i = 0; i < recv_codecs.size(); ++i) {
2186 webrtc::VideoCodecType type = 2169 AllocatedDecoder allocated_decoder =
2187 webrtc::PayloadStringToCodecType(recv_codecs[i].codec.name); 2170 CreateOrReuseVideoDecoder(old_decoders, recv_codecs[i].codec);
2188 std::unique_ptr<webrtc::VideoDecoder> new_decoder; 2171 allocated_decoders_.push_back(allocated_decoder);
2189
2190 auto it = old_decoders->find(type);
2191 if (it != old_decoders->end()) {
2192 new_decoder = std::move(it->second);
2193 old_decoders->erase(it);
2194 }
2195
2196 if (!new_decoder) {
2197 new_decoder =
2198 decoder_factory_->CreateVideoDecoder(type, {stream_params_.id});
2199 }
2200 2172
2201 webrtc::VideoReceiveStream::Decoder decoder; 2173 webrtc::VideoReceiveStream::Decoder decoder;
2202 decoder.decoder = new_decoder.get(); 2174 decoder.decoder = allocated_decoder.decoder;
2203 decoder.payload_type = recv_codecs[i].codec.id; 2175 decoder.payload_type = recv_codecs[i].codec.id;
2204 decoder.payload_name = recv_codecs[i].codec.name; 2176 decoder.payload_name = recv_codecs[i].codec.name;
2205 decoder.codec_params = recv_codecs[i].codec.params; 2177 decoder.codec_params = recv_codecs[i].codec.params;
2206 config_.decoders.push_back(decoder); 2178 config_.decoders.push_back(decoder);
2207
2208 allocated_decoders_.insert(std::make_pair(type, std::move(new_decoder)));
2209 } 2179 }
2210 2180
2211 config_.rtp.rtx_associated_payload_types.clear(); 2181 config_.rtp.rtx_associated_payload_types.clear();
2212 for (const VideoCodecSettings& recv_codec : recv_codecs) { 2182 for (const VideoCodecSettings& recv_codec : recv_codecs) {
2213 config_.rtp.rtx_associated_payload_types[recv_codec.rtx_payload_type] = 2183 config_.rtp.rtx_associated_payload_types[recv_codec.rtx_payload_type] =
2214 recv_codec.codec.id; 2184 recv_codec.codec.id;
2215 } 2185 }
2216 2186
2217 config_.rtp.ulpfec = recv_codecs.front().ulpfec; 2187 config_.rtp.ulpfec = recv_codecs.front().ulpfec;
2218 2188
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
2276 << nack_enabled << ", remb=" << remb_enabled 2246 << nack_enabled << ", remb=" << remb_enabled
2277 << ", transport_cc=" << transport_cc_enabled; 2247 << ", transport_cc=" << transport_cc_enabled;
2278 MaybeRecreateWebRtcFlexfecStream(); 2248 MaybeRecreateWebRtcFlexfecStream();
2279 RecreateWebRtcVideoStream(); 2249 RecreateWebRtcVideoStream();
2280 } 2250 }
2281 2251
2282 void WebRtcVideoChannel::WebRtcVideoReceiveStream::SetRecvParameters( 2252 void WebRtcVideoChannel::WebRtcVideoReceiveStream::SetRecvParameters(
2283 const ChangedRecvParameters& params) { 2253 const ChangedRecvParameters& params) {
2284 bool video_needs_recreation = false; 2254 bool video_needs_recreation = false;
2285 bool flexfec_needs_recreation = false; 2255 bool flexfec_needs_recreation = false;
2286 std::map<webrtc::VideoCodecType, std::unique_ptr<webrtc::VideoDecoder>> 2256 std::vector<AllocatedDecoder> old_decoders;
2287 old_decoders;
2288 if (params.codec_settings) { 2257 if (params.codec_settings) {
2289 ConfigureCodecs(*params.codec_settings, &old_decoders); 2258 ConfigureCodecs(*params.codec_settings, &old_decoders);
2290 video_needs_recreation = true; 2259 video_needs_recreation = true;
2291 } 2260 }
2292 if (params.rtp_header_extensions) { 2261 if (params.rtp_header_extensions) {
2293 config_.rtp.extensions = *params.rtp_header_extensions; 2262 config_.rtp.extensions = *params.rtp_header_extensions;
2294 flexfec_config_.rtp_header_extensions = *params.rtp_header_extensions; 2263 flexfec_config_.rtp_header_extensions = *params.rtp_header_extensions;
2295 video_needs_recreation = true; 2264 video_needs_recreation = true;
2296 flexfec_needs_recreation = true; 2265 flexfec_needs_recreation = true;
2297 } 2266 }
2298 if (params.flexfec_payload_type) { 2267 if (params.flexfec_payload_type) {
2299 ConfigureFlexfecCodec(*params.flexfec_payload_type); 2268 ConfigureFlexfecCodec(*params.flexfec_payload_type);
2300 flexfec_needs_recreation = true; 2269 flexfec_needs_recreation = true;
2301 } 2270 }
2302 if (flexfec_needs_recreation) { 2271 if (flexfec_needs_recreation) {
2303 LOG(LS_INFO) << "MaybeRecreateWebRtcFlexfecStream (recv) because of " 2272 LOG(LS_INFO) << "MaybeRecreateWebRtcFlexfecStream (recv) because of "
2304 "SetRecvParameters"; 2273 "SetRecvParameters";
2305 MaybeRecreateWebRtcFlexfecStream(); 2274 MaybeRecreateWebRtcFlexfecStream();
2306 } 2275 }
2307 if (video_needs_recreation) { 2276 if (video_needs_recreation) {
2308 LOG(LS_INFO) 2277 LOG(LS_INFO)
2309 << "RecreateWebRtcVideoStream (recv) because of SetRecvParameters"; 2278 << "RecreateWebRtcVideoStream (recv) because of SetRecvParameters";
2310 RecreateWebRtcVideoStream(); 2279 RecreateWebRtcVideoStream();
2280 ClearDecoders(&old_decoders);
2311 } 2281 }
2312 } 2282 }
2313 2283
2314 void WebRtcVideoChannel::WebRtcVideoReceiveStream:: 2284 void WebRtcVideoChannel::WebRtcVideoReceiveStream::
2315 RecreateWebRtcVideoStream() { 2285 RecreateWebRtcVideoStream() {
2316 if (stream_) { 2286 if (stream_) {
2317 MaybeDissociateFlexfecFromVideo(); 2287 MaybeDissociateFlexfecFromVideo();
2318 call_->DestroyVideoReceiveStream(stream_); 2288 call_->DestroyVideoReceiveStream(stream_);
2319 stream_ = nullptr; 2289 stream_ = nullptr;
2320 } 2290 }
(...skipping 24 matching lines...) Expand all
2345 } 2315 }
2346 } 2316 }
2347 2317
2348 void WebRtcVideoChannel::WebRtcVideoReceiveStream:: 2318 void WebRtcVideoChannel::WebRtcVideoReceiveStream::
2349 MaybeDissociateFlexfecFromVideo() { 2319 MaybeDissociateFlexfecFromVideo() {
2350 if (stream_ && flexfec_stream_) { 2320 if (stream_ && flexfec_stream_) {
2351 stream_->RemoveSecondarySink(flexfec_stream_); 2321 stream_->RemoveSecondarySink(flexfec_stream_);
2352 } 2322 }
2353 } 2323 }
2354 2324
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
2355 void WebRtcVideoChannel::WebRtcVideoReceiveStream::OnFrame( 2337 void WebRtcVideoChannel::WebRtcVideoReceiveStream::OnFrame(
2356 const webrtc::VideoFrame& frame) { 2338 const webrtc::VideoFrame& frame) {
2357 rtc::CritScope crit(&sink_lock_); 2339 rtc::CritScope crit(&sink_lock_);
2358 2340
2359 if (first_frame_timestamp_ < 0) 2341 if (first_frame_timestamp_ < 0)
2360 first_frame_timestamp_ = frame.timestamp(); 2342 first_frame_timestamp_ = frame.timestamp();
2361 int64_t rtp_time_elapsed_since_first_frame = 2343 int64_t rtp_time_elapsed_since_first_frame =
2362 (timestamp_wraparound_handler_.Unwrap(frame.timestamp()) - 2344 (timestamp_wraparound_handler_.Unwrap(frame.timestamp()) -
2363 first_frame_timestamp_); 2345 first_frame_timestamp_);
2364 int64_t elapsed_time_ms = rtp_time_elapsed_since_first_frame / 2346 int64_t elapsed_time_ms = rtp_time_elapsed_since_first_frame /
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
2626 stream.temporal_layer_thresholds_bps.resize(GetDefaultVp9TemporalLayers() - 2608 stream.temporal_layer_thresholds_bps.resize(GetDefaultVp9TemporalLayers() -
2627 1); 2609 1);
2628 } 2610 }
2629 2611
2630 std::vector<webrtc::VideoStream> streams; 2612 std::vector<webrtc::VideoStream> streams;
2631 streams.push_back(stream); 2613 streams.push_back(stream);
2632 return streams; 2614 return streams;
2633 } 2615 }
2634 2616
2635 } // namespace cricket 2617 } // namespace cricket
OLDNEW
« no previous file with comments | « webrtc/media/engine/webrtcvideoengine.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698