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

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

Issue 2493133002: Stop using hardcoded payload types for video codecs (Closed)
Patch Set: Addressing comments. Created 4 years, 1 month 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/webrtcvideoengine2.h" 11 #include "webrtc/media/engine/webrtcvideoengine2.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/base/copyonwritebuffer.h" 19 #include "webrtc/base/copyonwritebuffer.h"
20 #include "webrtc/base/logging.h" 20 #include "webrtc/base/logging.h"
21 #include "webrtc/base/stringutils.h" 21 #include "webrtc/base/stringutils.h"
22 #include "webrtc/base/timeutils.h" 22 #include "webrtc/base/timeutils.h"
23 #include "webrtc/base/trace_event.h" 23 #include "webrtc/base/trace_event.h"
24 #include "webrtc/call.h" 24 #include "webrtc/call.h"
25 #include "webrtc/media/engine/constants.h" 25 #include "webrtc/media/engine/constants.h"
26 #include "webrtc/media/engine/internalencoderfactory.h"
26 #include "webrtc/media/engine/simulcast.h" 27 #include "webrtc/media/engine/simulcast.h"
27 #include "webrtc/media/engine/videoencodersoftwarefallbackwrapper.h" 28 #include "webrtc/media/engine/videoencodersoftwarefallbackwrapper.h"
28 #include "webrtc/media/engine/webrtcmediaengine.h" 29 #include "webrtc/media/engine/webrtcmediaengine.h"
29 #include "webrtc/media/engine/webrtcvideoencoderfactory.h" 30 #include "webrtc/media/engine/webrtcvideoencoderfactory.h"
30 #include "webrtc/media/engine/webrtcvoiceengine.h" 31 #include "webrtc/media/engine/webrtcvoiceengine.h"
31 #include "webrtc/modules/video_coding/codecs/h264/include/h264.h"
32 #include "webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter.h" 32 #include "webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter.h"
33 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
34 #include "webrtc/system_wrappers/include/field_trial.h" 33 #include "webrtc/system_wrappers/include/field_trial.h"
35 #include "webrtc/video_decoder.h" 34 #include "webrtc/video_decoder.h"
36 #include "webrtc/video_encoder.h" 35 #include "webrtc/video_encoder.h"
37 36
38 namespace cricket { 37 namespace cricket {
39 namespace { 38 namespace {
40 39
41 // Wrap cricket::WebRtcVideoEncoderFactory as a webrtc::VideoEncoderFactory. 40 // Wrap cricket::WebRtcVideoEncoderFactory as a webrtc::VideoEncoderFactory.
42 class EncoderFactoryAdapter : public webrtc::VideoEncoderFactory { 41 class EncoderFactoryAdapter : public webrtc::VideoEncoderFactory {
43 public: 42 public:
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 161
163 void AddDefaultFeedbackParams(VideoCodec* codec) { 162 void AddDefaultFeedbackParams(VideoCodec* codec) {
164 codec->AddFeedbackParam(FeedbackParam(kRtcpFbParamCcm, kRtcpFbCcmParamFir)); 163 codec->AddFeedbackParam(FeedbackParam(kRtcpFbParamCcm, kRtcpFbCcmParamFir));
165 codec->AddFeedbackParam(FeedbackParam(kRtcpFbParamNack, kParamValueEmpty)); 164 codec->AddFeedbackParam(FeedbackParam(kRtcpFbParamNack, kParamValueEmpty));
166 codec->AddFeedbackParam(FeedbackParam(kRtcpFbParamNack, kRtcpFbNackParamPli)); 165 codec->AddFeedbackParam(FeedbackParam(kRtcpFbParamNack, kRtcpFbNackParamPli));
167 codec->AddFeedbackParam(FeedbackParam(kRtcpFbParamRemb, kParamValueEmpty)); 166 codec->AddFeedbackParam(FeedbackParam(kRtcpFbParamRemb, kParamValueEmpty));
168 codec->AddFeedbackParam( 167 codec->AddFeedbackParam(
169 FeedbackParam(kRtcpFbParamTransportCc, kParamValueEmpty)); 168 FeedbackParam(kRtcpFbParamTransportCc, kParamValueEmpty));
170 } 169 }
171 170
172 static VideoCodec MakeVideoCodecWithDefaultFeedbackParams(int payload_type,
173 const char* name) {
174 VideoCodec codec(payload_type, name);
175 AddDefaultFeedbackParams(&codec);
176 return codec;
177 }
178
179 static std::string CodecVectorToString(const std::vector<VideoCodec>& codecs) { 171 static std::string CodecVectorToString(const std::vector<VideoCodec>& codecs) {
180 std::stringstream out; 172 std::stringstream out;
181 out << '{'; 173 out << '{';
182 for (size_t i = 0; i < codecs.size(); ++i) { 174 for (size_t i = 0; i < codecs.size(); ++i) {
183 out << codecs[i].ToString(); 175 out << codecs[i].ToString();
184 if (i != codecs.size() - 1) { 176 if (i != codecs.size() - 1) {
185 out << ", "; 177 out << ", ";
186 } 178 }
187 } 179 }
188 out << '}'; 180 out << '}';
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
384 // duration hasn't been implemented. 376 // duration hasn't been implemented.
385 static const int kNackHistoryMs = 1000; 377 static const int kNackHistoryMs = 1000;
386 378
387 static const int kDefaultQpMax = 56; 379 static const int kDefaultQpMax = 56;
388 380
389 static const int kDefaultRtcpReceiverReportSsrc = 1; 381 static const int kDefaultRtcpReceiverReportSsrc = 1;
390 382
391 // Minimum time interval for logging stats. 383 // Minimum time interval for logging stats.
392 static const int64_t kStatsLogIntervalMs = 10000; 384 static const int64_t kStatsLogIntervalMs = 10000;
393 385
394 // Adds |codec| to |list|, and also adds an RTX codec if |codec|'s name is
395 // recognized.
396 // TODO(deadbeef): Should we add RTX codecs for external codecs whose names we
397 // don't recognize?
398 void AddCodecAndMaybeRtxCodec(const VideoCodec& codec,
399 std::vector<VideoCodec>* codecs) {
400 codecs->push_back(codec);
401 int rtx_payload_type = 0;
402 if (CodecNamesEq(codec.name, kVp8CodecName)) {
403 rtx_payload_type = kDefaultRtxVp8PlType;
404 } else if (CodecNamesEq(codec.name, kVp9CodecName)) {
405 rtx_payload_type = kDefaultRtxVp9PlType;
406 } else if (CodecNamesEq(codec.name, kH264CodecName)) {
407 rtx_payload_type = kDefaultRtxH264PlType;
408 } else if (CodecNamesEq(codec.name, kRedCodecName)) {
409 rtx_payload_type = kDefaultRtxRedPlType;
410 } else {
411 return;
412 }
413 codecs->push_back(VideoCodec::CreateRtxCodec(rtx_payload_type, codec.id));
414 }
415
416 std::vector<VideoCodec> DefaultVideoCodecList() {
417 std::vector<VideoCodec> codecs;
418 AddCodecAndMaybeRtxCodec(
419 MakeVideoCodecWithDefaultFeedbackParams(kDefaultVp8PlType, kVp8CodecName),
420 &codecs);
421 if (webrtc::VP9Encoder::IsSupported() && webrtc::VP9Decoder::IsSupported()) {
422 AddCodecAndMaybeRtxCodec(MakeVideoCodecWithDefaultFeedbackParams(
423 kDefaultVp9PlType, kVp9CodecName),
424 &codecs);
425 }
426 if (webrtc::H264Encoder::IsSupported() &&
427 webrtc::H264Decoder::IsSupported()) {
428 VideoCodec codec = MakeVideoCodecWithDefaultFeedbackParams(
429 kDefaultH264PlType, kH264CodecName);
430 // TODO(hta): Move all parameter generation for SDP into the codec
431 // implementation, for all codecs and parameters.
432 // TODO(hta): Move selection of profile-level-id to H.264 codec
433 // implementation.
434 // TODO(hta): Set FMTP parameters for all codecs of type H264.
435 codec.SetParam(kH264FmtpProfileLevelId,
436 kH264ProfileLevelConstrainedBaseline);
437 codec.SetParam(kH264FmtpLevelAsymmetryAllowed, "1");
438 codec.SetParam(kH264FmtpPacketizationMode, "1");
439 AddCodecAndMaybeRtxCodec(codec, &codecs);
440 }
441 AddCodecAndMaybeRtxCodec(VideoCodec(kDefaultRedPlType, kRedCodecName),
442 &codecs);
443 codecs.push_back(VideoCodec(kDefaultUlpfecType, kUlpfecCodecName));
444 return codecs;
445 }
446
447 static std::vector<VideoCodec> GetSupportedCodecs( 386 static std::vector<VideoCodec> GetSupportedCodecs(
448 const WebRtcVideoEncoderFactory* external_encoder_factory); 387 const WebRtcVideoEncoderFactory* external_encoder_factory);
449 388
450 rtc::scoped_refptr<webrtc::VideoEncoderConfig::EncoderSpecificSettings> 389 rtc::scoped_refptr<webrtc::VideoEncoderConfig::EncoderSpecificSettings>
451 WebRtcVideoChannel2::WebRtcVideoSendStream::ConfigureVideoEncoderSettings( 390 WebRtcVideoChannel2::WebRtcVideoSendStream::ConfigureVideoEncoderSettings(
452 const VideoCodec& codec) { 391 const VideoCodec& codec) {
453 RTC_DCHECK_RUN_ON(&thread_checker_); 392 RTC_DCHECK_RUN_ON(&thread_checker_);
454 bool is_screencast = parameters_.options.is_screencast.value_or(false); 393 bool is_screencast = parameters_.options.is_screencast.value_or(false);
455 // No automatic resizing when using simulcast or screencast. 394 // No automatic resizing when using simulcast or screencast.
456 bool automatic_resize = 395 bool automatic_resize =
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
612 encoder_factory->supported_codecs())) { 551 encoder_factory->supported_codecs())) {
613 simulcast_encoder_factory_.reset( 552 simulcast_encoder_factory_.reset(
614 new WebRtcSimulcastEncoderFactory(encoder_factory)); 553 new WebRtcSimulcastEncoderFactory(encoder_factory));
615 encoder_factory = simulcast_encoder_factory_.get(); 554 encoder_factory = simulcast_encoder_factory_.get();
616 } 555 }
617 external_encoder_factory_ = encoder_factory; 556 external_encoder_factory_ = encoder_factory;
618 557
619 video_codecs_ = GetSupportedCodecs(encoder_factory); 558 video_codecs_ = GetSupportedCodecs(encoder_factory);
620 } 559 }
621 560
561 // This is a helper function for AppendVideoCodecs below. It will return the
562 // first unused dynamic payload type (in the range [96, 127]), or nothing if no
563 // payload type is unused.
564 static rtc::Optional<int> NextFreePayloadType(
565 const std::vector<VideoCodec>& codecs) {
566 static const int kFirstDynamicPayloadType = 96;
567 static const int kLastDynamicPayloadType = 127;
568 bool is_payload_used[1 + kLastDynamicPayloadType - kFirstDynamicPayloadType] =
569 {false};
570 for (const VideoCodec& codec : codecs) {
571 if (kFirstDynamicPayloadType <= codec.id &&
572 codec.id <= kLastDynamicPayloadType) {
573 is_payload_used[codec.id - kFirstDynamicPayloadType] = true;
574 }
575 }
576 for (int i = kFirstDynamicPayloadType; i <= kLastDynamicPayloadType; ++i) {
577 if (!is_payload_used[i - kFirstDynamicPayloadType])
578 return rtc::Optional<int>(i);
579 }
580 // No free payload type.
581 return rtc::Optional<int>();
hta-webrtc 2016/11/15 20:36:24 Yep, I prefer this version. It's obviously correct
582 }
583
584 // This is a helper function for GetSupportedCodecs below. It will append new
585 // unique codecs from |input_codecs| to |unified_codecs|. It will add default
586 // feedback params to the codecs and will also add an associated RTX codec for
587 // recognized codecs (VP8, VP9, H264, and Red).
588 static void AppendVideoCodecs(const std::vector<VideoCodec>& input_codecs,
589 std::vector<VideoCodec>* unified_codecs) {
590 for (VideoCodec codec : input_codecs) {
591 const rtc::Optional<int> payload_type =
592 NextFreePayloadType(*unified_codecs);
593 if (!payload_type)
594 return;
595 codec.id = *payload_type;
596 // TODO(magjed): Move the responsibility of setting these parameters to the
597 // encoder factories instead.
598 if (codec.name != kRedCodecName && codec.name != kUlpfecCodecName)
599 AddDefaultFeedbackParams(&codec);
600 // Don't add same codec twice.
601 if (FindMatchingCodec(*unified_codecs, codec))
602 continue;
603
604 unified_codecs->push_back(codec);
605
606 // Add associated RTX codec for recognized codecs.
607 // TODO(deadbeef): Should we add RTX codecs for external codecs whose names
608 // we don't recognize?
609 if (CodecNamesEq(codec.name, kVp8CodecName) ||
610 CodecNamesEq(codec.name, kVp9CodecName) ||
611 CodecNamesEq(codec.name, kH264CodecName) ||
612 CodecNamesEq(codec.name, kRedCodecName)) {
613 const rtc::Optional<int> rtx_payload_type =
614 NextFreePayloadType(*unified_codecs);
615 if (!rtx_payload_type)
616 return;
617 unified_codecs->push_back(
618 VideoCodec::CreateRtxCodec(*rtx_payload_type, codec.id));
619 }
620 }
621 }
622
622 static std::vector<VideoCodec> GetSupportedCodecs( 623 static std::vector<VideoCodec> GetSupportedCodecs(
623 const WebRtcVideoEncoderFactory* external_encoder_factory) { 624 const WebRtcVideoEncoderFactory* external_encoder_factory) {
624 std::vector<VideoCodec> supported_codecs = DefaultVideoCodecList(); 625 const std::vector<VideoCodec>& internal_codecs =
626 InternalEncoderFactory::GetInstance().supported_codecs();
627 LOG(LS_INFO) << "Internally supported codecs: "
628 << CodecVectorToString(internal_codecs);
625 629
626 if (external_encoder_factory == nullptr) { 630 std::vector<VideoCodec> unified_codecs;
627 LOG(LS_INFO) << "Supported codecs: " 631 AppendVideoCodecs(internal_codecs, &unified_codecs);
628 << CodecVectorToString(supported_codecs); 632
629 return supported_codecs; 633 if (external_encoder_factory != nullptr) {
634 const std::vector<VideoCodec>& external_codecs =
635 external_encoder_factory->supported_codecs();
636 AppendVideoCodecs(external_codecs, &unified_codecs);
637 LOG(LS_INFO) << "Codecs supported by the external encoder factory: "
638 << CodecVectorToString(external_codecs);
630 } 639 }
631 640
632 std::stringstream out; 641 return unified_codecs;
633 const std::vector<VideoCodec>& codecs =
634 external_encoder_factory->supported_codecs();
635 for (size_t i = 0; i < codecs.size(); ++i) {
636 VideoCodec codec = codecs[i];
637 out << codec.name;
638 if (i != codecs.size() - 1) {
639 out << ", ";
640 }
641 // Don't add internally-supported codecs twice.
642 if (FindMatchingCodec(supported_codecs, codec))
643 continue;
644
645 // External video encoders are given payloads 120-127. This also means that
646 // we only support up to 8 external payload types.
647 // TODO(deadbeef): mediasession.cc already has code to dynamically
648 // determine a payload type. We should be able to just leave the payload
649 // type empty and let mediasession determine it. However, currently RTX
650 // codecs are associated to codecs by payload type, meaning we DO need
651 // to allocate unique payload types here. So to make this change we would
652 // need to make RTX codecs associated by name instead.
653 const int kExternalVideoPayloadTypeBase = 120;
654 size_t payload_type = kExternalVideoPayloadTypeBase + i;
655 RTC_DCHECK(payload_type < 128);
656 codec.id = payload_type;
657
658 AddDefaultFeedbackParams(&codec);
659 AddCodecAndMaybeRtxCodec(codec, &supported_codecs);
660 }
661 LOG(LS_INFO) << "Supported codecs (incl. external codecs): "
662 << CodecVectorToString(supported_codecs);
663 LOG(LS_INFO) << "Codecs supported by the external encoder factory: "
664 << out.str();
665 return supported_codecs;
666 } 642 }
667 643
668 WebRtcVideoChannel2::WebRtcVideoChannel2( 644 WebRtcVideoChannel2::WebRtcVideoChannel2(
669 webrtc::Call* call, 645 webrtc::Call* call,
670 const MediaConfig& config, 646 const MediaConfig& config,
671 const VideoOptions& options, 647 const VideoOptions& options,
672 WebRtcVideoEncoderFactory* external_encoder_factory, 648 WebRtcVideoEncoderFactory* external_encoder_factory,
673 WebRtcVideoDecoderFactory* external_decoder_factory) 649 WebRtcVideoDecoderFactory* external_decoder_factory)
674 : VideoMediaChannel(config), 650 : VideoMediaChannel(config),
675 call_(call), 651 call_(call),
(...skipping 857 matching lines...) Expand 10 before | Expand all | Expand 10 after
1533 int max_bitrate_bps, 1509 int max_bitrate_bps,
1534 const rtc::Optional<VideoCodecSettings>& codec_settings) 1510 const rtc::Optional<VideoCodecSettings>& codec_settings)
1535 : config(std::move(config)), 1511 : config(std::move(config)),
1536 options(options), 1512 options(options),
1537 max_bitrate_bps(max_bitrate_bps), 1513 max_bitrate_bps(max_bitrate_bps),
1538 conference_mode(false), 1514 conference_mode(false),
1539 codec_settings(codec_settings) {} 1515 codec_settings(codec_settings) {}
1540 1516
1541 WebRtcVideoChannel2::WebRtcVideoSendStream::AllocatedEncoder::AllocatedEncoder( 1517 WebRtcVideoChannel2::WebRtcVideoSendStream::AllocatedEncoder::AllocatedEncoder(
1542 webrtc::VideoEncoder* encoder, 1518 webrtc::VideoEncoder* encoder,
1543 webrtc::VideoCodecType type, 1519 const cricket::VideoCodec& codec,
1544 bool external) 1520 bool external)
1545 : encoder(encoder), 1521 : encoder(encoder),
1546 external_encoder(nullptr), 1522 external_encoder(nullptr),
1547 type(type), 1523 codec(codec),
1548 external(external) { 1524 external(external) {
1549 if (external) { 1525 if (external) {
1550 external_encoder = encoder; 1526 external_encoder = encoder;
1551 this->encoder = 1527 this->encoder =
1552 new webrtc::VideoEncoderSoftwareFallbackWrapper(type, encoder); 1528 new webrtc::VideoEncoderSoftwareFallbackWrapper(codec, encoder);
1553 } 1529 }
1554 } 1530 }
1555 1531
1556 WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream( 1532 WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream(
1557 webrtc::Call* call, 1533 webrtc::Call* call,
1558 const StreamParams& sp, 1534 const StreamParams& sp,
1559 webrtc::VideoSendStream::Config config, 1535 webrtc::VideoSendStream::Config config,
1560 const VideoOptions& options, 1536 const VideoOptions& options,
1561 WebRtcVideoEncoderFactory* external_encoder_factory, 1537 WebRtcVideoEncoderFactory* external_encoder_factory,
1562 bool enable_cpu_overuse_detection, 1538 bool enable_cpu_overuse_detection,
1563 int max_bitrate_bps, 1539 int max_bitrate_bps,
1564 const rtc::Optional<VideoCodecSettings>& codec_settings, 1540 const rtc::Optional<VideoCodecSettings>& codec_settings,
1565 const rtc::Optional<std::vector<webrtc::RtpExtension>>& rtp_extensions, 1541 const rtc::Optional<std::vector<webrtc::RtpExtension>>& rtp_extensions,
1566 // TODO(deadbeef): Don't duplicate information between send_params, 1542 // TODO(deadbeef): Don't duplicate information between send_params,
1567 // rtp_extensions, options, etc. 1543 // rtp_extensions, options, etc.
1568 const VideoSendParameters& send_params) 1544 const VideoSendParameters& send_params)
1569 : worker_thread_(rtc::Thread::Current()), 1545 : worker_thread_(rtc::Thread::Current()),
1570 ssrcs_(sp.ssrcs), 1546 ssrcs_(sp.ssrcs),
1571 ssrc_groups_(sp.ssrc_groups), 1547 ssrc_groups_(sp.ssrc_groups),
1572 call_(call), 1548 call_(call),
1573 enable_cpu_overuse_detection_(enable_cpu_overuse_detection), 1549 enable_cpu_overuse_detection_(enable_cpu_overuse_detection),
1574 source_(nullptr), 1550 source_(nullptr),
1575 external_encoder_factory_(external_encoder_factory), 1551 external_encoder_factory_(external_encoder_factory),
1576 stream_(nullptr), 1552 stream_(nullptr),
1577 encoder_sink_(nullptr), 1553 encoder_sink_(nullptr),
1578 parameters_(std::move(config), options, max_bitrate_bps, codec_settings), 1554 parameters_(std::move(config), options, max_bitrate_bps, codec_settings),
1579 rtp_parameters_(CreateRtpParametersWithOneEncoding()), 1555 rtp_parameters_(CreateRtpParametersWithOneEncoding()),
1580 allocated_encoder_(nullptr, webrtc::kVideoCodecUnknown, false), 1556 allocated_encoder_(nullptr, cricket::VideoCodec(), false),
1581 sending_(false), 1557 sending_(false),
1582 last_frame_timestamp_us_(0) { 1558 last_frame_timestamp_us_(0) {
1583 parameters_.config.rtp.max_packet_size = kVideoMtu; 1559 parameters_.config.rtp.max_packet_size = kVideoMtu;
1584 parameters_.conference_mode = send_params.conference_mode; 1560 parameters_.conference_mode = send_params.conference_mode;
1585 1561
1586 sp.GetPrimarySsrcs(&parameters_.config.rtp.ssrcs); 1562 sp.GetPrimarySsrcs(&parameters_.config.rtp.ssrcs);
1587 sp.GetFidSsrcs(parameters_.config.rtp.ssrcs, 1563 sp.GetFidSsrcs(parameters_.config.rtp.ssrcs,
1588 &parameters_.config.rtp.rtx.ssrcs); 1564 &parameters_.config.rtp.rtx.ssrcs);
1589 parameters_.config.rtp.c_name = sp.cname; 1565 parameters_.config.rtp.c_name = sp.cname;
1590 if (rtp_extensions) { 1566 if (rtp_extensions) {
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1705 1681
1706 const std::vector<uint32_t>& 1682 const std::vector<uint32_t>&
1707 WebRtcVideoChannel2::WebRtcVideoSendStream::GetSsrcs() const { 1683 WebRtcVideoChannel2::WebRtcVideoSendStream::GetSsrcs() const {
1708 return ssrcs_; 1684 return ssrcs_;
1709 } 1685 }
1710 1686
1711 WebRtcVideoChannel2::WebRtcVideoSendStream::AllocatedEncoder 1687 WebRtcVideoChannel2::WebRtcVideoSendStream::AllocatedEncoder
1712 WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoder( 1688 WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoder(
1713 const VideoCodec& codec) { 1689 const VideoCodec& codec) {
1714 RTC_DCHECK_RUN_ON(&thread_checker_); 1690 RTC_DCHECK_RUN_ON(&thread_checker_);
1715 webrtc::VideoCodecType type = CodecTypeFromName(codec.name);
1716
1717 // Do not re-create encoders of the same type. 1691 // Do not re-create encoders of the same type.
1718 if (type == allocated_encoder_.type && allocated_encoder_.encoder != NULL) { 1692 if (codec == allocated_encoder_.codec &&
1693 allocated_encoder_.encoder != nullptr) {
1719 return allocated_encoder_; 1694 return allocated_encoder_;
1720 } 1695 }
1721 1696
1722 if (external_encoder_factory_ != NULL) { 1697 // Try creating external encoder.
1698 if (external_encoder_factory_ != nullptr &&
1699 FindMatchingCodec(external_encoder_factory_->supported_codecs(), codec)) {
1723 webrtc::VideoEncoder* encoder = 1700 webrtc::VideoEncoder* encoder =
1724 external_encoder_factory_->CreateVideoEncoder(codec); 1701 external_encoder_factory_->CreateVideoEncoder(codec);
1725 if (encoder != NULL) { 1702 if (encoder != nullptr)
1726 return AllocatedEncoder(encoder, type, true); 1703 return AllocatedEncoder(encoder, codec, true /* is_external */);
1727 }
1728 } 1704 }
1729 1705
1730 if (type == webrtc::kVideoCodecVP8) { 1706 // Try creating internal encoder.
1731 return AllocatedEncoder( 1707 WebRtcVideoEncoderFactory& internal_encoder_factory =
1732 webrtc::VideoEncoder::Create(webrtc::VideoEncoder::kVp8), type, false); 1708 InternalEncoderFactory::GetInstance();
1733 } else if (type == webrtc::kVideoCodecVP9) { 1709 if (FindMatchingCodec(internal_encoder_factory.supported_codecs(), codec)) {
1734 return AllocatedEncoder( 1710 return AllocatedEncoder(internal_encoder_factory.CreateVideoEncoder(codec),
1735 webrtc::VideoEncoder::Create(webrtc::VideoEncoder::kVp9), type, false); 1711 codec, false /* is_external */);
1736 } else if (type == webrtc::kVideoCodecH264) {
1737 return AllocatedEncoder(
1738 webrtc::VideoEncoder::Create(webrtc::VideoEncoder::kH264), type, false);
1739 } 1712 }
1740 1713
1741 // This shouldn't happen, we should not be trying to create something we don't 1714 // This shouldn't happen, we should not be trying to create something we don't
1742 // support. 1715 // support.
1743 RTC_DCHECK(false); 1716 RTC_DCHECK(false);
1744 return AllocatedEncoder(NULL, webrtc::kVideoCodecUnknown, false); 1717 return AllocatedEncoder(NULL, cricket::VideoCodec(), false);
1745 } 1718 }
1746 1719
1747 void WebRtcVideoChannel2::WebRtcVideoSendStream::DestroyVideoEncoder( 1720 void WebRtcVideoChannel2::WebRtcVideoSendStream::DestroyVideoEncoder(
1748 AllocatedEncoder* encoder) { 1721 AllocatedEncoder* encoder) {
1749 RTC_DCHECK_RUN_ON(&thread_checker_); 1722 RTC_DCHECK_RUN_ON(&thread_checker_);
1750 if (encoder->external) { 1723 if (encoder->external) {
1751 external_encoder_factory_->DestroyVideoEncoder(encoder->external_encoder); 1724 external_encoder_factory_->DestroyVideoEncoder(encoder->external_encoder);
1752 } 1725 }
1753 delete encoder->encoder; 1726 delete encoder->encoder;
1754 } 1727 }
(...skipping 820 matching lines...) Expand 10 before | Expand all | Expand 10 after
2575 rtx_mapping[video_codecs[i].codec.id] != 2548 rtx_mapping[video_codecs[i].codec.id] !=
2576 ulpfec_config.red_payload_type) { 2549 ulpfec_config.red_payload_type) {
2577 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; 2550 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id];
2578 } 2551 }
2579 } 2552 }
2580 2553
2581 return video_codecs; 2554 return video_codecs;
2582 } 2555 }
2583 2556
2584 } // namespace cricket 2557 } // namespace cricket
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698