Chromium Code Reviews| Index: talk/session/media/mediasession.cc |
| diff --git a/talk/session/media/mediasession.cc b/talk/session/media/mediasession.cc |
| index 8d07e95a150d8a53e0190fd4f909d8b188b85137..a1426c34ab3e2b21149c5d789a732021782b827d 100644 |
| --- a/talk/session/media/mediasession.cc |
| +++ b/talk/session/media/mediasession.cc |
| @@ -907,20 +907,41 @@ static bool FindByUri(const RtpHeaderExtensions& extensions, |
| return false; |
| } |
| -static void FindAndSetRtpHdrExtUsed( |
| - const RtpHeaderExtensions& reference_extensions, |
| - RtpHeaderExtensions* offered_extensions, |
| - const RtpHeaderExtensions& other_extensions, |
| - UsedRtpHeaderExtensionIds* used_extensions) { |
| - for (RtpHeaderExtensions::const_iterator it = reference_extensions.begin(); |
| - it != reference_extensions.end(); ++it) { |
| - if (!FindByUri(*offered_extensions, *it, NULL)) { |
| - RtpHeaderExtension ext; |
| - if (!FindByUri(other_extensions, *it, &ext)) { |
| - ext = *it; |
| - used_extensions->FindAndSetIdUsed(&ext); |
| +// Iterates through |offered_extensions|, adding each one to |all_extensions| |
| +// and |used_ids|, and resolving ID conflicts. If an offered extension has the |
| +// same URI as one in |all_extensions|, it will re-use the same ID and won't be |
| +// treated as a conflict. |
| +static void FindAndSetRtpHdrExtUsed(RtpHeaderExtensions* offered_extensions, |
| + RtpHeaderExtensions* all_extensions, |
| + UsedRtpHeaderExtensionIds* used_ids) { |
| + for (auto& extension : *offered_extensions) { |
| + RtpHeaderExtension existing; |
| + if (FindByUri(*all_extensions, extension, &existing)) { |
| + extension.id = existing.id; |
| + } else { |
| + used_ids->FindAndSetIdUsed(&extension); |
| + all_extensions->push_back(extension); |
| + } |
| + } |
| +} |
| + |
| +// Adds |reference_extensions| to |offered_extensions|, while updating |
| +// |all_extensions| and |used_ids|. |
| +static void FindRtpHdrExtsToOffer( |
| + const RtpHeaderExtensions& reference_extensions, |
| + RtpHeaderExtensions* offered_extensions, |
| + RtpHeaderExtensions* all_extensions, |
| + UsedRtpHeaderExtensionIds* used_ids) { |
| + for (auto reference_extension : reference_extensions) { |
|
pthatcher1
2015/08/18 20:33:12
Can't it be "const auto&" instead of auto?
Taylor Brandstetter
2015/08/18 20:55:06
No, because FindAndSetIdUsed modifies the id, and
|
| + if (!FindByUri(*offered_extensions, reference_extension, NULL)) { |
| + RtpHeaderExtension existing; |
| + if (FindByUri(*all_extensions, reference_extension, &existing)) { |
| + offered_extensions->push_back(existing); |
| + } else { |
| + used_ids->FindAndSetIdUsed(&reference_extension); |
| + all_extensions->push_back(reference_extension); |
| + offered_extensions->push_back(reference_extension); |
| } |
| - offered_extensions->push_back(ext); |
| } |
| } |
| } |
| @@ -1398,6 +1419,7 @@ void MediaSessionDescriptionFactory::GetRtpHdrExtsToOffer( |
| // All header extensions allocated from the same range to avoid potential |
| // issues when using BUNDLE. |
| UsedRtpHeaderExtensionIds used_ids; |
| + RtpHeaderExtensions all_extensions; |
| audio_extensions->clear(); |
| video_extensions->clear(); |
| @@ -1410,22 +1432,22 @@ void MediaSessionDescriptionFactory::GetRtpHdrExtsToOffer( |
| GetFirstAudioContentDescription(current_description); |
| if (audio) { |
| *audio_extensions = audio->rtp_header_extensions(); |
| - used_ids.FindAndSetIdUsed(audio_extensions); |
| + FindAndSetRtpHdrExtUsed(audio_extensions, &all_extensions, &used_ids); |
| } |
| const VideoContentDescription* video = |
| GetFirstVideoContentDescription(current_description); |
| if (video) { |
| *video_extensions = video->rtp_header_extensions(); |
| - used_ids.FindAndSetIdUsed(video_extensions); |
| + FindAndSetRtpHdrExtUsed(video_extensions, &all_extensions, &used_ids); |
| } |
| } |
| // Add our default RTP header extensions that are not in |
| // |current_description|. |
| - FindAndSetRtpHdrExtUsed(audio_rtp_header_extensions(), audio_extensions, |
| - *video_extensions, &used_ids); |
| - FindAndSetRtpHdrExtUsed(video_rtp_header_extensions(), video_extensions, |
| - *audio_extensions, &used_ids); |
| + FindRtpHdrExtsToOffer(audio_rtp_header_extensions(), audio_extensions, |
| + &all_extensions, &used_ids); |
| + FindRtpHdrExtsToOffer(video_rtp_header_extensions(), video_extensions, |
| + &all_extensions, &used_ids); |
| } |
| bool MediaSessionDescriptionFactory::AddTransportOffer( |