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

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

Issue 2493733003: Optimize FindCodecById and ReferencedCodecsMatch (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
« no previous file with comments | « webrtc/media/base/rtpdataengine.cc ('k') | 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 734 matching lines...) Expand 10 before | Expand all | Expand 10 after
745 #endif 745 #endif
746 746
747 if (offer->crypto_required() == CT_SDES && offer->cryptos().empty()) { 747 if (offer->crypto_required() == CT_SDES && offer->cryptos().empty()) {
748 return false; 748 return false;
749 } 749 }
750 return true; 750 return true;
751 } 751 }
752 752
753 template <class C> 753 template <class C>
754 static bool ReferencedCodecsMatch(const std::vector<C>& codecs1, 754 static bool ReferencedCodecsMatch(const std::vector<C>& codecs1,
755 const std::string& codec1_id_str, 755 const int codec1_id,
756 const std::vector<C>& codecs2, 756 const std::vector<C>& codecs2,
757 const std::string& codec2_id_str) { 757 const int codec2_id) {
758 int codec1_id; 758 const C* codec1 = FindCodecById(codecs1, codec1_id);
759 int codec2_id; 759 const C* codec2 = FindCodecById(codecs2, codec2_id);
760 C codec1; 760 return codec1 != nullptr && codec2 != nullptr && codec1->Matches(*codec2);
761 C codec2;
762 if (!rtc::FromString(codec1_id_str, &codec1_id) ||
763 !rtc::FromString(codec2_id_str, &codec2_id) ||
764 !FindCodecById(codecs1, codec1_id, &codec1) ||
765 !FindCodecById(codecs2, codec2_id, &codec2)) {
766 return false;
767 }
768 return codec1.Matches(codec2);
769 } 761 }
770 762
771 template <class C> 763 template <class C>
772 static void NegotiateCodecs(const std::vector<C>& local_codecs, 764 static void NegotiateCodecs(const std::vector<C>& local_codecs,
773 const std::vector<C>& offered_codecs, 765 const std::vector<C>& offered_codecs,
774 std::vector<C>* negotiated_codecs) { 766 std::vector<C>* negotiated_codecs) {
775 for (const C& ours : local_codecs) { 767 for (const C& ours : local_codecs) {
776 C theirs; 768 C theirs;
777 // Note that we intentionally only find one matching codec for each of our 769 // Note that we intentionally only find one matching codec for each of our
778 // local codecs, in case the remote offer contains duplicate codecs. 770 // local codecs, in case the remote offer contains duplicate codecs.
779 if (FindMatchingCodec(local_codecs, offered_codecs, ours, &theirs)) { 771 if (FindMatchingCodec(local_codecs, offered_codecs, ours, &theirs)) {
780 C negotiated = ours; 772 C negotiated = ours;
781 negotiated.IntersectFeedbackParams(theirs); 773 negotiated.IntersectFeedbackParams(theirs);
782 if (IsRtxCodec(negotiated)) { 774 if (IsRtxCodec(negotiated)) {
783 std::string offered_apt_value; 775 const auto apt_it =
784 theirs.GetParam(kCodecParamAssociatedPayloadType, &offered_apt_value); 776 theirs.params.find(kCodecParamAssociatedPayloadType);
785 // FindMatchingCodec shouldn't return something with no apt value. 777 // FindMatchingCodec shouldn't return something with no apt value.
786 RTC_DCHECK(!offered_apt_value.empty()); 778 RTC_DCHECK(apt_it != theirs.params.end());
787 negotiated.SetParam(kCodecParamAssociatedPayloadType, 779 negotiated.SetParam(kCodecParamAssociatedPayloadType, apt_it->second);
788 offered_apt_value);
789 } 780 }
790 negotiated.id = theirs.id; 781 negotiated.id = theirs.id;
791 negotiated.name = theirs.name; 782 negotiated.name = theirs.name;
792 negotiated_codecs->push_back(negotiated); 783 negotiated_codecs->push_back(std::move(negotiated));
793 } 784 }
794 } 785 }
795 // RFC3264: Although the answerer MAY list the formats in their desired 786 // RFC3264: Although the answerer MAY list the formats in their desired
796 // order of preference, it is RECOMMENDED that unless there is a 787 // order of preference, it is RECOMMENDED that unless there is a
797 // specific reason, the answerer list formats in the same relative order 788 // specific reason, the answerer list formats in the same relative order
798 // they were present in the offer. 789 // they were present in the offer.
799 std::unordered_map<int, int> payload_type_preferences; 790 std::unordered_map<int, int> payload_type_preferences;
800 int preference = static_cast<int>(offered_codecs.size() + 1); 791 int preference = static_cast<int>(offered_codecs.size() + 1);
801 for (const C& codec : offered_codecs) { 792 for (const C& codec : offered_codecs) {
802 payload_type_preferences[codec.id] = preference--; 793 payload_type_preferences[codec.id] = preference--;
803 } 794 }
804 std::sort(negotiated_codecs->begin(), negotiated_codecs->end(), 795 std::sort(negotiated_codecs->begin(), negotiated_codecs->end(),
805 [&payload_type_preferences](const C& a, const C& b) { 796 [&payload_type_preferences](const C& a, const C& b) {
806 return payload_type_preferences[a.id] > 797 return payload_type_preferences[a.id] >
807 payload_type_preferences[b.id]; 798 payload_type_preferences[b.id];
808 }); 799 });
809 } 800 }
810 801
811 // Finds a codec in |codecs2| that matches |codec_to_match|, which is 802 // Finds a codec in |codecs2| that matches |codec_to_match|, which is
812 // a member of |codecs1|. If |codec_to_match| is an RTX codec, both 803 // a member of |codecs1|. If |codec_to_match| is an RTX codec, both
813 // the codecs themselves and their associated codecs must match. 804 // the codecs themselves and their associated codecs must match.
814 template <class C> 805 template <class C>
815 static bool FindMatchingCodec(const std::vector<C>& codecs1, 806 static bool FindMatchingCodec(const std::vector<C>& codecs1,
816 const std::vector<C>& codecs2, 807 const std::vector<C>& codecs2,
817 const C& codec_to_match, 808 const C& codec_to_match,
818 C* found_codec) { 809 C* found_codec) {
819 for (const C& potential_match : codecs2) { 810 for (const C& potential_match : codecs2) {
820 if (potential_match.Matches(codec_to_match)) { 811 if (potential_match.Matches(codec_to_match)) {
821 if (IsRtxCodec(codec_to_match)) { 812 if (IsRtxCodec(codec_to_match)) {
822 std::string apt_value_1; 813 int apt_value_1 = 0;
823 std::string apt_value_2; 814 int apt_value_2 = 0;
824 if (!codec_to_match.GetParam(kCodecParamAssociatedPayloadType, 815 if (!codec_to_match.GetParam(kCodecParamAssociatedPayloadType,
825 &apt_value_1) || 816 &apt_value_1) ||
826 !potential_match.GetParam(kCodecParamAssociatedPayloadType, 817 !potential_match.GetParam(kCodecParamAssociatedPayloadType,
827 &apt_value_2)) { 818 &apt_value_2)) {
828 LOG(LS_WARNING) << "RTX missing associated payload type."; 819 LOG(LS_WARNING) << "RTX missing associated payload type.";
829 continue; 820 continue;
830 } 821 }
831 if (!ReferencedCodecsMatch(codecs1, apt_value_1, codecs2, 822 if (!ReferencedCodecsMatch(codecs1, apt_value_1, codecs2,
832 apt_value_2)) { 823 apt_value_2)) {
833 continue; 824 continue;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
879 870
880 int associated_pt; 871 int associated_pt;
881 if (!rtc::FromString(associated_pt_str, &associated_pt)) { 872 if (!rtc::FromString(associated_pt_str, &associated_pt)) {
882 LOG(LS_WARNING) << "Couldn't convert payload type " << associated_pt_str 873 LOG(LS_WARNING) << "Couldn't convert payload type " << associated_pt_str
883 << " of RTX codec " << rtx_codec.name 874 << " of RTX codec " << rtx_codec.name
884 << " to an integer."; 875 << " to an integer.";
885 continue; 876 continue;
886 } 877 }
887 878
888 // Find the associated reference codec for the reference RTX codec. 879 // Find the associated reference codec for the reference RTX codec.
889 C associated_codec; 880 const C* associated_codec =
890 if (!FindCodecById(reference_codecs, associated_pt, &associated_codec)) { 881 FindCodecById(reference_codecs, associated_pt);
882 if (!associated_codec) {
891 LOG(LS_WARNING) << "Couldn't find associated codec with payload type " 883 LOG(LS_WARNING) << "Couldn't find associated codec with payload type "
892 << associated_pt << " for RTX codec " << rtx_codec.name 884 << associated_pt << " for RTX codec " << rtx_codec.name
893 << "."; 885 << ".";
894 continue; 886 continue;
895 } 887 }
896 888
897 // Find a codec in the offered list that matches the reference codec. 889 // Find a codec in the offered list that matches the reference codec.
898 // Its payload type may be different than the reference codec. 890 // Its payload type may be different than the reference codec.
899 C matching_codec; 891 C matching_codec;
900 if (!FindMatchingCodec<C>(reference_codecs, *offered_codecs, 892 if (!FindMatchingCodec<C>(reference_codecs, *offered_codecs,
901 associated_codec, &matching_codec)) { 893 *associated_codec, &matching_codec)) {
902 LOG(LS_WARNING) << "Couldn't find matching " << associated_codec.name 894 LOG(LS_WARNING) << "Couldn't find matching " << associated_codec->name
903 << " codec."; 895 << " codec.";
904 continue; 896 continue;
905 } 897 }
906 898
907 rtx_codec.params[kCodecParamAssociatedPayloadType] = 899 rtx_codec.params[kCodecParamAssociatedPayloadType] =
908 rtc::ToString(matching_codec.id); 900 rtc::ToString(matching_codec.id);
909 used_pltypes->FindAndSetIdUsed(&rtx_codec); 901 used_pltypes->FindAndSetIdUsed(&rtx_codec);
910 offered_codecs->push_back(rtx_codec); 902 offered_codecs->push_back(rtx_codec);
911 } 903 }
912 } 904 }
(...skipping 1248 matching lines...) Expand 10 before | Expand all | Expand 10 after
2161 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO)); 2153 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO));
2162 } 2154 }
2163 2155
2164 DataContentDescription* GetFirstDataContentDescription( 2156 DataContentDescription* GetFirstDataContentDescription(
2165 SessionDescription* sdesc) { 2157 SessionDescription* sdesc) {
2166 return static_cast<DataContentDescription*>( 2158 return static_cast<DataContentDescription*>(
2167 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA)); 2159 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA));
2168 } 2160 }
2169 2161
2170 } // namespace cricket 2162 } // namespace cricket
OLDNEW
« no previous file with comments | « webrtc/media/base/rtpdataengine.cc ('k') | webrtc/pc/mediasession_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698