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

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

Issue 3010743002: Refactor RTX video codec and payload type assignment (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 | « no previous file | 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
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 RTC_DCHECK(!initialized_); 427 RTC_DCHECK(!initialized_);
428 external_decoder_factory_ = decoder_factory; 428 external_decoder_factory_ = decoder_factory;
429 } 429 }
430 430
431 void WebRtcVideoEngine::SetExternalEncoderFactory( 431 void WebRtcVideoEngine::SetExternalEncoderFactory(
432 WebRtcVideoEncoderFactory* encoder_factory) { 432 WebRtcVideoEncoderFactory* encoder_factory) {
433 RTC_DCHECK(!initialized_); 433 RTC_DCHECK(!initialized_);
434 encoder_factory_.reset(new CricketEncoderFactoryAdapter(encoder_factory)); 434 encoder_factory_.reset(new CricketEncoderFactoryAdapter(encoder_factory));
435 } 435 }
436 436
437 // This is a helper function for AppendVideoCodecs below. It will return the 437 // This function will assign dynamic payload types (in the range [96, 127]) to
438 // first unused dynamic payload type (in the range [96, 127]), or nothing if no 438 // the input codecs, and also add associated RTX codecs for recognized codecs
439 // payload type is unused. 439 // (VP8, VP9, H264, and RED). It will also add default feedback params to the
440 static rtc::Optional<int> NextFreePayloadType( 440 // codecs.
441 const std::vector<VideoCodec>& codecs) { 441 static std::vector<VideoCodec> AssignPayloadTypesAndAddAssociatedRtxCodecs(
442 const std::vector<VideoCodec>& input_codecs) {
442 static const int kFirstDynamicPayloadType = 96; 443 static const int kFirstDynamicPayloadType = 96;
443 static const int kLastDynamicPayloadType = 127; 444 static const int kLastDynamicPayloadType = 127;
444 bool is_payload_used[1 + kLastDynamicPayloadType - kFirstDynamicPayloadType] = 445 int payload_type = kFirstDynamicPayloadType;
445 {false}; 446 std::vector<VideoCodec> output_codecs;
446 for (const VideoCodec& codec : codecs) { 447 for (VideoCodec codec : input_codecs) {
447 if (kFirstDynamicPayloadType <= codec.id && 448 codec.id = payload_type;
448 codec.id <= kLastDynamicPayloadType) { 449 if (codec.name != kRedCodecName && codec.name != kUlpfecCodecName &&
449 is_payload_used[codec.id - kFirstDynamicPayloadType] = true; 450 codec.name != kFlexfecCodecName) {
451 AddDefaultFeedbackParams(&codec);
450 } 452 }
451 } 453 output_codecs.push_back(codec);
452 for (int i = kFirstDynamicPayloadType; i <= kLastDynamicPayloadType; ++i) {
453 if (!is_payload_used[i - kFirstDynamicPayloadType])
454 return rtc::Optional<int>(i);
455 }
456 // No free payload type.
457 return rtc::Optional<int>();
458 }
459 454
460 // This is a helper function for GetSupportedCodecs below. It will append new 455 // Increment payload type.
461 // unique codecs from |input_codecs| to |unified_codecs|. It will add default 456 ++payload_type;
462 // feedback params to the codecs and will also add an associated RTX codec for 457 if (payload_type > kLastDynamicPayloadType)
463 // recognized codecs (VP8, VP9, H264, and RED). 458 break;
464 static void AppendVideoCodecs(const std::vector<VideoCodec>& input_codecs,
465 std::vector<VideoCodec>* unified_codecs) {
466 for (VideoCodec codec : input_codecs) {
467 const rtc::Optional<int> payload_type =
468 NextFreePayloadType(*unified_codecs);
469 if (!payload_type)
470 return;
471 codec.id = *payload_type;
472 // TODO(magjed): Move the responsibility of setting these parameters to the
473 // encoder factories instead.
474 if (codec.name != kRedCodecName && codec.name != kUlpfecCodecName &&
475 codec.name != kFlexfecCodecName)
476 AddDefaultFeedbackParams(&codec);
477 // Don't add same codec twice.
478 if (FindMatchingCodec(*unified_codecs, codec))
479 continue;
480
481 unified_codecs->push_back(codec);
482 459
483 // Add associated RTX codec for recognized codecs. 460 // Add associated RTX codec for recognized codecs.
484 // TODO(deadbeef): Should we add RTX codecs for external codecs whose names 461 // TODO(deadbeef): Should we add RTX codecs for external codecs whose names
485 // we don't recognize? 462 // we don't recognize?
486 if (CodecNamesEq(codec.name, kVp8CodecName) || 463 if (CodecNamesEq(codec.name, kVp8CodecName) ||
487 CodecNamesEq(codec.name, kVp9CodecName) || 464 CodecNamesEq(codec.name, kVp9CodecName) ||
488 CodecNamesEq(codec.name, kH264CodecName) || 465 CodecNamesEq(codec.name, kH264CodecName) ||
489 CodecNamesEq(codec.name, kRedCodecName)) { 466 CodecNamesEq(codec.name, kRedCodecName)) {
490 const rtc::Optional<int> rtx_payload_type = 467 output_codecs.push_back(
491 NextFreePayloadType(*unified_codecs); 468 VideoCodec::CreateRtxCodec(payload_type, codec.id));
492 if (!rtx_payload_type) 469
493 return; 470 // Increment payload type.
494 unified_codecs->push_back( 471 ++payload_type;
495 VideoCodec::CreateRtxCodec(*rtx_payload_type, codec.id)); 472 if (payload_type > kLastDynamicPayloadType)
473 break;
496 } 474 }
497 } 475 }
476 return output_codecs;
498 } 477 }
499 478
500 std::vector<VideoCodec> CricketEncoderFactoryAdapter::GetSupportedCodecs() 479 std::vector<VideoCodec> CricketEncoderFactoryAdapter::GetSupportedCodecs()
501 const { 480 const {
502 const std::vector<VideoCodec> internal_codecs = 481 std::vector<VideoCodec> codecs = InternalEncoderFactory().supported_codecs();
503 InternalEncoderFactory().supported_codecs();
504 LOG(LS_INFO) << "Internally supported codecs: " 482 LOG(LS_INFO) << "Internally supported codecs: "
505 << CodecVectorToString(internal_codecs); 483 << CodecVectorToString(codecs);
506 484
507 std::vector<VideoCodec> unified_codecs; 485 // Add external codecs.
508 AppendVideoCodecs(internal_codecs, &unified_codecs);
509
510 if (external_encoder_factory_ != nullptr) { 486 if (external_encoder_factory_ != nullptr) {
511 const std::vector<VideoCodec>& external_codecs = 487 const std::vector<VideoCodec>& external_codecs =
512 external_encoder_factory_->supported_codecs(); 488 external_encoder_factory_->supported_codecs();
513 AppendVideoCodecs(external_codecs, &unified_codecs); 489 for (const VideoCodec& codec : external_codecs) {
490 // Don't add same codec twice.
491 if (!FindMatchingCodec(codecs, codec))
492 codecs.push_back(codec);
493 }
514 LOG(LS_INFO) << "Codecs supported by the external encoder factory: " 494 LOG(LS_INFO) << "Codecs supported by the external encoder factory: "
515 << CodecVectorToString(external_codecs); 495 << CodecVectorToString(external_codecs);
516 } 496 }
517 497
518 return unified_codecs; 498 return AssignPayloadTypesAndAddAssociatedRtxCodecs(codecs);
519 } 499 }
520 500
521 WebRtcVideoChannel::WebRtcVideoChannel( 501 WebRtcVideoChannel::WebRtcVideoChannel(
522 webrtc::Call* call, 502 webrtc::Call* call,
523 const MediaConfig& config, 503 const MediaConfig& config,
524 const VideoOptions& options, 504 const VideoOptions& options,
525 const EncoderFactoryAdapter& encoder_factory, 505 const EncoderFactoryAdapter& encoder_factory,
526 WebRtcVideoDecoderFactory* external_decoder_factory) 506 WebRtcVideoDecoderFactory* external_decoder_factory)
527 : VideoMediaChannel(config), 507 : VideoMediaChannel(config),
528 call_(call), 508 call_(call),
(...skipping 2099 matching lines...) Expand 10 before | Expand all | Expand 10 after
2628 stream.temporal_layer_thresholds_bps.resize(GetDefaultVp9TemporalLayers() - 2608 stream.temporal_layer_thresholds_bps.resize(GetDefaultVp9TemporalLayers() -
2629 1); 2609 1);
2630 } 2610 }
2631 2611
2632 std::vector<webrtc::VideoStream> streams; 2612 std::vector<webrtc::VideoStream> streams;
2633 streams.push_back(stream); 2613 streams.push_back(stream);
2634 return streams; 2614 return streams;
2635 } 2615 }
2636 2616
2637 } // namespace cricket 2617 } // namespace cricket
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698