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

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

Issue 2493133002: Stop using hardcoded payload types for video codecs (Closed)
Patch Set: 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. The payload types of
562 // |codecs| should be incremental values of the dynamic payload types [96, 127].
hta-webrtc 2016/11/15 11:34:59 Grammar: I think "incrementing" is better than "in
magjed_webrtc 2016/11/15 17:18:26 Done.
563 // This function will return nothing if no more free payload types are
564 // available.
565 static rtc::Optional<int> NextFreePayloadType(
566 const std::vector<VideoCodec>& codecs) {
567 static const int kFirstDynamicPayloadType = 96;
568 static const int kLastDynamicPayloadType = 127;
569 if (codecs.empty())
570 return rtc::Optional<int>(kFirstDynamicPayloadType);
571 const int next_payload_type = codecs.back().id + 1;
hta-webrtc 2016/11/15 11:34:59 This strategy has two weaknesses: 1) If something
magjed_webrtc 2016/11/15 17:18:26 Yeah, it was not supposed to be generic. Like the
572 if (next_payload_type > kLastDynamicPayloadType)
573 return rtc::Optional<int>();
574 return rtc::Optional<int>(next_payload_type);
575 }
576
577 // This is a helper function for GetSupportedCodecs below. It will append new
578 // unique codecs from |input_codecs| to |unified_codecs|. It will add default
579 // feedback params to the codecs and will also add an associated RTX codec for
580 // recognized codecs (VP8, VP9, H264, and Red).
581 static void AppendVideoCodecs(const std::vector<VideoCodec>& input_codecs,
582 std::vector<VideoCodec>* unified_codecs) {
583 for (VideoCodec codec : input_codecs) {
584 const rtc::Optional<int> payload_type =
585 NextFreePayloadType(*unified_codecs);
586 if (!payload_type)
587 return;
588 codec.id = *payload_type;
589 // TODO(magjed): Move the responsibility of setting these parameters to the
590 // encoder factories instead.
591 if (codec.name != kRedCodecName && codec.name != kUlpfecCodecName)
592 AddDefaultFeedbackParams(&codec);
593 // Don't add same codec twice.
594 if (FindMatchingCodec(*unified_codecs, codec))
595 continue;
596
597 unified_codecs->push_back(codec);
598
599 // Add associated RTX codec for recognized codecs.
600 // TODO(deadbeef): Should we add RTX codecs for external codecs whose names
601 // we don't recognize?
602 if (CodecNamesEq(codec.name, kVp8CodecName) ||
603 CodecNamesEq(codec.name, kVp9CodecName) ||
604 CodecNamesEq(codec.name, kH264CodecName) ||
605 CodecNamesEq(codec.name, kRedCodecName)) {
606 const rtc::Optional<int> rtx_payload_type =
607 NextFreePayloadType(*unified_codecs);
608 if (!rtx_payload_type)
609 return;
610 unified_codecs->push_back(
611 VideoCodec::CreateRtxCodec(*rtx_payload_type, codec.id));
612 }
613 }
614 }
615
622 static std::vector<VideoCodec> GetSupportedCodecs( 616 static std::vector<VideoCodec> GetSupportedCodecs(
623 const WebRtcVideoEncoderFactory* external_encoder_factory) { 617 const WebRtcVideoEncoderFactory* external_encoder_factory) {
624 std::vector<VideoCodec> supported_codecs = DefaultVideoCodecList(); 618 const std::vector<VideoCodec>& internal_codecs =
619 InternalEncoderFactory::GetInstance().supported_codecs();
620 LOG(LS_INFO) << "Internally supported codecs: "
621 << CodecVectorToString(internal_codecs);
625 622
626 if (external_encoder_factory == nullptr) { 623 std::vector<VideoCodec> unified_codecs;
627 LOG(LS_INFO) << "Supported codecs: " 624 AppendVideoCodecs(internal_codecs, &unified_codecs);
628 << CodecVectorToString(supported_codecs); 625
629 return supported_codecs; 626 if (external_encoder_factory != nullptr) {
hta-webrtc 2016/11/15 11:34:59 What is the result of this strategy if the interna
magjed_webrtc 2016/11/15 17:18:26 Only one codec of a specific type will be added to
hta-webrtc 2016/11/15 20:36:24 OK, so if something's internally supported, we can
magjed_webrtc 2016/11/16 13:44:10 Yes, we can't add the codec twice, but we will act
627 const std::vector<VideoCodec>& external_codecs =
628 external_encoder_factory->supported_codecs();
629 AppendVideoCodecs(external_codecs, &unified_codecs);
630 LOG(LS_INFO) << "Codecs supported by the external encoder factory: "
631 << CodecVectorToString(external_codecs);
630 } 632 }
631 633
632 std::stringstream out; 634 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 } 635 }
667 636
668 WebRtcVideoChannel2::WebRtcVideoChannel2( 637 WebRtcVideoChannel2::WebRtcVideoChannel2(
669 webrtc::Call* call, 638 webrtc::Call* call,
670 const MediaConfig& config, 639 const MediaConfig& config,
671 const VideoOptions& options, 640 const VideoOptions& options,
672 WebRtcVideoEncoderFactory* external_encoder_factory, 641 WebRtcVideoEncoderFactory* external_encoder_factory,
673 WebRtcVideoDecoderFactory* external_decoder_factory) 642 WebRtcVideoDecoderFactory* external_decoder_factory)
674 : VideoMediaChannel(config), 643 : VideoMediaChannel(config),
675 call_(call), 644 call_(call),
(...skipping 842 matching lines...) Expand 10 before | Expand all | Expand 10 after
1518 int max_bitrate_bps, 1487 int max_bitrate_bps,
1519 const rtc::Optional<VideoCodecSettings>& codec_settings) 1488 const rtc::Optional<VideoCodecSettings>& codec_settings)
1520 : config(std::move(config)), 1489 : config(std::move(config)),
1521 options(options), 1490 options(options),
1522 max_bitrate_bps(max_bitrate_bps), 1491 max_bitrate_bps(max_bitrate_bps),
1523 conference_mode(false), 1492 conference_mode(false),
1524 codec_settings(codec_settings) {} 1493 codec_settings(codec_settings) {}
1525 1494
1526 WebRtcVideoChannel2::WebRtcVideoSendStream::AllocatedEncoder::AllocatedEncoder( 1495 WebRtcVideoChannel2::WebRtcVideoSendStream::AllocatedEncoder::AllocatedEncoder(
1527 webrtc::VideoEncoder* encoder, 1496 webrtc::VideoEncoder* encoder,
1528 webrtc::VideoCodecType type, 1497 const cricket::VideoCodec& codec,
1529 bool external) 1498 bool external)
1530 : encoder(encoder), 1499 : encoder(encoder),
1531 external_encoder(nullptr), 1500 external_encoder(nullptr),
1532 type(type), 1501 codec(codec),
1533 external(external) { 1502 external(external) {
1534 if (external) { 1503 if (external) {
1535 external_encoder = encoder; 1504 external_encoder = encoder;
1536 this->encoder = 1505 this->encoder =
1537 new webrtc::VideoEncoderSoftwareFallbackWrapper(type, encoder); 1506 new webrtc::VideoEncoderSoftwareFallbackWrapper(codec, encoder);
1538 } 1507 }
1539 } 1508 }
1540 1509
1541 WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream( 1510 WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream(
1542 webrtc::Call* call, 1511 webrtc::Call* call,
1543 const StreamParams& sp, 1512 const StreamParams& sp,
1544 webrtc::VideoSendStream::Config config, 1513 webrtc::VideoSendStream::Config config,
1545 const VideoOptions& options, 1514 const VideoOptions& options,
1546 WebRtcVideoEncoderFactory* external_encoder_factory, 1515 WebRtcVideoEncoderFactory* external_encoder_factory,
1547 bool enable_cpu_overuse_detection, 1516 bool enable_cpu_overuse_detection,
1548 int max_bitrate_bps, 1517 int max_bitrate_bps,
1549 const rtc::Optional<VideoCodecSettings>& codec_settings, 1518 const rtc::Optional<VideoCodecSettings>& codec_settings,
1550 const rtc::Optional<std::vector<webrtc::RtpExtension>>& rtp_extensions, 1519 const rtc::Optional<std::vector<webrtc::RtpExtension>>& rtp_extensions,
1551 // TODO(deadbeef): Don't duplicate information between send_params, 1520 // TODO(deadbeef): Don't duplicate information between send_params,
1552 // rtp_extensions, options, etc. 1521 // rtp_extensions, options, etc.
1553 const VideoSendParameters& send_params) 1522 const VideoSendParameters& send_params)
1554 : worker_thread_(rtc::Thread::Current()), 1523 : worker_thread_(rtc::Thread::Current()),
1555 ssrcs_(sp.ssrcs), 1524 ssrcs_(sp.ssrcs),
1556 ssrc_groups_(sp.ssrc_groups), 1525 ssrc_groups_(sp.ssrc_groups),
1557 call_(call), 1526 call_(call),
1558 enable_cpu_overuse_detection_(enable_cpu_overuse_detection), 1527 enable_cpu_overuse_detection_(enable_cpu_overuse_detection),
1559 source_(nullptr), 1528 source_(nullptr),
1560 external_encoder_factory_(external_encoder_factory), 1529 external_encoder_factory_(external_encoder_factory),
1561 stream_(nullptr), 1530 stream_(nullptr),
1562 encoder_sink_(nullptr), 1531 encoder_sink_(nullptr),
1563 parameters_(std::move(config), options, max_bitrate_bps, codec_settings), 1532 parameters_(std::move(config), options, max_bitrate_bps, codec_settings),
1564 rtp_parameters_(CreateRtpParametersWithOneEncoding()), 1533 rtp_parameters_(CreateRtpParametersWithOneEncoding()),
1565 allocated_encoder_(nullptr, webrtc::kVideoCodecUnknown, false), 1534 allocated_encoder_(nullptr, cricket::VideoCodec(), false),
1566 sending_(false), 1535 sending_(false),
1567 last_frame_timestamp_us_(0) { 1536 last_frame_timestamp_us_(0) {
1568 parameters_.config.rtp.max_packet_size = kVideoMtu; 1537 parameters_.config.rtp.max_packet_size = kVideoMtu;
1569 parameters_.conference_mode = send_params.conference_mode; 1538 parameters_.conference_mode = send_params.conference_mode;
1570 1539
1571 sp.GetPrimarySsrcs(&parameters_.config.rtp.ssrcs); 1540 sp.GetPrimarySsrcs(&parameters_.config.rtp.ssrcs);
1572 sp.GetFidSsrcs(parameters_.config.rtp.ssrcs, 1541 sp.GetFidSsrcs(parameters_.config.rtp.ssrcs,
1573 &parameters_.config.rtp.rtx.ssrcs); 1542 &parameters_.config.rtp.rtx.ssrcs);
1574 parameters_.config.rtp.c_name = sp.cname; 1543 parameters_.config.rtp.c_name = sp.cname;
1575 if (rtp_extensions) { 1544 if (rtp_extensions) {
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1690 1659
1691 const std::vector<uint32_t>& 1660 const std::vector<uint32_t>&
1692 WebRtcVideoChannel2::WebRtcVideoSendStream::GetSsrcs() const { 1661 WebRtcVideoChannel2::WebRtcVideoSendStream::GetSsrcs() const {
1693 return ssrcs_; 1662 return ssrcs_;
1694 } 1663 }
1695 1664
1696 WebRtcVideoChannel2::WebRtcVideoSendStream::AllocatedEncoder 1665 WebRtcVideoChannel2::WebRtcVideoSendStream::AllocatedEncoder
1697 WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoder( 1666 WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoder(
1698 const VideoCodec& codec) { 1667 const VideoCodec& codec) {
1699 RTC_DCHECK_RUN_ON(&thread_checker_); 1668 RTC_DCHECK_RUN_ON(&thread_checker_);
1700 webrtc::VideoCodecType type = CodecTypeFromName(codec.name);
1701
1702 // Do not re-create encoders of the same type. 1669 // Do not re-create encoders of the same type.
1703 if (type == allocated_encoder_.type && allocated_encoder_.encoder != NULL) { 1670 if (codec == allocated_encoder_.codec &&
1671 allocated_encoder_.encoder != nullptr) {
1704 return allocated_encoder_; 1672 return allocated_encoder_;
1705 } 1673 }
1706 1674
1707 if (external_encoder_factory_ != NULL) { 1675 // Try creating external encoder.
1676 if (external_encoder_factory_ != nullptr &&
1677 FindMatchingCodec(external_encoder_factory_->supported_codecs(), codec)) {
1708 webrtc::VideoEncoder* encoder = 1678 webrtc::VideoEncoder* encoder =
1709 external_encoder_factory_->CreateVideoEncoder(codec); 1679 external_encoder_factory_->CreateVideoEncoder(codec);
1710 if (encoder != NULL) { 1680 if (encoder != nullptr)
1711 return AllocatedEncoder(encoder, type, true); 1681 return AllocatedEncoder(encoder, codec, true /* is_external */);
1712 }
1713 } 1682 }
1714 1683
1715 if (type == webrtc::kVideoCodecVP8) { 1684 // Try creating internal encoder.
1716 return AllocatedEncoder( 1685 WebRtcVideoEncoderFactory& internal_encoder_factory =
1717 webrtc::VideoEncoder::Create(webrtc::VideoEncoder::kVp8), type, false); 1686 InternalEncoderFactory::GetInstance();
1718 } else if (type == webrtc::kVideoCodecVP9) { 1687 if (FindMatchingCodec(internal_encoder_factory.supported_codecs(), codec)) {
1719 return AllocatedEncoder( 1688 return AllocatedEncoder(internal_encoder_factory.CreateVideoEncoder(codec),
1720 webrtc::VideoEncoder::Create(webrtc::VideoEncoder::kVp9), type, false); 1689 codec, false /* is_external */);
1721 } else if (type == webrtc::kVideoCodecH264) {
1722 return AllocatedEncoder(
1723 webrtc::VideoEncoder::Create(webrtc::VideoEncoder::kH264), type, false);
1724 } 1690 }
1725 1691
1726 // This shouldn't happen, we should not be trying to create something we don't 1692 // This shouldn't happen, we should not be trying to create something we don't
1727 // support. 1693 // support.
1728 RTC_DCHECK(false); 1694 RTC_DCHECK(false);
1729 return AllocatedEncoder(NULL, webrtc::kVideoCodecUnknown, false); 1695 return AllocatedEncoder(NULL, cricket::VideoCodec(), false);
1730 } 1696 }
1731 1697
1732 void WebRtcVideoChannel2::WebRtcVideoSendStream::DestroyVideoEncoder( 1698 void WebRtcVideoChannel2::WebRtcVideoSendStream::DestroyVideoEncoder(
1733 AllocatedEncoder* encoder) { 1699 AllocatedEncoder* encoder) {
1734 RTC_DCHECK_RUN_ON(&thread_checker_); 1700 RTC_DCHECK_RUN_ON(&thread_checker_);
1735 if (encoder->external) { 1701 if (encoder->external) {
1736 external_encoder_factory_->DestroyVideoEncoder(encoder->external_encoder); 1702 external_encoder_factory_->DestroyVideoEncoder(encoder->external_encoder);
1737 } 1703 }
1738 delete encoder->encoder; 1704 delete encoder->encoder;
1739 } 1705 }
(...skipping 813 matching lines...) Expand 10 before | Expand all | Expand 10 after
2553 rtx_mapping[video_codecs[i].codec.id] != 2519 rtx_mapping[video_codecs[i].codec.id] !=
2554 ulpfec_config.red_payload_type) { 2520 ulpfec_config.red_payload_type) {
2555 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; 2521 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id];
2556 } 2522 }
2557 } 2523 }
2558 2524
2559 return video_codecs; 2525 return video_codecs;
2560 } 2526 }
2561 2527
2562 } // namespace cricket 2528 } // namespace cricket
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698