15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/*
25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle
35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2004 Google Inc.
45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without
65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met:
75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     this list of conditions and the following disclaimer.
105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     this list of conditions and the following disclaimer in the documentation
125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     and/or other materials provided with the distribution.
135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  3. The name of the author may not be used to endorse or promote products
145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     derived from this software without specific prior written permission.
155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */
275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifndef TALK_SESSION_MEDIA_CALL_H_
295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define TALK_SESSION_MEDIA_CALL_H_
305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <deque>
325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <map>
335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <string>
345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <vector>
355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/messagequeue.h"
375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/media/base/mediachannel.h"
385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/media/base/screencastid.h"
395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/media/base/streamparams.h"
405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/media/base/videocommon.h"
415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/p2p/base/session.h"
425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/p2p/client/socketmonitor.h"
435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/session/media/audiomonitor.h"
445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/session/media/currentspeakermonitor.h"
455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/session/media/mediamessages.h"
465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/session/media/mediasession.h"
475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmpp/jid.h"
485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace cricket {
505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass MediaSessionClient;
525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass BaseChannel;
535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass VoiceChannel;
545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass VideoChannel;
555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass DataChannel;
565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Can't typedef this easily since it's forward declared as struct elsewhere.
585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstruct CallOptions : public MediaSessionOptions {
595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass Call : public talk_base::MessageHandler, public sigslot::has_slots<> {
625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  explicit Call(MediaSessionClient* session_client);
645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ~Call();
655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // |initiator| can be empty.
675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  Session* InitiateSession(const buzz::Jid& to, const buzz::Jid& initiator,
685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                           const CallOptions& options);
69c237f0ad875cde990bf9d89f41424b18809cc345henrike@webrtc.org  Session* InitiateSession(const std::string& id, const buzz::Jid& to,
70c237f0ad875cde990bf9d89f41424b18809cc345henrike@webrtc.org                           const CallOptions& options);
715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void AcceptSession(Session* session, const CallOptions& options);
725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void RejectSession(Session* session);
735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void TerminateSession(Session* session);
745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void Terminate();
755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool SendViewRequest(Session* session,
765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                       const ViewRequest& view_request);
775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void SetLocalRenderer(VideoRenderer* renderer);
785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void SetVideoRenderer(Session* session, uint32 ssrc,
795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                        VideoRenderer* renderer);
805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void StartConnectionMonitor(Session* session, int cms);
815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void StopConnectionMonitor(Session* session);
825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void StartAudioMonitor(Session* session, int cms);
835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void StopAudioMonitor(Session* session);
845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool IsAudioMonitorRunning(Session* session);
855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void StartSpeakerMonitor(Session* session);
865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void StopSpeakerMonitor(Session* session);
875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void Mute(bool mute);
885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void MuteVideo(bool mute);
895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool SendData(Session* session,
905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                const SendDataParams& params,
915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                const talk_base::Buffer& payload,
925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                SendDataResult* result);
935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void PressDTMF(int event);
945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool StartScreencast(Session* session,
955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                       const std::string& stream_name, uint32 ssrc,
965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                       const ScreencastId& screencastid, int fps);
975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool StopScreencast(Session* session,
985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                      const std::string& stream_name, uint32 ssrc);
995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::vector<Session*> sessions();
1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  uint32 id();
1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool has_video() const { return has_video_; }
1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool has_data() const { return has_data_; }
1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool muted() const { return muted_; }
105c237f0ad875cde990bf9d89f41424b18809cc345henrike@webrtc.org  bool video() const { return has_video_; }
106c237f0ad875cde990bf9d89f41424b18809cc345henrike@webrtc.org  bool secure() const;
1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool video_muted() const { return video_muted_; }
1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  const std::vector<StreamParams>* GetDataRecvStreams(Session* session) const {
1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    MediaStreams* recv_streams = GetMediaStreams(session);
1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return recv_streams ? &recv_streams->data() : NULL;
1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  const std::vector<StreamParams>* GetVideoRecvStreams(Session* session) const {
1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    MediaStreams* recv_streams = GetMediaStreams(session);
1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return recv_streams ? &recv_streams->video() : NULL;
1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  const std::vector<StreamParams>* GetAudioRecvStreams(Session* session) const {
1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    MediaStreams* recv_streams = GetMediaStreams(session);
1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return recv_streams ? &recv_streams->audio() : NULL;
1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
120e73fa366a56d0c3c46860c534db19fffe110f167mallinath@webrtc.org  VoiceChannel* GetVoiceChannel(Session* session) const;
121e73fa366a56d0c3c46860c534db19fffe110f167mallinath@webrtc.org  VideoChannel* GetVideoChannel(Session* session) const;
122e73fa366a56d0c3c46860c534db19fffe110f167mallinath@webrtc.org  DataChannel* GetDataChannel(Session* session) const;
1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Public just for unit tests
1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  VideoContentDescription* CreateVideoStreamUpdate(const StreamParams& stream);
1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Takes ownership of video.
1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void SendVideoStreamUpdate(Session* session, VideoContentDescription* video);
1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Setting this to false will cause the call to have a longer timeout and
1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // for the SignalSetupToCallVoicemail to never fire.
1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void set_send_to_voicemail(bool send_to_voicemail) {
1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    send_to_voicemail_ = send_to_voicemail;
1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool send_to_voicemail() { return send_to_voicemail_; }
1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  const VoiceMediaInfo& last_voice_media_info() const {
1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return last_voice_media_info_;
1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Sets a flag on the chatapp that will redirect the call to voicemail once
1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // the call has been terminated
1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  sigslot::signal0<> SignalSetupToCallVoicemail;
1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  sigslot::signal2<Call*, Session*> SignalAddSession;
1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  sigslot::signal2<Call*, Session*> SignalRemoveSession;
1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  sigslot::signal3<Call*, Session*, Session::State>
1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      SignalSessionState;
1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  sigslot::signal3<Call*, Session*, Session::Error>
1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      SignalSessionError;
1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  sigslot::signal3<Call*, Session*, const std::string &>
1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      SignalReceivedTerminateReason;
1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  sigslot::signal2<Call*, const std::vector<ConnectionInfo> &>
1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      SignalConnectionMonitor;
1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  sigslot::signal2<Call*, const VoiceMediaInfo&> SignalMediaMonitor;
1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  sigslot::signal2<Call*, const AudioInfo&> SignalAudioMonitor;
1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Empty nick on StreamParams means "unknown".
1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // No ssrcs in StreamParams means "no current speaker".
1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  sigslot::signal3<Call*,
1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                   Session*,
1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                   const StreamParams&> SignalSpeakerMonitor;
1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  sigslot::signal2<Call*, const std::vector<ConnectionInfo> &>
1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      SignalVideoConnectionMonitor;
1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  sigslot::signal2<Call*, const VideoMediaInfo&> SignalVideoMediaMonitor;
1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Gives added streams and removed streams, in that order.
1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  sigslot::signal4<Call*,
1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                   Session*,
1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                   const MediaStreams&,
1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                   const MediaStreams&> SignalMediaStreamsUpdate;
1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  sigslot::signal3<Call*,
1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                   const ReceiveDataParams&,
1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                   const talk_base::Buffer&> SignalDataReceived;
1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private:
1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnMessage(talk_base::Message* message);
1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnSessionState(BaseSession* base_session, BaseSession::State state);
1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnSessionError(BaseSession* base_session, Session::Error error);
1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnSessionInfoMessage(
1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      Session* session, const buzz::XmlElement* action_elem);
1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnViewRequest(
1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      Session* session, const ViewRequest& view_request);
1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnRemoteDescriptionUpdate(
1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      BaseSession* base_session, const ContentInfos& updated_contents);
1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnReceivedTerminateReason(Session* session, const std::string &reason);
1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void IncomingSession(Session* session, const SessionDescription* offer);
1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Returns true on success.
1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool AddSession(Session* session, const SessionDescription* offer);
1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void RemoveSession(Session* session);
1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void EnableChannels(bool enable);
1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void EnableSessionChannels(Session* session, bool enable);
1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void Join(Call* call, bool enable);
1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnConnectionMonitor(VoiceChannel* channel,
1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                           const std::vector<ConnectionInfo> &infos);
1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnMediaMonitor(VoiceChannel* channel, const VoiceMediaInfo& info);
1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnAudioMonitor(VoiceChannel* channel, const AudioInfo& info);
1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnSpeakerMonitor(CurrentSpeakerMonitor* monitor, uint32 ssrc);
1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnConnectionMonitor(VideoChannel* channel,
1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                           const std::vector<ConnectionInfo> &infos);
1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnMediaMonitor(VideoChannel* channel, const VideoMediaInfo& info);
1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnDataReceived(DataChannel* channel,
1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                      const ReceiveDataParams& params,
1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                      const talk_base::Buffer& payload);
1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  MediaStreams* GetMediaStreams(Session* session) const;
2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void UpdateRemoteMediaStreams(Session* session,
2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                const ContentInfos& updated_contents,
2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                bool update_channels);
2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool UpdateVoiceChannelRemoteContent(Session* session,
2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                       const AudioContentDescription* audio);
2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool UpdateVideoChannelRemoteContent(Session* session,
2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                       const VideoContentDescription* video);
2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool UpdateDataChannelRemoteContent(Session* session,
2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                      const DataContentDescription* data);
2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void UpdateRecvStreams(const std::vector<StreamParams>& update_streams,
2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                         BaseChannel* channel,
2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                         std::vector<StreamParams>* recv_streams,
2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                         std::vector<StreamParams>* added_streams,
2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                         std::vector<StreamParams>* removed_streams);
2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void AddRecvStreams(const std::vector<StreamParams>& added_streams,
2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                      BaseChannel* channel,
2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                      std::vector<StreamParams>* recv_streams);
2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void AddRecvStream(const StreamParams& stream,
2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                     BaseChannel* channel,
2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                     std::vector<StreamParams>* recv_streams);
2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void RemoveRecvStreams(const std::vector<StreamParams>& removed_streams,
2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                         BaseChannel* channel,
2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                         std::vector<StreamParams>* recv_streams);
2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void RemoveRecvStream(const StreamParams& stream,
2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                        BaseChannel* channel,
2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                        std::vector<StreamParams>* recv_streams);
2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void ContinuePlayDTMF();
2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool StopScreencastWithoutSendingUpdate(Session* session, uint32 ssrc);
2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool StopAllScreencastsWithoutSendingUpdate(Session* session);
229c237f0ad875cde990bf9d89f41424b18809cc345henrike@webrtc.org  bool SessionDescriptionContainsCrypto(const SessionDescription* sdesc) const;
230c237f0ad875cde990bf9d89f41424b18809cc345henrike@webrtc.org  Session* InternalInitiateSession(const std::string& id,
231c237f0ad875cde990bf9d89f41424b18809cc345henrike@webrtc.org                                   const buzz::Jid& to,
232c237f0ad875cde990bf9d89f41424b18809cc345henrike@webrtc.org                                   const std::string& initiator_name,
233c237f0ad875cde990bf9d89f41424b18809cc345henrike@webrtc.org                                   const CallOptions& options);
2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  uint32 id_;
2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  MediaSessionClient* session_client_;
2375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  struct StartedCapture {
2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    StartedCapture(cricket::VideoCapturer* capturer,
2405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                   const cricket::VideoFormat& format) :
2415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        capturer(capturer),
2425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        format(format) {
2435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
2445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    cricket::VideoCapturer* capturer;
2455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    cricket::VideoFormat format;
2465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  };
2475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  typedef std::map<uint32, StartedCapture> StartedScreencastMap;
2485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  struct MediaSession {
2505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    Session* session;
2515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    VoiceChannel* voice_channel;
2525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    VideoChannel* video_channel;
2535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    DataChannel* data_channel;
2545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    MediaStreams* recv_streams;
2555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    StartedScreencastMap started_screencasts;
2565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  };
2575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Create a map of media sessions, keyed off session->id().
2595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  typedef std::map<std::string, MediaSession> MediaSessionMap;
2605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  MediaSessionMap media_session_map_;
2615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::map<std::string, CurrentSpeakerMonitor*> speaker_monitor_map_;
2635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  VideoRenderer* local_renderer_;
2645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool has_video_;
2655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool has_data_;
2665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool muted_;
2675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool video_muted_;
2685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool send_to_voicemail_;
2695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // DTMF tones have to be queued up so that we don't flood the call.  We
2715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // keep a deque (doubely ended queue) of them around.  While one is playing we
2725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // set the playing_dtmf_ bit and schedule a message in XX msec to clear that
2735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // bit or start the next tone playing.
2745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::deque<int> queued_dtmf_;
2755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool playing_dtmf_;
2765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  VoiceMediaInfo last_voice_media_info_;
2785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  friend class MediaSessionClient;
2805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
2815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}  // namespace cricket
2835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif  // TALK_SESSION_MEDIA_CALL_H_
285