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