| Index: webrtc/pc/mediasession.cc
|
| diff --git a/webrtc/pc/mediasession.cc b/webrtc/pc/mediasession.cc
|
| index f91a7297204541d7fcf24b82b053273e9dc614f6..abeeeab09c8a0feab0a8c0c3f3d69a93ef901e41 100644
|
| --- a/webrtc/pc/mediasession.cc
|
| +++ b/webrtc/pc/mediasession.cc
|
| @@ -446,6 +446,9 @@ static bool AddStreamParams(MediaType media_type,
|
| return true;
|
| }
|
|
|
| + const bool include_flexfec_stream =
|
| + ContainsFlexfecCodec(content_description->codecs());
|
| +
|
| MediaSessionOptions::Streams::const_iterator stream_it;
|
| for (stream_it = streams.begin();
|
| stream_it != streams.end(); ++stream_it) {
|
| @@ -481,6 +484,21 @@ static bool AddStreamParams(MediaType media_type,
|
| }
|
| content_description->set_multistream(true);
|
| }
|
| + // Generate extra ssrc for include_flexfec_stream case.
|
| + if (include_flexfec_stream) {
|
| + // TODO(brandtr): Update when we support multistream protection.
|
| + if (ssrcs.size() == 1) {
|
| + std::vector<uint32_t> flexfec_ssrcs;
|
| + GenerateSsrcs(*current_streams, 1, &flexfec_ssrcs);
|
| + stream_param.AddFecFrSsrc(ssrcs[0], flexfec_ssrcs[0]);
|
| + content_description->set_multistream(true);
|
| + } else if (!ssrcs.empty()) {
|
| + LOG(LS_WARNING)
|
| + << "Our FlexFEC implementation only supports protecting "
|
| + << "a single media streams. This session has multiple "
|
| + << "media streams however, so no FlexFEC SSRC will be generated.";
|
| + }
|
| + }
|
| stream_param.cname = options.rtcp_cname;
|
| stream_param.sync_label = stream_it->sync_label;
|
| content_description->AddStream(stream_param);
|
| @@ -672,9 +690,8 @@ static bool UpdateCryptoParamsForBundle(const ContentGroup& bundle_group,
|
|
|
| template <class C>
|
| static bool ContainsRtxCodec(const std::vector<C>& codecs) {
|
| - typename std::vector<C>::const_iterator it;
|
| - for (it = codecs.begin(); it != codecs.end(); ++it) {
|
| - if (IsRtxCodec(*it)) {
|
| + for (const auto& codec : codecs) {
|
| + if (IsRtxCodec(codec)) {
|
| return true;
|
| }
|
| }
|
| @@ -686,6 +703,21 @@ static bool IsRtxCodec(const C& codec) {
|
| return stricmp(codec.name.c_str(), kRtxCodecName) == 0;
|
| }
|
|
|
| +template <class C>
|
| +static bool ContainsFlexfecCodec(const std::vector<C>& codecs) {
|
| + for (const auto& codec : codecs) {
|
| + if (IsFlexfecCodec(codec)) {
|
| + return true;
|
| + }
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +template <class C>
|
| +static bool IsFlexfecCodec(const C& codec) {
|
| + return stricmp(codec.name.c_str(), kFlexfecCodecName) == 0;
|
| +}
|
| +
|
| static TransportOptions GetTransportOptions(const MediaSessionOptions& options,
|
| const std::string& content_name) {
|
| TransportOptions transport_options;
|
|
|