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// This file contains classes for listening on changes on MediaStreams and
290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// MediaTracks that are connected to a certain PeerConnection.
300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Example: If a user sets a rendererer on a remote video track the renderer is
310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// connected to the appropriate remote video stream.
320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifndef TALK_APP_WEBRTC_MEDIASTREAMHANDLER_H_
340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define TALK_APP_WEBRTC_MEDIASTREAMHANDLER_H_
350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <list>
370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <vector>
380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/mediastreaminterface.h"
400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/mediastreamprovider.h"
410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/peerconnectioninterface.h"
42b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org#include "talk/media/base/audiorenderer.h"
43cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/thread.h"
440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace webrtc {
460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// TrackHandler listen to events on a MediaStreamTrackInterface that is
480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// connected to a certain PeerConnection.
490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass TrackHandler : public ObserverInterface {
500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  TrackHandler(MediaStreamTrackInterface* track, uint32 ssrc);
520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual ~TrackHandler();
530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void OnChanged();
540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Stop using |track_| on this PeerConnection.
550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void Stop() = 0;
560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  MediaStreamTrackInterface*  track() { return track_; }
580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  uint32 ssrc() const { return ssrc_; }
590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected:
610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void OnStateChanged() = 0;
620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void OnEnabledChanged() = 0;
630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
652a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_refptr<MediaStreamTrackInterface> track_;
660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  uint32 ssrc_;
670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  MediaStreamTrackInterface::TrackState state_;
680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool enabled_;
690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
71b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org// LocalAudioSinkAdapter receives data callback as a sink to the local
72b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org// AudioTrack, and passes the data to the sink of AudioRenderer.
73b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.orgclass LocalAudioSinkAdapter : public AudioTrackSinkInterface,
74b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org                              public cricket::AudioRenderer {
75b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org public:
76b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org  LocalAudioSinkAdapter();
77b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org  virtual ~LocalAudioSinkAdapter();
78b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org
79b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org private:
80b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org  // AudioSinkInterface implementation.
81b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org  virtual void OnData(const void* audio_data, int bits_per_sample,
82b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org                      int sample_rate, int number_of_channels,
83b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org                      int number_of_frames) OVERRIDE;
84b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org
85b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org  // cricket::AudioRenderer implementation.
86b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org  virtual void SetSink(cricket::AudioRenderer::Sink* sink) OVERRIDE;
87b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org
88b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org  cricket::AudioRenderer::Sink* sink_;
89b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org  // Critical section protecting |sink_|.
902a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::CriticalSection lock_;
91b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org};
92b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org
930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// LocalAudioTrackHandler listen to events on a local AudioTrack instance
940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// connected to a PeerConnection and orders the |provider| to executes the
950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// requested change.
960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass LocalAudioTrackHandler : public TrackHandler {
970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  LocalAudioTrackHandler(AudioTrackInterface* track,
990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                         uint32 ssrc,
1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                         AudioProviderInterface* provider);
1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual ~LocalAudioTrackHandler();
1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void Stop() OVERRIDE;
1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected:
1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void OnStateChanged() OVERRIDE;
1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void OnEnabledChanged() OVERRIDE;
1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  AudioTrackInterface* audio_track_;
1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  AudioProviderInterface* provider_;
112b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org
113b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org  // Used to pass the data callback from the |audio_track_| to the other
114b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org  // end of cricket::AudioRenderer.
1152a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_ptr<LocalAudioSinkAdapter> sink_adapter_;
1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// RemoteAudioTrackHandler listen to events on a remote AudioTrack instance
1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// connected to a PeerConnection and orders the |provider| to executes the
1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// requested change.
1218a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.orgclass RemoteAudioTrackHandler : public AudioSourceInterface::AudioObserver,
1228a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org                                public TrackHandler {
1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  RemoteAudioTrackHandler(AudioTrackInterface* track,
1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                          uint32 ssrc,
1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                          AudioProviderInterface* provider);
1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual ~RemoteAudioTrackHandler();
1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void Stop() OVERRIDE;
1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected:
1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void OnStateChanged() OVERRIDE;
1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void OnEnabledChanged() OVERRIDE;
1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
1358a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org  // AudioSourceInterface::AudioObserver implementation.
1368a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org  virtual void OnSetVolume(double volume) OVERRIDE;
1378a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org
1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  AudioTrackInterface* audio_track_;
1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  AudioProviderInterface* provider_;
1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// LocalVideoTrackHandler listen to events on a local VideoTrack instance
1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// connected to a PeerConnection and orders the |provider| to executes the
1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// requested change.
1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass LocalVideoTrackHandler : public TrackHandler {
1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  LocalVideoTrackHandler(VideoTrackInterface* track,
1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                         uint32 ssrc,
1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                         VideoProviderInterface* provider);
1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual ~LocalVideoTrackHandler();
1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void Stop() OVERRIDE;
1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected:
1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void OnStateChanged() OVERRIDE;
1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void OnEnabledChanged() OVERRIDE;
1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  VideoTrackInterface* local_video_track_;
1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  VideoProviderInterface* provider_;
1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// RemoteVideoTrackHandler listen to events on a remote VideoTrack instance
1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// connected to a PeerConnection and orders the |provider| to execute
1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// requested changes.
1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass RemoteVideoTrackHandler : public TrackHandler {
1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  RemoteVideoTrackHandler(VideoTrackInterface* track,
1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                          uint32 ssrc,
1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                          VideoProviderInterface* provider);
1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual ~RemoteVideoTrackHandler();
1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void Stop() OVERRIDE;
1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected:
1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void OnStateChanged() OVERRIDE;
1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void OnEnabledChanged() OVERRIDE;
1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  VideoTrackInterface* remote_video_track_;
1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  VideoProviderInterface* provider_;
1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass MediaStreamHandler : public ObserverInterface {
1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  MediaStreamHandler(MediaStreamInterface* stream,
1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     AudioProviderInterface* audio_provider,
1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     VideoProviderInterface* video_provider);
1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ~MediaStreamHandler();
1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  MediaStreamInterface* stream();
1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void Stop();
1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void AddAudioTrack(AudioTrackInterface* audio_track, uint32 ssrc) = 0;
1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void AddVideoTrack(VideoTrackInterface* video_track, uint32 ssrc) = 0;
1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void RemoveTrack(MediaStreamTrackInterface* track);
1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void OnChanged() OVERRIDE;
1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected:
1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  TrackHandler* FindTrackHandler(MediaStreamTrackInterface* track);
1992a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_refptr<MediaStreamInterface> stream_;
2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  AudioProviderInterface* audio_provider_;
2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  VideoProviderInterface* video_provider_;
2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typedef std::vector<TrackHandler*> TrackHandlers;
2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  TrackHandlers track_handlers_;
2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass LocalMediaStreamHandler : public MediaStreamHandler {
2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  LocalMediaStreamHandler(MediaStreamInterface* stream,
2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                          AudioProviderInterface* audio_provider,
2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                          VideoProviderInterface* video_provider);
2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ~LocalMediaStreamHandler();
2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void AddAudioTrack(AudioTrackInterface* audio_track,
2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                             uint32 ssrc) OVERRIDE;
2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void AddVideoTrack(VideoTrackInterface* video_track,
2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                             uint32 ssrc) OVERRIDE;
2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass RemoteMediaStreamHandler : public MediaStreamHandler {
2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  RemoteMediaStreamHandler(MediaStreamInterface* stream,
2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                           AudioProviderInterface* audio_provider,
2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                           VideoProviderInterface* video_provider);
2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ~RemoteMediaStreamHandler();
2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void AddAudioTrack(AudioTrackInterface* audio_track,
2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                             uint32 ssrc) OVERRIDE;
2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void AddVideoTrack(VideoTrackInterface* video_track,
2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                             uint32 ssrc) OVERRIDE;
2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Container for MediaStreamHandlers of currently known local and remote
2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// MediaStreams.
2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass MediaStreamHandlerContainer {
2340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
2350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  MediaStreamHandlerContainer(AudioProviderInterface* audio_provider,
2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                              VideoProviderInterface* video_provider);
2370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ~MediaStreamHandlerContainer();
2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Notify all referenced objects that MediaStreamHandlerContainer will be
2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // destroyed. This method must be called prior to the dtor and prior to the
2410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // |audio_provider| and |video_provider| is destroyed.
2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TearDown();
2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Remove all TrackHandlers for tracks in |stream| and make sure
2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // the audio_provider and video_provider is notified that the tracks has been
2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // removed.
2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void RemoveRemoteStream(MediaStreamInterface* stream);
2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Create a RemoteAudioTrackHandler and associate |audio_track| with |ssrc|.
2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void AddRemoteAudioTrack(MediaStreamInterface* stream,
2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                           AudioTrackInterface* audio_track,
2520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                           uint32 ssrc);
2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Create a RemoteVideoTrackHandler and associate |video_track| with |ssrc|.
2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void AddRemoteVideoTrack(MediaStreamInterface* stream,
2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                           VideoTrackInterface* video_track,
2560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                           uint32 ssrc);
2570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Remove the TrackHandler for |track|.
2580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void RemoveRemoteTrack(MediaStreamInterface* stream,
2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                         MediaStreamTrackInterface* track);
2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Remove all TrackHandlers for tracks in |stream| and make sure
2620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // the audio_provider and video_provider is notified that the tracks has been
2630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // removed.
2640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void RemoveLocalStream(MediaStreamInterface* stream);
2650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Create a LocalAudioTrackHandler and associate |audio_track| with |ssrc|.
2670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void AddLocalAudioTrack(MediaStreamInterface* stream,
2680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                          AudioTrackInterface* audio_track,
2690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                          uint32 ssrc);
2700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Create a LocalVideoTrackHandler and associate |video_track| with |ssrc|.
2710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void AddLocalVideoTrack(MediaStreamInterface* stream,
2720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                          VideoTrackInterface* video_track,
2730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                          uint32 ssrc);
2740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Remove the TrackHandler for |track|.
2750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void RemoveLocalTrack(MediaStreamInterface* stream,
2760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                        MediaStreamTrackInterface* track);
2770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
2790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  typedef std::list<MediaStreamHandler*> StreamHandlerList;
2800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  MediaStreamHandler* FindStreamHandler(const StreamHandlerList& handlers,
2810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                        MediaStreamInterface* stream);
2820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  MediaStreamHandler* CreateRemoteStreamHandler(MediaStreamInterface* stream);
2830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  MediaStreamHandler* CreateLocalStreamHandler(MediaStreamInterface* stream);
2840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void DeleteStreamHandler(StreamHandlerList* streamhandlers,
2850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                           MediaStreamInterface* stream);
2860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  StreamHandlerList local_streams_handlers_;
2880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  StreamHandlerList remote_streams_handlers_;
2890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  AudioProviderInterface* audio_provider_;
2900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  VideoProviderInterface* video_provider_;
2910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
2920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}  // namespace webrtc
2940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif  // TALK_APP_WEBRTC_MEDIASTREAMHANDLER_H_
296