1f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/* 2f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * libjingle 3f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Copyright 2004--2007, Google Inc. 4f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 5f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Redistribution and use in source and binary forms, with or without 6f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * modification, are permitted provided that the following conditions are met: 7f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 8f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 1. Redistributions of source code must retain the above copyright notice, 9f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer. 10f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 2. Redistributions in binary form must reproduce the above copyright notice, 11f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer in the documentation 12f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * and/or other materials provided with the distribution. 13f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 3. The name of the author may not be used to endorse or promote products 14f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * derived from this software without specific prior written permission. 15f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 16f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch */ 27f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 28f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifndef TALK_SESSION_PHONE_MEDIAENGINE_H_ 29f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define TALK_SESSION_PHONE_MEDIAENGINE_H_ 30f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 31f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifdef OSX 32f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <CoreAudio/CoreAudio.h> 33f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif 34f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 35f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <string> 36f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <vector> 37f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 38f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/sigslotrepeater.h" 39f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/session/phone/codec.h" 40f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/session/phone/devicemanager.h" 41f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/session/phone/mediachannel.h" 423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "talk/session/phone/videocommon.h" 43f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 44f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochnamespace cricket { 45f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 46f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// A class for playing out soundclips. 47f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass SoundclipMedia { 48f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 49f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch enum SoundclipFlags { 50f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SF_LOOP = 1, 51f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch }; 52f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 53f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual ~SoundclipMedia() {} 54f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 55f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Plays a sound out to the speakers with the given audio stream. The stream 56f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // must be 16-bit little-endian 16 kHz PCM. If a stream is already playing 57f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // on this SoundclipMedia, it is stopped. If clip is NULL, nothing is played. 58f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Returns whether it was successful. 59f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool PlaySound(const char *clip, int len, int flags) = 0; 60f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 61f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 62f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// MediaEngine is an abstraction of a media engine which can be subclassed 63f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// to support different media componentry backends. It supports voice and 64f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// video operations in the same class to facilitate proper synchronization 65f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// between both media types. 66f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass MediaEngine { 67f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO: Move this to a global location (also used in DeviceManager) 69f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Capabilities of the media engine. 70f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch enum Capabilities { 71f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch AUDIO_RECV = 1 << 0, 72f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch AUDIO_SEND = 1 << 1, 73f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch VIDEO_RECV = 1 << 2, 74f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch VIDEO_SEND = 1 << 3, 75f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch }; 76f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 77f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Bitmask flags for options that may be supported by the media engine 78f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // implementation 79f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch enum AudioOptions { 80f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ECHO_CANCELLATION = 1 << 0, 81f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch AUTO_GAIN_CONTROL = 1 << 1, 82f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch DEFAULT_AUDIO_OPTIONS = ECHO_CANCELLATION | AUTO_GAIN_CONTROL 83f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch }; 84f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch enum VideoOptions { 85f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch }; 86f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 87f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual ~MediaEngine() {} 88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen static MediaEngine* Create(); 89f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 90f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Initialization 91f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Starts the engine. 92f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool Init() = 0; 93f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Shuts down the engine. 94f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual void Terminate() = 0; 95f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Returns what the engine is capable of, as a set of Capabilities, above. 96f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual int GetCapabilities() = 0; 97f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 98f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // MediaChannel creation 99f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Creates a voice media channel. Returns NULL on failure. 100f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual VoiceMediaChannel *CreateChannel() = 0; 101f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Creates a video media channel, paired with the specified voice channel. 102f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Returns NULL on failure. 103f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual VideoMediaChannel *CreateVideoChannel( 104f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch VoiceMediaChannel* voice_media_channel) = 0; 105f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 106f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Creates a soundclip object for playing sounds on. Returns NULL on failure. 107f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual SoundclipMedia *CreateSoundclip() = 0; 108f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 109f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Configuration 110f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Sets global audio options. "options" are from AudioOptions, above. 111f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool SetAudioOptions(int options) = 0; 112f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Sets global video options. "options" are from VideoOptions, above. 113f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool SetVideoOptions(int options) = 0; 1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Sets the default (maximum) codec/resolution and encoder option to capture 1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // and encode video. 1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual bool SetDefaultVideoEncoderConfig(const VideoEncoderConfig& config) 1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick = 0; 118f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 119f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Device selection 120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO: Add method for selecting the soundclip device. 121f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool SetSoundDevices(const Device* in_device, 122f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const Device* out_device) = 0; 123f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool SetVideoCaptureDevice(const Device* cam_device) = 0; 124f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 125f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Device configuration 126f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Sets the current speaker volume, as a value between 0 and 255. 127f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool SetOutputVolume(int level) = 0; 128f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 129f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Local monitoring 130f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Gets the current microphone level, as a value between 0 and 10. 131f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual int GetInputLevel() = 0; 132f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Starts or stops the local microphone. Useful if local mic info is needed 133f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // prior to a call being connected; the mic will be started automatically 134f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // when a VoiceMediaChannel starts sending. 135f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool SetLocalMonitor(bool enable) = 0; 136f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Installs a callback for raw frames from the local camera. 137f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool SetLocalRenderer(VideoRenderer* renderer) = 0; 138f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Starts/stops local camera. 139f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual CaptureResult SetVideoCapture(bool capture) = 0; 140f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual const std::vector<AudioCodec>& audio_codecs() = 0; 142f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual const std::vector<VideoCodec>& video_codecs() = 0; 1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual bool FindAudioCodec(const AudioCodec &codec) = 0; 144f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool FindVideoCodec(const VideoCodec &codec) = 0; 145f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 146f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Logging control 147f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual void SetVoiceLogging(int min_sev, const char* filter) = 0; 148f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual void SetVideoLogging(int min_sev, const char* filter) = 0; 149f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen sigslot::repeater1<CaptureResult> SignalVideoCaptureResult; 151f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 152f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 153f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// CompositeMediaEngine constructs a MediaEngine from separate 154f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// voice and video engine classes. 155f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochtemplate<class VOICE, class VIDEO> 156f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass CompositeMediaEngine : public MediaEngine { 157f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 158f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch CompositeMediaEngine() {} 159f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool Init() { 160f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (!voice_.Init()) 161f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return false; 162f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (!video_.Init()) { 163f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch voice_.Terminate(); 164f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return false; 165f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 166f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SignalVideoCaptureResult.repeat(video_.SignalCaptureResult); 167f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return true; 168f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 169f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual void Terminate() { 170f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch video_.Terminate(); 171f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch voice_.Terminate(); 172f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 173f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 174f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual int GetCapabilities() { 175f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return (voice_.GetCapabilities() | video_.GetCapabilities()); 176f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 177f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual VoiceMediaChannel *CreateChannel() { 178f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return voice_.CreateChannel(); 179f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 180f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual VideoMediaChannel *CreateVideoChannel(VoiceMediaChannel* channel) { 181f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return video_.CreateChannel(channel); 182f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 183f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual SoundclipMedia *CreateSoundclip() { 184f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return voice_.CreateSoundclip(); 185f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 186f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 187f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool SetAudioOptions(int o) { 188f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return voice_.SetOptions(o); 189f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 190f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool SetVideoOptions(int o) { 191f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return video_.SetOptions(o); 192f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual bool SetDefaultVideoEncoderConfig(const VideoEncoderConfig& config) { 1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return video_.SetDefaultEncoderConfig(config); 195f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 196f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 197f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool SetSoundDevices(const Device* in_device, 198f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const Device* out_device) { 199f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return voice_.SetDevices(in_device, out_device); 200f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 201f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool SetVideoCaptureDevice(const Device* cam_device) { 202f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return video_.SetCaptureDevice(cam_device); 203f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 204f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 205f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool SetOutputVolume(int level) { 206f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return voice_.SetOutputVolume(level); 207f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 208f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 209f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual int GetInputLevel() { 210f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return voice_.GetInputLevel(); 211f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 212f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool SetLocalMonitor(bool enable) { 213f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return voice_.SetLocalMonitor(enable); 214f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 215f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool SetLocalRenderer(VideoRenderer* renderer) { 216f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return video_.SetLocalRenderer(renderer); 217f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 2183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual CaptureResult SetVideoCapture(bool capture) { 219f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return video_.SetCapture(capture); 220f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 221f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 2223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual const std::vector<AudioCodec>& audio_codecs() { 223f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return voice_.codecs(); 224f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 225f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual const std::vector<VideoCodec>& video_codecs() { 226f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return video_.codecs(); 227f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 228f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 2293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual bool FindAudioCodec(const AudioCodec &codec) { 230f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return voice_.FindCodec(codec); 231f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 232f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool FindVideoCodec(const VideoCodec &codec) { 233f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return video_.FindCodec(codec); 234f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 235f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 236f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual void SetVoiceLogging(int min_sev, const char* filter) { 237f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return voice_.SetLogging(min_sev, filter); 238f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 239f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual void SetVideoLogging(int min_sev, const char* filter) { 240f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return video_.SetLogging(min_sev, filter); 241f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 242f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 243f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch private: 244f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch VOICE voice_; 245f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch VIDEO video_; 246f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 247f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 248dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass NullVoiceMediaChannel : public VoiceMediaChannel { 249dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public: 250dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen explicit NullVoiceMediaChannel() {} 251dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ~NullVoiceMediaChannel() {} 252dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // MediaChannel implementations 253dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void OnPacketReceived(talk_base::Buffer* packet) {} 254dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void OnRtcpReceived(talk_base::Buffer* packet) {} 255dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void SetSendSsrc(uint32 id) {} 256dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual bool SetRtcpCName(const std::string& cname) { return true; } 257dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual bool Mute(bool on) { return true; } 258dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual bool SetSendBandwidth(bool autobw, int bps) { return true; } 259dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual bool SetOptions(int options) { return true; } 260dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // VoiceMediaChannel implementations 261dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual bool SetRecvCodecs(const std::vector<AudioCodec> &codecs) { 262dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return true; 263dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 264dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual bool SetSendCodecs(const std::vector<AudioCodec> &codecs) { 265dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return true; 266dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 267dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual bool SetPlayout(bool playout) { return true; } 268dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual bool SetSend(SendFlags flag) { return true; } 269dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual bool AddStream(uint32 ssrc) { return true; } 270dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual bool RemoveStream(uint32 ssrc) { return true; } 271dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual bool GetActiveStreams(AudioInfo::StreamList* streams) { return true; } 272dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual int GetOutputLevel() { return 0; } 273dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void SetRingbackTone(const char *buf, int len) {} 274dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual bool PlayRingbackTone(bool play, bool loop) { return true; } 275dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual bool PressDTMF(int event, bool playout) { return true; } 276dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual bool GetStats(VoiceMediaInfo* info) { return false; } 277dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}; 278dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 279f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// NullVoiceEngine can be used with CompositeMediaEngine in the case where only 280f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// a video engine is desired. 281f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass NullVoiceEngine { 282f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 283f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool Init() { return true; } 284f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void Terminate() {} 285f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch int GetCapabilities() { return 0; } 286f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch VoiceMediaChannel* CreateChannel() { 287dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // TODO: See if we can make things work without requiring 288dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // allocation of a channel. 289dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return new NullVoiceMediaChannel(); 290f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 291f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SoundclipMedia* CreateSoundclip() { 292f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return NULL; 293f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 294f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool SetOptions(int opts) { return true; } 295f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool SetDevices(const Device* in_device, const Device* out_device) { 296f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return true; 297f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 298f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool SetOutputVolume(int level) { return true; } 299f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch int GetInputLevel() { return 0; } 300f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool SetLocalMonitor(bool enable) { return true; } 3013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::vector<AudioCodec>& codecs() { return codecs_; } 3023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool FindCodec(const AudioCodec&) { return false; } 303f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void SetLogging(int min_sev, const char* filter) {} 304f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch private: 3053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<AudioCodec> codecs_; 306f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 307f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 308f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// NullVideoEngine can be used with CompositeMediaEngine in the case where only 309f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// a voice engine is desired. 310f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass NullVideoEngine { 311f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 312f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool Init() { return true; } 313f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void Terminate() {} 314f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch int GetCapabilities() { return 0; } 315f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch VideoMediaChannel* CreateChannel(VoiceMediaChannel* voice_media_channel) { 316f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return NULL; 317f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 318f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool SetOptions(int opts) { return true; } 3193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool SetDefaultEncoderConfig(const VideoEncoderConfig& config) { 3203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return true; 3213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 322f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool SetCaptureDevice(const Device* cam_device) { return true; } 323f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool SetLocalRenderer(VideoRenderer* renderer) { return true; } 3243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CaptureResult SetCapture(bool capture) { return CR_SUCCESS; } 325f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::vector<VideoCodec>& codecs() { return codecs_; } 326f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool FindCodec(const VideoCodec&) { return false; } 327f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void SetLogging(int min_sev, const char* filter) {} 328dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen sigslot::signal1<CaptureResult> SignalCaptureResult; 329f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch private: 330f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::vector<VideoCodec> codecs_; 331f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 332f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 333f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochtypedef CompositeMediaEngine<NullVoiceEngine, NullVideoEngine> NullMediaEngine; 334f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 335f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} // namespace cricket 336f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 337f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif // TALK_SESSION_PHONE_MEDIAENGINE_H_ 338