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/mediastreamhandler.h" 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/localaudiosource.h" 314ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org#include "talk/app/webrtc/videosource.h" 320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/videosourceinterface.h" 330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace webrtc { 350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTrackHandler::TrackHandler(MediaStreamTrackInterface* track, uint32 ssrc) 370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : track_(track), 380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ssrc_(ssrc), 390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org state_(track->state()), 400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org enabled_(track->enabled()) { 410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org track_->RegisterObserver(this); 420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTrackHandler::~TrackHandler() { 450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org track_->UnregisterObserver(this); 460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid TrackHandler::OnChanged() { 490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (state_ != track_->state()) { 500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org state_ = track_->state(); 510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org OnStateChanged(); 520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (enabled_ != track_->enabled()) { 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org enabled_ = track_->enabled(); 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org OnEnabledChanged(); 560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 59b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.orgLocalAudioSinkAdapter::LocalAudioSinkAdapter() : sink_(NULL) {} 60b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org 61e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.orgLocalAudioSinkAdapter::~LocalAudioSinkAdapter() { 622a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::CritScope lock(&lock_); 63e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org if (sink_) 64e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org sink_->OnClose(); 65e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org} 66b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org 67b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.orgvoid LocalAudioSinkAdapter::OnData(const void* audio_data, 68b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org int bits_per_sample, 69b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org int sample_rate, 70b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org int number_of_channels, 71b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org int number_of_frames) { 722a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::CritScope lock(&lock_); 73b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org if (sink_) { 74b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org sink_->OnData(audio_data, bits_per_sample, sample_rate, 75b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org number_of_channels, number_of_frames); 76b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org } 77b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org} 78b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org 79b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.orgvoid LocalAudioSinkAdapter::SetSink(cricket::AudioRenderer::Sink* sink) { 802a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::CritScope lock(&lock_); 81b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org ASSERT(!sink || !sink_); 82b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org sink_ = sink; 83b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org} 84b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgLocalAudioTrackHandler::LocalAudioTrackHandler( 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioTrackInterface* track, 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc, 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioProviderInterface* provider) 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : TrackHandler(track, ssrc), 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_track_(track), 91b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org provider_(provider), 92b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org sink_adapter_(new LocalAudioSinkAdapter()) { 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org OnEnabledChanged(); 94b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org track->AddSink(sink_adapter_.get()); 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgLocalAudioTrackHandler::~LocalAudioTrackHandler() { 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid LocalAudioTrackHandler::OnStateChanged() { 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TODO(perkj): What should happen when the state change? 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid LocalAudioTrackHandler::Stop() { 105b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org audio_track_->RemoveSink(sink_adapter_.get()); 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioOptions options; 1077162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org provider_->SetAudioSend(ssrc(), false, options, NULL); 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid LocalAudioTrackHandler::OnEnabledChanged() { 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::AudioOptions options; 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (audio_track_->enabled() && audio_track_->GetSource()) { 1138a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org // TODO(xians): Remove this static_cast since we should be able to connect 1148a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org // a remote audio track to peer connection. 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options = static_cast<LocalAudioSource*>( 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_track_->GetSource())->options(); 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 118b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org 119b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org // Use the renderer if the audio track has one, otherwise use the sink 120b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org // adapter owned by this class. 121b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org cricket::AudioRenderer* renderer = audio_track_->GetRenderer() ? 122b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org audio_track_->GetRenderer() : sink_adapter_.get(); 12370022fa5eb218ec690774cc4a74558699a79600asergeyu@chromium.org ASSERT(renderer != NULL); 124b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org provider_->SetAudioSend(ssrc(), audio_track_->enabled(), options, renderer); 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgRemoteAudioTrackHandler::RemoteAudioTrackHandler( 1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioTrackInterface* track, 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc, 1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioProviderInterface* provider) 1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : TrackHandler(track, ssrc), 1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_track_(track), 1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org provider_(provider) { 1348a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org track->GetSource()->RegisterAudioObserver(this); 1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org OnEnabledChanged(); 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgRemoteAudioTrackHandler::~RemoteAudioTrackHandler() { 1398a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org audio_track_->GetSource()->UnregisterAudioObserver(this); 1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid RemoteAudioTrackHandler::Stop() { 1437162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org provider_->SetAudioPlayout(ssrc(), false, NULL); 1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid RemoteAudioTrackHandler::OnStateChanged() { 1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid RemoteAudioTrackHandler::OnEnabledChanged() { 1507162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org provider_->SetAudioPlayout(ssrc(), audio_track_->enabled(), 1517162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org audio_track_->GetRenderer()); 1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1548a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.orgvoid RemoteAudioTrackHandler::OnSetVolume(double volume) { 1558a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org // When the track is disabled, the volume of the source, which is the 1568a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org // corresponding WebRtc Voice Engine channel will be 0. So we do not allow 1578a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org // setting the volume to the source when the track is disabled. 1588a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org if (audio_track_->enabled()) 1598a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org provider_->SetAudioPlayoutVolume(ssrc(), volume); 1608a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org} 1618a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org 1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgLocalVideoTrackHandler::LocalVideoTrackHandler( 1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoTrackInterface* track, 1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc, 1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoProviderInterface* provider) 1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : TrackHandler(track, ssrc), 1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org local_video_track_(track), 1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org provider_(provider) { 1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoSourceInterface* source = local_video_track_->GetSource(); 1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (source) 1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org provider_->SetCaptureDevice(ssrc, source->GetVideoCapturer()); 1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org OnEnabledChanged(); 1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgLocalVideoTrackHandler::~LocalVideoTrackHandler() { 1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid LocalVideoTrackHandler::OnStateChanged() { 1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid LocalVideoTrackHandler::Stop() { 1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org provider_->SetCaptureDevice(ssrc(), NULL); 1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org provider_->SetVideoSend(ssrc(), false, NULL); 1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid LocalVideoTrackHandler::OnEnabledChanged() { 1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const cricket::VideoOptions* options = NULL; 1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoSourceInterface* source = local_video_track_->GetSource(); 1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (local_video_track_->enabled() && source) { 1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org options = source->options(); 1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org provider_->SetVideoSend(ssrc(), local_video_track_->enabled(), options); 1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgRemoteVideoTrackHandler::RemoteVideoTrackHandler( 1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoTrackInterface* track, 1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc, 1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoProviderInterface* provider) 1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : TrackHandler(track, ssrc), 2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_video_track_(track), 2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org provider_(provider) { 2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org OnEnabledChanged(); 2034ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org provider_->SetVideoPlayout(ssrc, true, 2044ba8b9ea10385f43b19d6ed7408f4a09bdc1cbdawu@webrtc.org remote_video_track_->GetSource()->FrameInput()); 2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgRemoteVideoTrackHandler::~RemoteVideoTrackHandler() { 2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid RemoteVideoTrackHandler::Stop() { 2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Since cricket::VideoRenderer is not reference counted 2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // we need to remove the renderer before we are deleted. 2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org provider_->SetVideoPlayout(ssrc(), false, NULL); 2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid RemoteVideoTrackHandler::OnStateChanged() { 2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid RemoteVideoTrackHandler::OnEnabledChanged() { 2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgMediaStreamHandler::MediaStreamHandler(MediaStreamInterface* stream, 2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioProviderInterface* audio_provider, 2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoProviderInterface* video_provider) 2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : stream_(stream), 2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_provider_(audio_provider), 2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_provider_(video_provider) { 2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgMediaStreamHandler::~MediaStreamHandler() { 2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (TrackHandlers::iterator it = track_handlers_.begin(); 2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org it != track_handlers_.end(); ++it) { 2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete *it; 2340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamHandler::RemoveTrack(MediaStreamTrackInterface* track) { 2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (TrackHandlers::iterator it = track_handlers_.begin(); 2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org it != track_handlers_.end(); ++it) { 2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if ((*it)->track() == track) { 2410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TrackHandler* track = *it; 2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org track->Stop(); 2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete track; 2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org track_handlers_.erase(it); 2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org break; 2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTrackHandler* MediaStreamHandler::FindTrackHandler( 2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamTrackInterface* track) { 2520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TrackHandlers::iterator it = track_handlers_.begin(); 2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (; it != track_handlers_.end(); ++it) { 2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if ((*it)->track() == track) { 2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return *it; 2560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org break; 2570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return NULL; 2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgMediaStreamInterface* MediaStreamHandler::stream() { 2630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return stream_.get(); 2640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamHandler::OnChanged() { 2670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamHandler::Stop() { 2700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (TrackHandlers::const_iterator it = track_handlers_.begin(); 2710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org it != track_handlers_.end(); ++it) { 2720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org (*it)->Stop(); 2730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgLocalMediaStreamHandler::LocalMediaStreamHandler( 2770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* stream, 2780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioProviderInterface* audio_provider, 2790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoProviderInterface* video_provider) 2800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : MediaStreamHandler(stream, audio_provider, video_provider) { 2810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgLocalMediaStreamHandler::~LocalMediaStreamHandler() { 2840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid LocalMediaStreamHandler::AddAudioTrack(AudioTrackInterface* audio_track, 2870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc) { 2880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(!FindTrackHandler(audio_track)); 2890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TrackHandler* handler(new LocalAudioTrackHandler(audio_track, ssrc, 2910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_provider_)); 2920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org track_handlers_.push_back(handler); 2930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid LocalMediaStreamHandler::AddVideoTrack(VideoTrackInterface* video_track, 2960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc) { 2970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(!FindTrackHandler(video_track)); 2980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TrackHandler* handler(new LocalVideoTrackHandler(video_track, ssrc, 3000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_provider_)); 3010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org track_handlers_.push_back(handler); 3020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgRemoteMediaStreamHandler::RemoteMediaStreamHandler( 3050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* stream, 3060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioProviderInterface* audio_provider, 3070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoProviderInterface* video_provider) 3080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : MediaStreamHandler(stream, audio_provider, video_provider) { 3090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgRemoteMediaStreamHandler::~RemoteMediaStreamHandler() { 3120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid RemoteMediaStreamHandler::AddAudioTrack(AudioTrackInterface* audio_track, 3150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc) { 3160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(!FindTrackHandler(audio_track)); 3170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TrackHandler* handler( 3180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new RemoteAudioTrackHandler(audio_track, ssrc, audio_provider_)); 3190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org track_handlers_.push_back(handler); 3200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid RemoteMediaStreamHandler::AddVideoTrack(VideoTrackInterface* video_track, 3230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc) { 3240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(!FindTrackHandler(video_track)); 3250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TrackHandler* handler( 3260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new RemoteVideoTrackHandler(video_track, ssrc, video_provider_)); 3270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org track_handlers_.push_back(handler); 3280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgMediaStreamHandlerContainer::MediaStreamHandlerContainer( 3310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioProviderInterface* audio_provider, 3320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoProviderInterface* video_provider) 3330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : audio_provider_(audio_provider), 3340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_provider_(video_provider) { 3350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgMediaStreamHandlerContainer::~MediaStreamHandlerContainer() { 3380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(remote_streams_handlers_.empty()); 3390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(local_streams_handlers_.empty()); 3400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamHandlerContainer::TearDown() { 3430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (StreamHandlerList::iterator it = remote_streams_handlers_.begin(); 3440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org it != remote_streams_handlers_.end(); ++it) { 3450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org (*it)->Stop(); 3460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete *it; 3470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_streams_handlers_.clear(); 3490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (StreamHandlerList::iterator it = local_streams_handlers_.begin(); 3500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org it != local_streams_handlers_.end(); ++it) { 3510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org (*it)->Stop(); 3520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete *it; 3530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org local_streams_handlers_.clear(); 3550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamHandlerContainer::RemoveRemoteStream( 3580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* stream) { 3590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DeleteStreamHandler(&remote_streams_handlers_, stream); 3600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamHandlerContainer::AddRemoteAudioTrack( 3630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* stream, 3640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioTrackInterface* audio_track, 3650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc) { 3660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamHandler* handler = FindStreamHandler(remote_streams_handlers_, 3670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream); 3680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (handler == NULL) { 3690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org handler = CreateRemoteStreamHandler(stream); 3700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org handler->AddAudioTrack(audio_track, ssrc); 3720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamHandlerContainer::AddRemoteVideoTrack( 3750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* stream, 3760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoTrackInterface* video_track, 3770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc) { 3780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamHandler* handler = FindStreamHandler(remote_streams_handlers_, 3790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream); 3800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (handler == NULL) { 3810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org handler = CreateRemoteStreamHandler(stream); 3820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org handler->AddVideoTrack(video_track, ssrc); 3840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamHandlerContainer::RemoveRemoteTrack( 3870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* stream, 3880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamTrackInterface* track) { 3890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamHandler* handler = FindStreamHandler(remote_streams_handlers_, 3900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream); 3910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!VERIFY(handler != NULL)) { 3920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org LOG(LS_WARNING) << "Local MediaStreamHandler for stream with id " 3930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org << stream->label() << "doesnt't exist."; 3940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 3950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org handler->RemoveTrack(track); 3970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamHandlerContainer::RemoveLocalStream( 4000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* stream) { 4010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DeleteStreamHandler(&local_streams_handlers_, stream); 4020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamHandlerContainer::AddLocalAudioTrack( 4050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* stream, 4060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org AudioTrackInterface* audio_track, 4070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc) { 4080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamHandler* handler = FindStreamHandler(local_streams_handlers_, 4090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream); 4100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (handler == NULL) { 4110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org handler = CreateLocalStreamHandler(stream); 4120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org handler->AddAudioTrack(audio_track, ssrc); 4140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamHandlerContainer::AddLocalVideoTrack( 4170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* stream, 4180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VideoTrackInterface* video_track, 4190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc) { 4200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamHandler* handler = FindStreamHandler(local_streams_handlers_, 4210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream); 4220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (handler == NULL) { 4230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org handler = CreateLocalStreamHandler(stream); 4240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org handler->AddVideoTrack(video_track, ssrc); 4260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamHandlerContainer::RemoveLocalTrack( 4290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* stream, 4300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamTrackInterface* track) { 4310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamHandler* handler = FindStreamHandler(local_streams_handlers_, 4320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream); 4330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!VERIFY(handler != NULL)) { 4340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org LOG(LS_WARNING) << "Remote MediaStreamHandler for stream with id " 4350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org << stream->label() << "doesnt't exist."; 4360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return; 4370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org handler->RemoveTrack(track); 4390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgMediaStreamHandler* MediaStreamHandlerContainer::CreateRemoteStreamHandler( 4420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* stream) { 4430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(!FindStreamHandler(remote_streams_handlers_, stream)); 4440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org RemoteMediaStreamHandler* handler = 4460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new RemoteMediaStreamHandler(stream, audio_provider_, video_provider_); 4470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org remote_streams_handlers_.push_back(handler); 4480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return handler; 4490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgMediaStreamHandler* MediaStreamHandlerContainer::CreateLocalStreamHandler( 4520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* stream) { 4530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(!FindStreamHandler(local_streams_handlers_, stream)); 4540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org LocalMediaStreamHandler* handler = 4560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new LocalMediaStreamHandler(stream, audio_provider_, video_provider_); 4570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org local_streams_handlers_.push_back(handler); 4580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return handler; 4590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgMediaStreamHandler* MediaStreamHandlerContainer::FindStreamHandler( 4620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const StreamHandlerList& handlers, 4630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaStreamInterface* stream) { 4640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StreamHandlerList::const_iterator it = handlers.begin(); 4650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (; it != handlers.end(); ++it) { 4660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if ((*it)->stream() == stream) { 4670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return *it; 4680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return NULL; 4710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid MediaStreamHandlerContainer::DeleteStreamHandler( 4740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StreamHandlerList* streamhandlers, MediaStreamInterface* stream) { 4750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StreamHandlerList::iterator it = streamhandlers->begin(); 4760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (; it != streamhandlers->end(); ++it) { 4770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if ((*it)->stream() == stream) { 4780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org (*it)->Stop(); 4790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete *it; 4800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org streamhandlers->erase(it); 4810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org break; 4820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} // namespace webrtc 487