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

Side by Side Diff: webrtc/pc/mediasession.cc

Issue 2505003003: Let MediaSession generate a FlexFEC SSRC when FlexFEC is active. (Closed)
Patch Set: Rebase. Created 4 years 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 | webrtc/pc/mediasession_unittest.cc » ('j') | 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 2004 The WebRTC project authors. All Rights Reserved. 2 * Copyright 2004 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 428 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 GenerateSsrcs(*current_streams, num_ssrcs, &ssrcs); 439 GenerateSsrcs(*current_streams, num_ssrcs, &ssrcs);
440 if (include_rtx_streams) { 440 if (include_rtx_streams) {
441 content_description->AddLegacyStream(ssrcs[0], ssrcs[1]); 441 content_description->AddLegacyStream(ssrcs[0], ssrcs[1]);
442 content_description->set_multistream(true); 442 content_description->set_multistream(true);
443 } else { 443 } else {
444 content_description->AddLegacyStream(ssrcs[0]); 444 content_description->AddLegacyStream(ssrcs[0]);
445 } 445 }
446 return true; 446 return true;
447 } 447 }
448 448
449 const bool include_flexfec_stream =
450 ContainsFlexfecCodec(content_description->codecs());
451
449 MediaSessionOptions::Streams::const_iterator stream_it; 452 MediaSessionOptions::Streams::const_iterator stream_it;
450 for (stream_it = streams.begin(); 453 for (stream_it = streams.begin();
451 stream_it != streams.end(); ++stream_it) { 454 stream_it != streams.end(); ++stream_it) {
452 if (stream_it->type != media_type) 455 if (stream_it->type != media_type)
453 continue; // Wrong media type. 456 continue; // Wrong media type.
454 457
455 const StreamParams* param = 458 const StreamParams* param =
456 GetStreamByIds(*current_streams, "", stream_it->id); 459 GetStreamByIds(*current_streams, "", stream_it->id);
457 // groupid is empty for StreamParams generated using 460 // groupid is empty for StreamParams generated using
458 // MediaSessionDescriptionFactory. 461 // MediaSessionDescriptionFactory.
(...skipping 15 matching lines...) Expand all
474 if (include_rtx_streams) { 477 if (include_rtx_streams) {
475 // Generate an RTX ssrc for every ssrc in the group. 478 // Generate an RTX ssrc for every ssrc in the group.
476 std::vector<uint32_t> rtx_ssrcs; 479 std::vector<uint32_t> rtx_ssrcs;
477 GenerateSsrcs(*current_streams, static_cast<int>(ssrcs.size()), 480 GenerateSsrcs(*current_streams, static_cast<int>(ssrcs.size()),
478 &rtx_ssrcs); 481 &rtx_ssrcs);
479 for (size_t i = 0; i < ssrcs.size(); ++i) { 482 for (size_t i = 0; i < ssrcs.size(); ++i) {
480 stream_param.AddFidSsrc(ssrcs[i], rtx_ssrcs[i]); 483 stream_param.AddFidSsrc(ssrcs[i], rtx_ssrcs[i]);
481 } 484 }
482 content_description->set_multistream(true); 485 content_description->set_multistream(true);
483 } 486 }
487 // Generate extra ssrc for include_flexfec_stream case.
488 if (include_flexfec_stream) {
489 // TODO(brandtr): Update when we support multistream protection.
490 if (ssrcs.size() == 1) {
491 std::vector<uint32_t> flexfec_ssrcs;
492 GenerateSsrcs(*current_streams, 1, &flexfec_ssrcs);
493 stream_param.AddFecFrSsrc(ssrcs[0], flexfec_ssrcs[0]);
494 content_description->set_multistream(true);
495 } else if (!ssrcs.empty()) {
496 LOG(LS_WARNING)
497 << "Our FlexFEC implementation only supports protecting "
498 << "a single media streams. This session has multiple "
499 << "media streams however, so no FlexFEC SSRC will be generated.";
500 }
501 }
484 stream_param.cname = options.rtcp_cname; 502 stream_param.cname = options.rtcp_cname;
485 stream_param.sync_label = stream_it->sync_label; 503 stream_param.sync_label = stream_it->sync_label;
486 content_description->AddStream(stream_param); 504 content_description->AddStream(stream_param);
487 505
488 // Store the new StreamParams in current_streams. 506 // Store the new StreamParams in current_streams.
489 // This is necessary so that we can use the CNAME for other media types. 507 // This is necessary so that we can use the CNAME for other media types.
490 current_streams->push_back(stream_param); 508 current_streams->push_back(stream_param);
491 } else { 509 } else {
492 content_description->AddStream(*param); 510 content_description->AddStream(*param);
493 } 511 }
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
665 return false; 683 return false;
666 } 684 }
667 media_desc->set_cryptos(common_cryptos); 685 media_desc->set_cryptos(common_cryptos);
668 } 686 }
669 } 687 }
670 return true; 688 return true;
671 } 689 }
672 690
673 template <class C> 691 template <class C>
674 static bool ContainsRtxCodec(const std::vector<C>& codecs) { 692 static bool ContainsRtxCodec(const std::vector<C>& codecs) {
675 typename std::vector<C>::const_iterator it; 693 for (const auto& codec : codecs) {
676 for (it = codecs.begin(); it != codecs.end(); ++it) { 694 if (IsRtxCodec(codec)) {
677 if (IsRtxCodec(*it)) {
678 return true; 695 return true;
679 } 696 }
680 } 697 }
681 return false; 698 return false;
682 } 699 }
683 700
684 template <class C> 701 template <class C>
685 static bool IsRtxCodec(const C& codec) { 702 static bool IsRtxCodec(const C& codec) {
686 return stricmp(codec.name.c_str(), kRtxCodecName) == 0; 703 return stricmp(codec.name.c_str(), kRtxCodecName) == 0;
687 } 704 }
688 705
706 template <class C>
707 static bool ContainsFlexfecCodec(const std::vector<C>& codecs) {
708 for (const auto& codec : codecs) {
709 if (IsFlexfecCodec(codec)) {
710 return true;
711 }
712 }
713 return false;
714 }
715
716 template <class C>
717 static bool IsFlexfecCodec(const C& codec) {
718 return stricmp(codec.name.c_str(), kFlexfecCodecName) == 0;
719 }
720
689 static TransportOptions GetTransportOptions(const MediaSessionOptions& options, 721 static TransportOptions GetTransportOptions(const MediaSessionOptions& options,
690 const std::string& content_name) { 722 const std::string& content_name) {
691 TransportOptions transport_options; 723 TransportOptions transport_options;
692 auto it = options.transport_options.find(content_name); 724 auto it = options.transport_options.find(content_name);
693 if (it != options.transport_options.end()) { 725 if (it != options.transport_options.end()) {
694 transport_options = it->second; 726 transport_options = it->second;
695 } 727 }
696 transport_options.enable_ice_renomination = options.enable_ice_renomination; 728 transport_options.enable_ice_renomination = options.enable_ice_renomination;
697 return transport_options; 729 return transport_options;
698 } 730 }
(...skipping 1459 matching lines...) Expand 10 before | Expand all | Expand 10 after
2158 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO)); 2190 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO));
2159 } 2191 }
2160 2192
2161 DataContentDescription* GetFirstDataContentDescription( 2193 DataContentDescription* GetFirstDataContentDescription(
2162 SessionDescription* sdesc) { 2194 SessionDescription* sdesc) {
2163 return static_cast<DataContentDescription*>( 2195 return static_cast<DataContentDescription*>(
2164 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA)); 2196 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA));
2165 } 2197 }
2166 2198
2167 } // namespace cricket 2199 } // namespace cricket
OLDNEW
« no previous file with comments | « no previous file | webrtc/pc/mediasession_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698