10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/* 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2012, Google Inc. 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer. 100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * and/or other materials provided with the distribution. 130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * derived from this software without specific prior written permission. 150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */ 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/mediastreamsignaling.h" 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <vector> 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/audiotrack.h" 330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/mediaconstraintsinterface.h" 34cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/app/webrtc/mediastreamproxy.h" 350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/mediastreamtrackproxy.h" 368a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org#include "talk/app/webrtc/remoteaudiosource.h" 374ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org#include "talk/app/webrtc/remotevideocapturer.h" 388485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org#include "talk/app/webrtc/sctputils.h" 394ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org#include "talk/app/webrtc/videosource.h" 400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/videotrack.h" 41cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/media/sctp/sctpdataengine.h" 422a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/bytebuffer.h" 432a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/stringutils.h" 440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kDefaultStreamLabel[] = "default"; 460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kDefaultAudioTrackLabel[] = "defaulta0"; 470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kDefaultVideoTrackLabel[] = "defaultv0"; 480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace webrtc { 500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 512a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgusing rtc::scoped_ptr; 522a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgusing rtc::scoped_refptr; 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 54966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.orgstatic bool ParseConstraintsForAnswer( 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const MediaConstraintsInterface* constraints, 56966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org cricket::MediaSessionOptions* options) { 570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool value; 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t mandatory_constraints_satisfied = 0; 590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (FindConstraint(constraints, 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaConstraintsInterface::kOfferToReceiveAudio, 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &value, &mandatory_constraints_satisfied)) { 630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // |options-|has_audio| can only change from false to 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // true, but never change from true to false. This is to make sure 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // CreateOffer / CreateAnswer doesn't remove a media content 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // description that has been created. 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options->has_audio |= value; 680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // kOfferToReceiveAudio defaults to true according to spec. 700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options->has_audio = true; 710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (FindConstraint(constraints, 740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaConstraintsInterface::kOfferToReceiveVideo, 750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &value, &mandatory_constraints_satisfied)) { 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // |options->has_video| can only change from false to 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // true, but never change from true to false. This is to make sure 780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // CreateOffer / CreateAnswer doesn't remove a media content 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // description that has been created. 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options->has_video |= value; 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // kOfferToReceiveVideo defaults to false according to spec. But 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // if it is an answer and video is offered, we should still accept video 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // per default. 85966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org options->has_video = true; 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (FindConstraint(constraints, 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaConstraintsInterface::kVoiceActivityDetection, 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &value, &mandatory_constraints_satisfied)) { 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options->vad_enabled = value; 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (FindConstraint(constraints, 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaConstraintsInterface::kUseRtpMux, 960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &value, &mandatory_constraints_satisfied)) { 970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options->bundle_enabled = value; 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // kUseRtpMux defaults to true according to spec. 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options->bundle_enabled = true; 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (FindConstraint(constraints, 1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaConstraintsInterface::kIceRestart, 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &value, &mandatory_constraints_satisfied)) { 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options->transport_options.ice_restart = value; 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // kIceRestart defaults to false according to spec. 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options->transport_options.ice_restart = false; 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!constraints) { 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return mandatory_constraints_satisfied == constraints->GetMandatory().size(); 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Returns true if if at least one media content is present and 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// |options.bundle_enabled| is true. 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Bundle will be enabled by default if at least one media content is present 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// and the constraint kUseRtpMux has not disabled bundle. 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic bool EvaluateNeedForBundle(const cricket::MediaSessionOptions& options) { 1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return options.bundle_enabled && 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org (options.has_audio || options.has_video || options.has_data()); 1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 126bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.orgstatic bool MediaContentDirectionHasSend(cricket::MediaContentDirection dir) { 127bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org return dir == cricket::MD_SENDONLY || dir == cricket::MD_SENDRECV; 128bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org} 129bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org 1304fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.orgstatic bool IsValidOfferToReceiveMedia(int value) { 1314fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org typedef PeerConnectionInterface::RTCOfferAnswerOptions Options; 1324fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org return (value >= Options::kUndefined) && 1334fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org (value <= Options::kMaxOfferToReceiveMedia); 1344fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org} 1354fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 136966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org// Add the stream and RTP data channel info to |session_options|. 137966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.orgstatic void SetStreams( 138966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org cricket::MediaSessionOptions* session_options, 139966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org rtc::scoped_refptr<StreamCollection> streams, 140966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org const MediaStreamSignaling::RtpDataChannels& rtp_data_channels) { 141966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org session_options->streams.clear(); 142966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org if (streams != NULL) { 143966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org for (size_t i = 0; i < streams->count(); ++i) { 144966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org MediaStreamInterface* stream = streams->at(i); 145966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org 146966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org AudioTrackVector audio_tracks(stream->GetAudioTracks()); 147966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org 148966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org // For each audio track in the stream, add it to the MediaSessionOptions. 149966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org for (size_t j = 0; j < audio_tracks.size(); ++j) { 150966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org scoped_refptr<MediaStreamTrackInterface> track(audio_tracks[j]); 151966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org session_options->AddStream( 152966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org cricket::MEDIA_TYPE_AUDIO, track->id(), stream->label()); 153966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org } 154966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org 155966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org VideoTrackVector video_tracks(stream->GetVideoTracks()); 156966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org 157966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org // For each video track in the stream, add it to the MediaSessionOptions. 158966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org for (size_t j = 0; j < video_tracks.size(); ++j) { 159966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org scoped_refptr<MediaStreamTrackInterface> track(video_tracks[j]); 160966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org session_options->AddStream( 161966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org cricket::MEDIA_TYPE_VIDEO, track->id(), stream->label()); 162966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org } 163966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org } 164966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org } 165966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org 166966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org // Check for data channels. 167966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org MediaStreamSignaling::RtpDataChannels::const_iterator data_channel_it = 168966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org rtp_data_channels.begin(); 169966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org for (; data_channel_it != rtp_data_channels.end(); ++data_channel_it) { 170966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org const DataChannel* channel = data_channel_it->second; 171966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org if (channel->state() == DataChannel::kConnecting || 172966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org channel->state() == DataChannel::kOpen) { 173966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org // |streamid| and |sync_label| are both set to the DataChannel label 174966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org // here so they can be signaled the same way as MediaStreams and Tracks. 175966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org // For MediaStreams, the sync_label is the MediaStream label and the 176966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org // track label is the same as |streamid|. 177966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org const std::string& streamid = channel->label(); 178966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org const std::string& sync_label = channel->label(); 179966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org session_options->AddStream( 180966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org cricket::MEDIA_TYPE_DATA, streamid, sync_label); 181966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org } 182966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org } 183966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org} 184966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org 1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Factory class for creating remote MediaStreams and MediaStreamTracks. 1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass RemoteMediaStreamFactory { 1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 1882a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org explicit RemoteMediaStreamFactory(rtc::Thread* signaling_thread, 1894ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org cricket::ChannelManager* channel_manager) 1904ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org : signaling_thread_(signaling_thread), 1914ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org channel_manager_(channel_manager) { 1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1942a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<MediaStreamInterface> CreateMediaStream( 1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& stream_label) { 1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return MediaStreamProxy::Create( 1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org signaling_thread_, MediaStream::Create(stream_label)); 1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioTrackInterface* AddAudioTrack(webrtc::MediaStreamInterface* stream, 2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& track_id) { 2024ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org return AddTrack<AudioTrackInterface, AudioTrack, AudioTrackProxy>( 2038a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org stream, track_id, RemoteAudioSource::Create().get()); 2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoTrackInterface* AddVideoTrack(webrtc::MediaStreamInterface* stream, 2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& track_id) { 2084ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org return AddTrack<VideoTrackInterface, VideoTrack, VideoTrackProxy>( 2094ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org stream, track_id, VideoSource::Create(channel_manager_, 2104ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org new RemoteVideoCapturer(), 2114ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org NULL).get()); 2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private: 2154ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org template <typename TI, typename T, typename TP, typename S> 2164ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org TI* AddTrack(MediaStreamInterface* stream, const std::string& track_id, 2174ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org S* source) { 2182a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<TI> track( 2194ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org TP::Create(signaling_thread_, T::Create(track_id, source))); 2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org track->set_state(webrtc::MediaStreamTrackInterface::kLive); 2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (stream->AddTrack(track)) { 2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return track; 2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return NULL; 2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2272a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread* signaling_thread_; 2284ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org cricket::ChannelManager* channel_manager_; 2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgMediaStreamSignaling::MediaStreamSignaling( 2322a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread* signaling_thread, 2334ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org MediaStreamSignalingObserver* stream_observer, 2344ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org cricket::ChannelManager* channel_manager) 2350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : signaling_thread_(signaling_thread), 2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_channel_factory_(NULL), 2370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream_observer_(stream_observer), 2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org local_streams_(StreamCollection::Create()), 2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_streams_(StreamCollection::Create()), 2404ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org remote_stream_factory_(new RemoteMediaStreamFactory(signaling_thread, 2414ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org channel_manager)), 242d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org last_allocated_sctp_even_sid_(-2), 243d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org last_allocated_sctp_odd_sid_(-1) { 2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgMediaStreamSignaling::~MediaStreamSignaling() { 2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamSignaling::TearDown() { 2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org OnAudioChannelClose(); 2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org OnVideoChannelClose(); 2520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org OnDataChannelClose(); 2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 255d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.orgbool MediaStreamSignaling::IsSctpSidAvailable(int sid) const { 256d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org if (sid < 0 || sid > static_cast<int>(cricket::kMaxSctpSid)) 2570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 258f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org 259f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org return FindDataChannelBySid(sid) < 0; 2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 262d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org// Gets the first unused odd/even id based on the DTLS role. If |role| is 263d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org// SSL_CLIENT, the allocated id starts from 0 and takes even numbers; otherwise, 264d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org// the id starts from 1 and takes odd numbers. Returns false if no id can be 265d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org// allocated. 2662a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgbool MediaStreamSignaling::AllocateSctpSid(rtc::SSLRole role, int* sid) { 2672a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org int& last_id = (role == rtc::SSL_CLIENT) ? 268d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org last_allocated_sctp_even_sid_ : last_allocated_sctp_odd_sid_; 269d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org 2700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org do { 271d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org last_id += 2; 272d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org } while (last_id <= static_cast<int>(cricket::kMaxSctpSid) && 273d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org !IsSctpSidAvailable(last_id)); 2740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 275d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org if (last_id > static_cast<int>(cricket::kMaxSctpSid)) { 2760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 2770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 279d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org *sid = last_id; 2800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 2810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 283ed274f89091f7acb8cacde3cae1d69cb2a19193dsergeyu@chromium.orgbool MediaStreamSignaling::HasDataChannels() const { 28419da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org return !rtp_data_channels_.empty() || !sctp_data_channels_.empty(); 285ed274f89091f7acb8cacde3cae1d69cb2a19193dsergeyu@chromium.org} 286ed274f89091f7acb8cacde3cae1d69cb2a19193dsergeyu@chromium.org 2870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool MediaStreamSignaling::AddDataChannel(DataChannel* data_channel) { 2880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(data_channel != NULL); 28919da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org if (data_channel->data_channel_type() == cricket::DCT_RTP) { 29019da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org if (rtp_data_channels_.find(data_channel->label()) != 29119da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org rtp_data_channels_.end()) { 29219da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org LOG(LS_ERROR) << "DataChannel with label " << data_channel->label() 29319da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org << " already exists."; 29419da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org return false; 29519da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org } 29619da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org rtp_data_channels_[data_channel->label()] = data_channel; 29719da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org } else { 29819da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org ASSERT(data_channel->data_channel_type() == cricket::DCT_SCTP); 29919da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org sctp_data_channels_.push_back(data_channel); 3000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 3020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3045aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.orgbool MediaStreamSignaling::AddDataChannelFromOpenMessage( 3058485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org const cricket::ReceiveDataParams& params, 3062a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const rtc::Buffer& payload) { 3075aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org if (!data_channel_factory_) { 3085aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org LOG(LS_WARNING) << "Remote peer requested a DataChannel but DataChannels " 3095aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org << "are not supported."; 3105aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org return false; 3115aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org } 3128485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org 3138485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org std::string label; 3148485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org InternalDataChannelInit config; 3158485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org config.id = params.ssrc; 3168485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org if (!ParseDataChannelOpenMessage(payload, &label, &config)) { 3178485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org LOG(LS_WARNING) << "Failed to parse the OPEN message for sid " 3188485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org << params.ssrc; 3198485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org return false; 3208485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org } 3218485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org config.open_handshake_role = InternalDataChannelInit::kAcker; 3228485ec698cd13d65354e2f81132b5763a3d216a4henrika@webrtc.org 3235aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org scoped_refptr<DataChannel> channel( 3245aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org data_channel_factory_->CreateDataChannel(label, &config)); 3255c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org if (!channel.get()) { 3265c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org LOG(LS_ERROR) << "Failed to create DataChannel from the OPEN message."; 3275c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org return false; 3285c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org } 3290d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org 3305aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org stream_observer_->OnAddDataChannel(channel); 3315aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org return true; 3325aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org} 3335aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 33481f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.orgvoid MediaStreamSignaling::RemoveSctpDataChannel(int sid) { 3350d3bdd025894a74f06f38612efb897b80b7ac164jiayl@webrtc.org ASSERT(sid >= 0); 33681f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org for (SctpDataChannels::iterator iter = sctp_data_channels_.begin(); 33781f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org iter != sctp_data_channels_.end(); 33881f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org ++iter) { 33981f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org if ((*iter)->id() == sid) { 34081f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org sctp_data_channels_.erase(iter); 34181f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org 3422a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org if (rtc::IsEven(sid) && sid <= last_allocated_sctp_even_sid_) { 34381f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org last_allocated_sctp_even_sid_ = sid - 2; 3442a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org } else if (rtc::IsOdd(sid) && sid <= last_allocated_sctp_odd_sid_) { 34581f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org last_allocated_sctp_odd_sid_ = sid - 2; 34681f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org } 34781f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org return; 34881f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org } 34981f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org } 35081f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org} 35181f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org 3520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool MediaStreamSignaling::AddLocalStream(MediaStreamInterface* local_stream) { 3530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (local_streams_->find(local_stream->label()) != NULL) { 3540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org LOG(LS_WARNING) << "MediaStream with label " << local_stream->label() 3550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org << "already exist."; 3560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 3570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org local_streams_->AddStream(local_stream); 3590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Find tracks that has already been configured in SDP. This can occur if a 3610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // local session description that contains the MSID of these tracks is set 3620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // before AddLocalStream is called. It can also occur if the local session 3630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // description is not changed and RemoveLocalStream 3640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // is called and later AddLocalStream is called again with the same stream. 3650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioTrackVector audio_tracks = local_stream->GetAudioTracks(); 3660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (AudioTrackVector::const_iterator it = audio_tracks.begin(); 3670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org it != audio_tracks.end(); ++it) { 3681b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org const TrackInfo* track_info = FindTrackInfo(local_audio_tracks_, 3691b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org local_stream->label(), 3701b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org (*it)->id()); 3711b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org if (track_info) { 3721b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org OnLocalTrackSeen(track_info->stream_label, track_info->track_id, 3731b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org track_info->ssrc, cricket::MEDIA_TYPE_AUDIO); 3740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoTrackVector video_tracks = local_stream->GetVideoTracks(); 3780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (VideoTrackVector::const_iterator it = video_tracks.begin(); 3790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org it != video_tracks.end(); ++it) { 3801b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org const TrackInfo* track_info = FindTrackInfo(local_video_tracks_, 3811b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org local_stream->label(), 3821b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org (*it)->id()); 3831b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org if (track_info) { 3841b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org OnLocalTrackSeen(track_info->stream_label, track_info->track_id, 3851b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org track_info->ssrc, cricket::MEDIA_TYPE_VIDEO); 3860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 3890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamSignaling::RemoveLocalStream( 3920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* local_stream) { 393c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org AudioTrackVector audio_tracks = local_stream->GetAudioTracks(); 394c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org for (AudioTrackVector::const_iterator it = audio_tracks.begin(); 395c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org it != audio_tracks.end(); ++it) { 396c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org const TrackInfo* track_info = FindTrackInfo(local_audio_tracks_, 397c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org local_stream->label(), 398c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org (*it)->id()); 399c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org if (track_info) { 400c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org stream_observer_->OnRemoveLocalAudioTrack(local_stream, *it, 401c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org track_info->ssrc); 402c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org } 403c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org } 404c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org VideoTrackVector video_tracks = local_stream->GetVideoTracks(); 405c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org for (VideoTrackVector::const_iterator it = video_tracks.begin(); 406c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org it != video_tracks.end(); ++it) { 407c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org const TrackInfo* track_info = FindTrackInfo(local_video_tracks_, 408c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org local_stream->label(), 409c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org (*it)->id()); 410c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org if (track_info) { 411c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org stream_observer_->OnRemoveLocalVideoTrack(local_stream, *it); 412c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org } 413c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org } 4141b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org 415c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org local_streams_->RemoveStream(local_stream); 4160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream_observer_->OnRemoveLocalStream(local_stream); 4170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool MediaStreamSignaling::GetOptionsForOffer( 4204fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org const PeerConnectionInterface::RTCOfferAnswerOptions& rtc_options, 4214fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org cricket::MediaSessionOptions* session_options) { 4224fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org typedef PeerConnectionInterface::RTCOfferAnswerOptions RTCOfferAnswerOptions; 4234fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org if (!IsValidOfferToReceiveMedia(rtc_options.offer_to_receive_audio) || 4244fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org !IsValidOfferToReceiveMedia(rtc_options.offer_to_receive_video)) { 4250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 4260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4274fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 428966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org session_options->has_audio = false; 429966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org session_options->has_video = false; 430966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org SetStreams(session_options, local_streams_, rtp_data_channels_); 4314fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 432966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org // If |offer_to_receive_[audio/video]| is undefined, respect the flags set 433966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org // from SetStreams. Otherwise, overwrite it based on |rtc_options|. 434966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org if (rtc_options.offer_to_receive_audio != RTCOfferAnswerOptions::kUndefined) { 435966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org session_options->has_audio = rtc_options.offer_to_receive_audio > 0; 4364fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org } 437966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org if (rtc_options.offer_to_receive_video != RTCOfferAnswerOptions::kUndefined) { 438966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org session_options->has_video = rtc_options.offer_to_receive_video > 0; 4394fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org } 4404fa2e857bf13d5b55747501e951a98a52330eed2jiayl@webrtc.org 441966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org session_options->vad_enabled = rtc_options.voice_activity_detection; 442966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org session_options->transport_options.ice_restart = rtc_options.ice_restart; 443966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org session_options->bundle_enabled = rtc_options.use_rtp_mux; 444966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org 445966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org session_options->bundle_enabled = EvaluateNeedForBundle(*session_options); 4460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 4470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool MediaStreamSignaling::GetOptionsForAnswer( 4500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const MediaConstraintsInterface* constraints, 4510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaSessionOptions* options) { 452966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org options->has_audio = false; 453966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org options->has_video = false; 454966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org SetStreams(options, local_streams_, rtp_data_channels_); 4550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 456966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org if (!ParseConstraintsForAnswer(constraints, options)) { 4570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 4580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 459966f092669e8dd625584ec4b1f409e7933624d45jiayl@webrtc.org options->bundle_enabled = EvaluateNeedForBundle(*options); 4600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 4610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Updates or creates remote MediaStream objects given a 4640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// remote SessionDesription. 4650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// If the remote SessionDesription contains new remote MediaStreams 4660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// the observer OnAddStream method is called. If a remote MediaStream is missing 4670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// from the remote SessionDescription OnRemoveStream is called. 4680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamSignaling::OnRemoteDescriptionChanged( 4690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const SessionDescriptionInterface* desc) { 4700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::SessionDescription* remote_desc = desc->description(); 4712a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<StreamCollection> new_streams( 4720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StreamCollection::Create()); 4730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Find all audio rtp streams and create corresponding remote AudioTracks 4750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // and MediaStreams. 4760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo* audio_content = GetFirstAudioContent(remote_desc); 4770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (audio_content) { 4780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::AudioContentDescription* desc = 4790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<const cricket::AudioContentDescription*>( 4800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_content->description); 4810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org UpdateRemoteStreamsList(desc->streams(), desc->type(), new_streams); 4820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_info_.default_audio_track_needed = 483bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org MediaContentDirectionHasSend(desc->direction()) && 484bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org desc->streams().empty(); 4850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Find all video rtp streams and create corresponding remote VideoTracks 4880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // and MediaStreams. 4890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo* video_content = GetFirstVideoContent(remote_desc); 4900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (video_content) { 4910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::VideoContentDescription* desc = 4920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<const cricket::VideoContentDescription*>( 4930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_content->description); 4940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org UpdateRemoteStreamsList(desc->streams(), desc->type(), new_streams); 4950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_info_.default_video_track_needed = 496bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org MediaContentDirectionHasSend(desc->direction()) && 497bf21bdd1fb1af8b41d757f84b208f1e1c0b595e7jiayl@webrtc.org desc->streams().empty(); 4980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Update the DataChannels with the information from the remote peer. 5010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo* data_content = GetFirstDataContent(remote_desc); 5020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (data_content) { 5030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::DataContentDescription* data_desc = 5040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<const cricket::DataContentDescription*>( 5050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_content->description); 5062a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org if (rtc::starts_with( 507d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org data_desc->protocol().data(), cricket::kMediaProtocolRtpPrefix)) { 5080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org UpdateRemoteRtpDataChannels(data_desc->streams()); 5090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Iterate new_streams and notify the observer about new MediaStreams. 5130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t i = 0; i < new_streams->count(); ++i) { 5140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* new_stream = new_streams->at(i); 5150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream_observer_->OnAddRemoteStream(new_stream); 5160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Find removed MediaStreams. 5190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (remote_info_.IsDefaultMediaStreamNeeded() && 5200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_streams_->find(kDefaultStreamLabel) != NULL) { 5210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // The default media stream already exists. No need to do anything. 5220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 5230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org UpdateEndedRemoteMediaStreams(); 5240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_info_.msid_supported |= remote_streams_->count() > 0; 5250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MaybeCreateDefaultStream(); 5270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 5280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamSignaling::OnLocalDescriptionChanged( 5300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const SessionDescriptionInterface* desc) { 5310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo* audio_content = 5320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org GetFirstAudioContent(desc->description()); 5330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (audio_content) { 5340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (audio_content->rejected) { 5350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org RejectRemoteTracks(cricket::MEDIA_TYPE_AUDIO); 5360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::AudioContentDescription* audio_desc = 5380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<const cricket::AudioContentDescription*>( 5390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_content->description); 5400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org UpdateLocalTracks(audio_desc->streams(), audio_desc->type()); 5410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo* video_content = 5440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org GetFirstVideoContent(desc->description()); 5450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (video_content) { 5460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (video_content->rejected) { 5470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org RejectRemoteTracks(cricket::MEDIA_TYPE_VIDEO); 5480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::VideoContentDescription* video_desc = 5500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<const cricket::VideoContentDescription*>( 5510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_content->description); 5520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org UpdateLocalTracks(video_desc->streams(), video_desc->type()); 5530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::ContentInfo* data_content = 5560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org GetFirstDataContent(desc->description()); 5570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (data_content) { 5580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::DataContentDescription* data_desc = 5590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static_cast<const cricket::DataContentDescription*>( 5600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_content->description); 5612a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org if (rtc::starts_with( 562d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org data_desc->protocol().data(), cricket::kMediaProtocolRtpPrefix)) { 5630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org UpdateLocalRtpDataChannels(data_desc->streams()); 5640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 5670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamSignaling::OnAudioChannelClose() { 5690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org RejectRemoteTracks(cricket::MEDIA_TYPE_AUDIO); 5700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 5710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamSignaling::OnVideoChannelClose() { 5730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org RejectRemoteTracks(cricket::MEDIA_TYPE_VIDEO); 5740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 5750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamSignaling::OnDataChannelClose() { 57781f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org // Use a temporary copy of the RTP/SCTP DataChannel list because the 57881f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org // DataChannel may callback to us and try to modify the list. 57981f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org RtpDataChannels temp_rtp_dcs; 58081f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org temp_rtp_dcs.swap(rtp_data_channels_); 58181f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org RtpDataChannels::iterator it1 = temp_rtp_dcs.begin(); 58281f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org for (; it1 != temp_rtp_dcs.end(); ++it1) { 58319da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org it1->second->OnDataEngineClose(); 58419da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org } 58581f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org 58681f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org SctpDataChannels temp_sctp_dcs; 58781f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org temp_sctp_dcs.swap(sctp_data_channels_); 58881f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org SctpDataChannels::iterator it2 = temp_sctp_dcs.begin(); 58981f0809717fdef0375a786d36032aafdac67fd33jiayl@webrtc.org for (; it2 != temp_sctp_dcs.end(); ++it2) { 59019da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org (*it2)->OnDataEngineClose(); 5910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 5930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamSignaling::UpdateRemoteStreamsList( 5950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::StreamParamsVec& streams, 5960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaType media_type, 5970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StreamCollection* new_streams) { 5980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TrackInfos* current_tracks = GetRemoteTracks(media_type); 5990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Find removed tracks. Ie tracks where the track id or ssrc don't match the 6010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // new StreamParam. 6020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TrackInfos::iterator track_it = current_tracks->begin(); 6030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org while (track_it != current_tracks->end()) { 6041b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org const TrackInfo& info = *track_it; 6050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::StreamParams params; 6060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!cricket::GetStreamBySsrc(streams, info.ssrc, ¶ms) || 6070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org params.id != info.track_id) { 6080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org OnRemoteTrackRemoved(info.stream_label, info.track_id, media_type); 6091b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org track_it = current_tracks->erase(track_it); 6100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 6110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ++track_it; 6120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 6130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 6140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Find new and active tracks. 6160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (cricket::StreamParamsVec::const_iterator it = streams.begin(); 6170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org it != streams.end(); ++it) { 6180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // The sync_label is the MediaStream label and the |stream.id| is the 6190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // track id. 6200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& stream_label = it->sync_label; 6210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& track_id = it->id; 6220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc = it->first_ssrc(); 6230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6242a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<MediaStreamInterface> stream = 6250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_streams_->find(stream_label); 6260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!stream) { 6270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // This is a new MediaStream. Create a new remote MediaStream. 6280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream = remote_stream_factory_->CreateMediaStream(stream_label); 6290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_streams_->AddStream(stream); 6300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new_streams->AddStream(stream); 6310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 6320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6331b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org const TrackInfo* track_info = FindTrackInfo(*current_tracks, stream_label, 6341b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org track_id); 6351b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org if (!track_info) { 6361b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org current_tracks->push_back(TrackInfo(stream_label, track_id, ssrc)); 6370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org OnRemoteTrackSeen(stream_label, track_id, it->first_ssrc(), media_type); 6380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 6390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 6400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamSignaling::OnRemoteTrackSeen(const std::string& stream_label, 6430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& track_id, 6440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc, 6450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaType media_type) { 6460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* stream = remote_streams_->find(stream_label); 6470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (media_type == cricket::MEDIA_TYPE_AUDIO) { 6490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioTrackInterface* audio_track = 6500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_stream_factory_->AddAudioTrack(stream, track_id); 6510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream_observer_->OnAddRemoteAudioTrack(stream, audio_track, ssrc); 6520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else if (media_type == cricket::MEDIA_TYPE_VIDEO) { 6530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoTrackInterface* video_track = 6540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_stream_factory_->AddVideoTrack(stream, track_id); 6550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream_observer_->OnAddRemoteVideoTrack(stream, video_track, ssrc); 6560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 6570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(false && "Invalid media type"); 6580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 6590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamSignaling::OnRemoteTrackRemoved( 6620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& stream_label, 6630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& track_id, 6640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaType media_type) { 6650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* stream = remote_streams_->find(stream_label); 6660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (media_type == cricket::MEDIA_TYPE_AUDIO) { 6682a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<AudioTrackInterface> audio_track = 6690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream->FindAudioTrack(track_id); 670c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org if (audio_track) { 671c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org audio_track->set_state(webrtc::MediaStreamTrackInterface::kEnded); 672c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org stream->RemoveTrack(audio_track); 673c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org stream_observer_->OnRemoveRemoteAudioTrack(stream, audio_track); 674c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org } 6750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else if (media_type == cricket::MEDIA_TYPE_VIDEO) { 6762a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_refptr<VideoTrackInterface> video_track = 6770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream->FindVideoTrack(track_id); 678c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org if (video_track) { 679c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org video_track->set_state(webrtc::MediaStreamTrackInterface::kEnded); 680c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org stream->RemoveTrack(video_track); 681c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org stream_observer_->OnRemoveRemoteVideoTrack(stream, video_track); 682c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org } 6830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 6840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(false && "Invalid media type"); 6850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 6860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamSignaling::RejectRemoteTracks(cricket::MediaType media_type) { 6890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TrackInfos* current_tracks = GetRemoteTracks(media_type); 6900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (TrackInfos::iterator track_it = current_tracks->begin(); 6910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org track_it != current_tracks->end(); ++track_it) { 6921b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org const TrackInfo& info = *track_it; 6930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* stream = remote_streams_->find(info.stream_label); 6940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (media_type == cricket::MEDIA_TYPE_AUDIO) { 6950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioTrackInterface* track = stream->FindAudioTrack(info.track_id); 696c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org // There's no guarantee the track is still available, e.g. the track may 697c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org // have been removed from the stream by javascript. 698c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org if (track) { 699c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org track->set_state(webrtc::MediaStreamTrackInterface::kEnded); 700c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org } 7010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (media_type == cricket::MEDIA_TYPE_VIDEO) { 7030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoTrackInterface* track = stream->FindVideoTrack(info.track_id); 704c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org // There's no guarantee the track is still available, e.g. the track may 705c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org // have been removed from the stream by javascript. 706c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org if (track) { 707c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org track->set_state(webrtc::MediaStreamTrackInterface::kEnded); 708c2e4f039a61c9447ce9bea6eac341d7d0f802cebhenrike@webrtc.org } 7090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 7120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamSignaling::UpdateEndedRemoteMediaStreams() { 7140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<scoped_refptr<MediaStreamInterface> > streams_to_remove; 7150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (size_t i = 0; i < remote_streams_->count(); ++i) { 7160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface*stream = remote_streams_->at(i); 7170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (stream->GetAudioTracks().empty() && stream->GetVideoTracks().empty()) { 7180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org streams_to_remove.push_back(stream); 7190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<scoped_refptr<MediaStreamInterface> >::const_iterator it; 7230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (it = streams_to_remove.begin(); it != streams_to_remove.end(); ++it) { 7240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_streams_->RemoveStream(*it); 7250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream_observer_->OnRemoveRemoteStream(*it); 7260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 7280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamSignaling::MaybeCreateDefaultStream() { 7300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!remote_info_.IsDefaultMediaStreamNeeded()) 7310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 7320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool default_created = false; 7340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<MediaStreamInterface> default_remote_stream = 7360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_streams_->find(kDefaultStreamLabel); 7370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (default_remote_stream == NULL) { 7380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org default_created = true; 7390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org default_remote_stream = 7400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_stream_factory_->CreateMediaStream(kDefaultStreamLabel); 7410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_streams_->AddStream(default_remote_stream); 7420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (remote_info_.default_audio_track_needed && 7440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org default_remote_stream->GetAudioTracks().size() == 0) { 7451b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org remote_audio_tracks_.push_back(TrackInfo(kDefaultStreamLabel, 7461b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org kDefaultAudioTrackLabel, 0)); 7471b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org 7480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org OnRemoteTrackSeen(kDefaultStreamLabel, kDefaultAudioTrackLabel, 0, 7490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MEDIA_TYPE_AUDIO); 7500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (remote_info_.default_video_track_needed && 7520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org default_remote_stream->GetVideoTracks().size() == 0) { 7531b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org remote_video_tracks_.push_back(TrackInfo(kDefaultStreamLabel, 7541b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org kDefaultVideoTrackLabel, 0)); 7550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org OnRemoteTrackSeen(kDefaultStreamLabel, kDefaultVideoTrackLabel, 0, 7560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MEDIA_TYPE_VIDEO); 7570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (default_created) { 7590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream_observer_->OnAddRemoteStream(default_remote_stream); 7600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 7620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgMediaStreamSignaling::TrackInfos* MediaStreamSignaling::GetRemoteTracks( 7640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaType type) { 7650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (type == cricket::MEDIA_TYPE_AUDIO) 7660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return &remote_audio_tracks_; 7670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org else if (type == cricket::MEDIA_TYPE_VIDEO) 7680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return &remote_video_tracks_; 7690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(false && "Unknown MediaType"); 7700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return NULL; 7710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 7720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgMediaStreamSignaling::TrackInfos* MediaStreamSignaling::GetLocalTracks( 7740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaType media_type) { 7750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(media_type == cricket::MEDIA_TYPE_AUDIO || 7760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org media_type == cricket::MEDIA_TYPE_VIDEO); 7770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return (media_type == cricket::MEDIA_TYPE_AUDIO) ? 7790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &local_audio_tracks_ : &local_video_tracks_; 7800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 7810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamSignaling::UpdateLocalTracks( 7830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::vector<cricket::StreamParams>& streams, 7840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaType media_type) { 7850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TrackInfos* current_tracks = GetLocalTracks(media_type); 7860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7871b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org // Find removed tracks. Ie tracks where the track id, stream label or ssrc 7881b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org // don't match the new StreamParam. 7890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TrackInfos::iterator track_it = current_tracks->begin(); 7900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org while (track_it != current_tracks->end()) { 7911b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org const TrackInfo& info = *track_it; 7920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::StreamParams params; 7930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!cricket::GetStreamBySsrc(streams, info.ssrc, ¶ms) || 7941b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org params.id != info.track_id || params.sync_label != info.stream_label) { 795c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org OnLocalTrackRemoved(info.stream_label, info.track_id, info.ssrc, 796c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org media_type); 7971b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org track_it = current_tracks->erase(track_it); 7980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 7990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ++track_it; 8000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Find new and active tracks. 8040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (cricket::StreamParamsVec::const_iterator it = streams.begin(); 8050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org it != streams.end(); ++it) { 8060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // The sync_label is the MediaStream label and the |stream.id| is the 8070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // track id. 8080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& stream_label = it->sync_label; 8090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& track_id = it->id; 8100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc = it->first_ssrc(); 8111b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org const TrackInfo* track_info = FindTrackInfo(*current_tracks, 8121b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org stream_label, 8131b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org track_id); 8141b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org if (!track_info) { 8151b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org current_tracks->push_back(TrackInfo(stream_label, track_id, ssrc)); 8160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org OnLocalTrackSeen(stream_label, track_id, it->first_ssrc(), 8170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org media_type); 8180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 8210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamSignaling::OnLocalTrackSeen( 8230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& stream_label, 8240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& track_id, 8250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc, 8260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaType media_type) { 8270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* stream = local_streams_->find(stream_label); 8280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!stream) { 8290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org LOG(LS_WARNING) << "An unknown local MediaStream with label " 8300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org << stream_label << " has been configured."; 8310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 8320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (media_type == cricket::MEDIA_TYPE_AUDIO) { 8350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioTrackInterface* audio_track = stream->FindAudioTrack(track_id); 8360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!audio_track) { 8370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org LOG(LS_WARNING) << "An unknown local AudioTrack with id , " 8380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org << track_id << " has been configured."; 8390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 8400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream_observer_->OnAddLocalAudioTrack(stream, audio_track, ssrc); 8420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else if (media_type == cricket::MEDIA_TYPE_VIDEO) { 8430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoTrackInterface* video_track = stream->FindVideoTrack(track_id); 8440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!video_track) { 8450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org LOG(LS_WARNING) << "An unknown local VideoTrack with id , " 8460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org << track_id << " has been configured."; 8470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 8480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream_observer_->OnAddLocalVideoTrack(stream, video_track, ssrc); 8500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 8510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(false && "Invalid media type"); 8520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 8540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamSignaling::OnLocalTrackRemoved( 8560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& stream_label, 8570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& track_id, 858c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org uint32 ssrc, 8590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::MediaType media_type) { 8600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* stream = local_streams_->find(stream_label); 8610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!stream) { 8620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // This is the normal case. Ie RemoveLocalStream has been called and the 8630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // SessionDescriptions has been renegotiated. 8640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 8650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // A track has been removed from the SessionDescription but the MediaStream 8670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // is still associated with MediaStreamSignaling. This only occurs if the SDP 8680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // doesn't match with the calls to AddLocalStream and RemoveLocalStream. 8690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (media_type == cricket::MEDIA_TYPE_AUDIO) { 8710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioTrackInterface* audio_track = stream->FindAudioTrack(track_id); 8720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!audio_track) { 8730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 8740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 875c583107e6b398a140dc56f9539b0e01b58af8c61henrike@webrtc.org stream_observer_->OnRemoveLocalAudioTrack(stream, audio_track, ssrc); 8760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else if (media_type == cricket::MEDIA_TYPE_VIDEO) { 8770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoTrackInterface* video_track = stream->FindVideoTrack(track_id); 8780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!video_track) { 8790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 8800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream_observer_->OnRemoveLocalVideoTrack(stream, video_track); 8820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 8830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(false && "Invalid media type."); 8840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 8850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 8860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamSignaling::UpdateLocalRtpDataChannels( 8880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::StreamParamsVec& streams) { 8890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<std::string> existing_channels; 8900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Find new and active data channels. 8920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (cricket::StreamParamsVec::const_iterator it =streams.begin(); 8930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org it != streams.end(); ++it) { 8940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // |it->sync_label| is actually the data channel label. The reason is that 8950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // we use the same naming of data channels as we do for 8960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // MediaStreams and Tracks. 8970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // For MediaStreams, the sync_label is the MediaStream label and the 8980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // track label is the same as |streamid|. 8990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& channel_label = it->sync_label; 90019da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org RtpDataChannels::iterator data_channel_it = 90119da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org rtp_data_channels_.find(channel_label); 90219da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org if (!VERIFY(data_channel_it != rtp_data_channels_.end())) { 9030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org continue; 9040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Set the SSRC the data channel should use for sending. 9060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_channel_it->second->SetSendSsrc(it->first_ssrc()); 9070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org existing_channels.push_back(data_channel_it->first); 9080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org UpdateClosingDataChannels(existing_channels, true); 9110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 9120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamSignaling::UpdateRemoteRtpDataChannels( 9140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::StreamParamsVec& streams) { 9150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<std::string> existing_channels; 9160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Find new and active data channels. 9180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (cricket::StreamParamsVec::const_iterator it = streams.begin(); 9190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org it != streams.end(); ++it) { 9200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // The data channel label is either the mslabel or the SSRC if the mslabel 9210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // does not exist. Ex a=ssrc:444330170 mslabel:test1. 9220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string label = it->sync_label.empty() ? 9232a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::ToString(it->first_ssrc()) : it->sync_label; 92419da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org RtpDataChannels::iterator data_channel_it = 92519da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org rtp_data_channels_.find(label); 92619da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org if (data_channel_it == rtp_data_channels_.end()) { 9270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // This is a new data channel. 9280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CreateRemoteDataChannel(label, it->first_ssrc()); 9290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 9300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_channel_it->second->SetReceiveSsrc(it->first_ssrc()); 9310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org existing_channels.push_back(label); 9330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org UpdateClosingDataChannels(existing_channels, false); 9360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 9370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamSignaling::UpdateClosingDataChannels( 9390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::vector<std::string>& active_channels, bool is_local_update) { 94019da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org RtpDataChannels::iterator it = rtp_data_channels_.begin(); 94119da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org while (it != rtp_data_channels_.end()) { 9420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DataChannel* data_channel = it->second; 9430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (std::find(active_channels.begin(), active_channels.end(), 9440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_channel->label()) != active_channels.end()) { 9450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ++it; 9460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org continue; 9470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (is_local_update) 9500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_channel->SetSendSsrc(0); 9510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org else 9520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_channel->RemotePeerRequestClose(); 9530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (data_channel->state() == DataChannel::kClosed) { 95519da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org rtp_data_channels_.erase(it); 95619da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org it = rtp_data_channels_.begin(); 9570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 9580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ++it; 9590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 9620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamSignaling::CreateRemoteDataChannel(const std::string& label, 9640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 remote_ssrc) { 9650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!data_channel_factory_) { 9660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org LOG(LS_WARNING) << "Remote peer requested a DataChannel but DataChannels " 9670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org << "are not supported."; 9680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 9690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<DataChannel> channel( 9710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org data_channel_factory_->CreateDataChannel(label, NULL)); 97219da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org if (!channel.get()) { 97319da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org LOG(LS_WARNING) << "Remote peer requested a DataChannel but" 97419da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org << "CreateDataChannel failed."; 97519da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org return; 97619da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org } 9770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org channel->SetReceiveSsrc(remote_ssrc); 9780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream_observer_->OnAddDataChannel(channel); 9790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 9800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 981d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.orgvoid MediaStreamSignaling::OnDataTransportCreatedForSctp() { 98219da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org SctpDataChannels::iterator it = sctp_data_channels_.begin(); 98319da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org for (; it != sctp_data_channels_.end(); ++it) { 98419da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org (*it)->OnTransportChannelCreated(); 9850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 9860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 9870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 9882a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgvoid MediaStreamSignaling::OnDtlsRoleReadyForSctp(rtc::SSLRole role) { 98919da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org SctpDataChannels::iterator it = sctp_data_channels_.begin(); 99019da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org for (; it != sctp_data_channels_.end(); ++it) { 99119da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org if ((*it)->id() < 0) { 992d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org int sid; 993d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org if (!AllocateSctpSid(role, &sid)) { 994d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org LOG(LS_ERROR) << "Failed to allocate SCTP sid."; 995d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org continue; 996d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org } 99719da4659bfe1cd99b6b1476cae9bc74e99e0b09dsergeyu@chromium.org (*it)->SetSctpSid(sid); 998d1f631d5ec5c25dd0a63ed70d0ffa66037d8aa6awu@webrtc.org } 9990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 10000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 10010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1002f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org 1003f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.orgvoid MediaStreamSignaling::OnRemoteSctpDataChannelClosed(uint32 sid) { 1004f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org int index = FindDataChannelBySid(sid); 1005f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org if (index < 0) { 1006f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org LOG(LS_WARNING) << "Unexpected sid " << sid 1007f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org << " of the remotely closed DataChannel."; 1008f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org return; 1009f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org } 1010f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org sctp_data_channels_[index]->Close(); 1011f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org} 1012f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org 10131b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.orgconst MediaStreamSignaling::TrackInfo* 10141b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.orgMediaStreamSignaling::FindTrackInfo( 10151b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org const MediaStreamSignaling::TrackInfos& infos, 10161b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org const std::string& stream_label, 10171b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org const std::string track_id) const { 10181b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org 10191b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org for (TrackInfos::const_iterator it = infos.begin(); 10201b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org it != infos.end(); ++it) { 10211b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org if (it->stream_label == stream_label && it->track_id == track_id) 10221b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org return &*it; 10231b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org } 10241b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org return NULL; 10251b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org} 10261b5713169ff3f21791214c4500e5d775048c3ba9wu@webrtc.org 1027f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.orgint MediaStreamSignaling::FindDataChannelBySid(int sid) const { 1028f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org for (size_t i = 0; i < sctp_data_channels_.size(); ++i) { 1029f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org if (sctp_data_channels_[i]->id() == sid) { 1030f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org return static_cast<int>(i); 1031f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org } 1032f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org } 1033f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org return -1; 1034f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org} 1035f365c83eeda1a21af3740b70798f6ca65c7bc182buildbot@webrtc.org 10360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} // namespace webrtc 1037