aboutsummaryrefslogtreecommitdiff
path: root/talk/media/base/mediaengine.h
diff options
context:
space:
mode:
Diffstat (limited to 'talk/media/base/mediaengine.h')
-rw-r--r--talk/media/base/mediaengine.h325
1 files changed, 325 insertions, 0 deletions
diff --git a/talk/media/base/mediaengine.h b/talk/media/base/mediaengine.h
new file mode 100644
index 0000000000..1a992d7d4a
--- /dev/null
+++ b/talk/media/base/mediaengine.h
@@ -0,0 +1,325 @@
+/*
+ * libjingle
+ * Copyright 2004 Google Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef TALK_MEDIA_BASE_MEDIAENGINE_H_
+#define TALK_MEDIA_BASE_MEDIAENGINE_H_
+
+#ifdef OSX
+#include <CoreAudio/CoreAudio.h>
+#endif
+
+#include <string>
+#include <vector>
+
+#include "talk/media/base/codec.h"
+#include "talk/media/base/mediachannel.h"
+#include "talk/media/base/mediacommon.h"
+#include "talk/media/base/videocapturer.h"
+#include "talk/media/base/videocommon.h"
+#include "talk/media/base/voiceprocessor.h"
+#include "talk/media/devices/devicemanager.h"
+#include "webrtc/base/fileutils.h"
+#include "webrtc/base/sigslotrepeater.h"
+
+#if defined(GOOGLE_CHROME_BUILD) || defined(CHROMIUM_BUILD)
+#define DISABLE_MEDIA_ENGINE_FACTORY
+#endif
+
+namespace webrtc {
+class Call;
+class VoiceEngine;
+}
+
+namespace cricket {
+
+class VideoCapturer;
+
+// MediaEngineInterface is an abstraction of a media engine which can be
+// subclassed to support different media componentry backends.
+// It supports voice and video operations in the same class to facilitate
+// proper synchronization between both media types.
+class MediaEngineInterface {
+ public:
+ virtual ~MediaEngineInterface() {}
+
+ // Initialization
+ // Starts the engine.
+ virtual bool Init(rtc::Thread* worker_thread) = 0;
+ // Shuts down the engine.
+ virtual void Terminate() = 0;
+ // TODO(solenberg): Remove once VoE API refactoring is done.
+ virtual webrtc::VoiceEngine* GetVoE() = 0;
+
+ // MediaChannel creation
+ // Creates a voice media channel. Returns NULL on failure.
+ virtual VoiceMediaChannel* CreateChannel(
+ webrtc::Call* call,
+ const AudioOptions& options) = 0;
+ // Creates a video media channel, paired with the specified voice channel.
+ // Returns NULL on failure.
+ virtual VideoMediaChannel* CreateVideoChannel(
+ webrtc::Call* call,
+ const VideoOptions& options) = 0;
+
+ // Configuration
+ // Gets global audio options.
+ virtual AudioOptions GetAudioOptions() const = 0;
+ // Sets global audio options. "options" are from AudioOptions, above.
+ virtual bool SetAudioOptions(const AudioOptions& options) = 0;
+ // Sets the default (maximum) codec/resolution and encoder option to capture
+ // and encode video.
+ virtual bool SetDefaultVideoEncoderConfig(const VideoEncoderConfig& config)
+ = 0;
+
+ // Device selection
+ virtual bool SetSoundDevices(const Device* in_device,
+ const Device* out_device) = 0;
+
+ // Device configuration
+ // Gets the current speaker volume, as a value between 0 and 255.
+ virtual bool GetOutputVolume(int* level) = 0;
+ // Sets the current speaker volume, as a value between 0 and 255.
+ virtual bool SetOutputVolume(int level) = 0;
+
+ // Gets the current microphone level, as a value between 0 and 10.
+ virtual int GetInputLevel() = 0;
+
+ virtual const std::vector<AudioCodec>& audio_codecs() = 0;
+ virtual const std::vector<RtpHeaderExtension>&
+ audio_rtp_header_extensions() = 0;
+ virtual const std::vector<VideoCodec>& video_codecs() = 0;
+ virtual const std::vector<RtpHeaderExtension>&
+ video_rtp_header_extensions() = 0;
+
+ // Logging control
+ virtual void SetVoiceLogging(int min_sev, const char* filter) = 0;
+ virtual void SetVideoLogging(int min_sev, const char* filter) = 0;
+
+ // Starts AEC dump using existing file.
+ virtual bool StartAecDump(rtc::PlatformFile file) = 0;
+
+ // Stops recording AEC dump.
+ virtual void StopAecDump() = 0;
+
+ // Starts RtcEventLog using existing file.
+ virtual bool StartRtcEventLog(rtc::PlatformFile file) = 0;
+
+ // Stops recording an RtcEventLog.
+ virtual void StopRtcEventLog() = 0;
+};
+
+
+#if !defined(DISABLE_MEDIA_ENGINE_FACTORY)
+class MediaEngineFactory {
+ public:
+ typedef cricket::MediaEngineInterface* (*MediaEngineCreateFunction)();
+ // Creates a media engine, using either the compiled system default or the
+ // creation function specified in SetCreateFunction, if specified.
+ static MediaEngineInterface* Create();
+ // Sets the function used when calling Create. If unset, the compiled system
+ // default will be used. Returns the old create function, or NULL if one
+ // wasn't set. Likewise, NULL can be used as the |function| parameter to
+ // reset to the default behavior.
+ static MediaEngineCreateFunction SetCreateFunction(
+ MediaEngineCreateFunction function);
+ private:
+ static MediaEngineCreateFunction create_function_;
+};
+#endif
+
+// CompositeMediaEngine constructs a MediaEngine from separate
+// voice and video engine classes.
+template<class VOICE, class VIDEO>
+class CompositeMediaEngine : public MediaEngineInterface {
+ public:
+ virtual ~CompositeMediaEngine() {}
+ virtual bool Init(rtc::Thread* worker_thread) {
+ if (!voice_.Init(worker_thread))
+ return false;
+ video_.Init();
+ return true;
+ }
+ virtual void Terminate() {
+ voice_.Terminate();
+ }
+
+ virtual webrtc::VoiceEngine* GetVoE() {
+ return voice_.GetVoE();
+ }
+ virtual VoiceMediaChannel* CreateChannel(webrtc::Call* call,
+ const AudioOptions& options) {
+ return voice_.CreateChannel(call, options);
+ }
+ virtual VideoMediaChannel* CreateVideoChannel(webrtc::Call* call,
+ const VideoOptions& options) {
+ return video_.CreateChannel(call, options);
+ }
+
+ virtual AudioOptions GetAudioOptions() const {
+ return voice_.GetOptions();
+ }
+ virtual bool SetAudioOptions(const AudioOptions& options) {
+ return voice_.SetOptions(options);
+ }
+ virtual bool SetDefaultVideoEncoderConfig(const VideoEncoderConfig& config) {
+ return video_.SetDefaultEncoderConfig(config);
+ }
+
+ virtual bool SetSoundDevices(const Device* in_device,
+ const Device* out_device) {
+ return voice_.SetDevices(in_device, out_device);
+ }
+
+ virtual bool GetOutputVolume(int* level) {
+ return voice_.GetOutputVolume(level);
+ }
+ virtual bool SetOutputVolume(int level) {
+ return voice_.SetOutputVolume(level);
+ }
+
+ virtual int GetInputLevel() {
+ return voice_.GetInputLevel();
+ }
+ virtual const std::vector<AudioCodec>& audio_codecs() {
+ return voice_.codecs();
+ }
+ virtual const std::vector<RtpHeaderExtension>& audio_rtp_header_extensions() {
+ return voice_.rtp_header_extensions();
+ }
+ virtual const std::vector<VideoCodec>& video_codecs() {
+ return video_.codecs();
+ }
+ virtual const std::vector<RtpHeaderExtension>& video_rtp_header_extensions() {
+ return video_.rtp_header_extensions();
+ }
+
+ virtual void SetVoiceLogging(int min_sev, const char* filter) {
+ voice_.SetLogging(min_sev, filter);
+ }
+ virtual void SetVideoLogging(int min_sev, const char* filter) {
+ video_.SetLogging(min_sev, filter);
+ }
+
+ virtual bool StartAecDump(rtc::PlatformFile file) {
+ return voice_.StartAecDump(file);
+ }
+
+ virtual void StopAecDump() {
+ voice_.StopAecDump();
+ }
+
+ virtual bool StartRtcEventLog(rtc::PlatformFile file) {
+ return voice_.StartRtcEventLog(file);
+ }
+
+ virtual void StopRtcEventLog() { voice_.StopRtcEventLog(); }
+
+ protected:
+ VOICE voice_;
+ VIDEO video_;
+};
+
+// NullVoiceEngine can be used with CompositeMediaEngine in the case where only
+// a video engine is desired.
+class NullVoiceEngine {
+ public:
+ bool Init(rtc::Thread* worker_thread) { return true; }
+ void Terminate() {}
+ // If you need this to return an actual channel, use FakeMediaEngine instead.
+ VoiceMediaChannel* CreateChannel(const AudioOptions& options) {
+ return nullptr;
+ }
+ AudioOptions GetOptions() const { return AudioOptions(); }
+ bool SetOptions(const AudioOptions& options) { return true; }
+ bool SetDevices(const Device* in_device, const Device* out_device) {
+ return true;
+ }
+ bool GetOutputVolume(int* level) {
+ *level = 0;
+ return true;
+ }
+ bool SetOutputVolume(int level) { return true; }
+ int GetInputLevel() { return 0; }
+ const std::vector<AudioCodec>& codecs() { return codecs_; }
+ const std::vector<RtpHeaderExtension>& rtp_header_extensions() {
+ return rtp_header_extensions_;
+ }
+ void SetLogging(int min_sev, const char* filter) {}
+ bool StartAecDump(rtc::PlatformFile file) { return false; }
+ bool StartRtcEventLog(rtc::PlatformFile file) { return false; }
+ void StopRtcEventLog() {}
+
+ private:
+ std::vector<AudioCodec> codecs_;
+ std::vector<RtpHeaderExtension> rtp_header_extensions_;
+};
+
+// NullVideoEngine can be used with CompositeMediaEngine in the case where only
+// a voice engine is desired.
+class NullVideoEngine {
+ public:
+ bool Init(rtc::Thread* worker_thread) { return true; }
+ void Terminate() {}
+ // If you need this to return an actual channel, use FakeMediaEngine instead.
+ VideoMediaChannel* CreateChannel(
+ const VideoOptions& options,
+ VoiceMediaChannel* voice_media_channel) {
+ return NULL;
+ }
+ bool SetOptions(const VideoOptions& options) { return true; }
+ bool SetDefaultEncoderConfig(const VideoEncoderConfig& config) {
+ return true;
+ }
+ const std::vector<VideoCodec>& codecs() { return codecs_; }
+ const std::vector<RtpHeaderExtension>& rtp_header_extensions() {
+ return rtp_header_extensions_;
+ }
+ void SetLogging(int min_sev, const char* filter) {}
+
+ private:
+ std::vector<VideoCodec> codecs_;
+ std::vector<RtpHeaderExtension> rtp_header_extensions_;
+};
+
+typedef CompositeMediaEngine<NullVoiceEngine, NullVideoEngine> NullMediaEngine;
+
+enum DataChannelType {
+ DCT_NONE = 0,
+ DCT_RTP = 1,
+ DCT_SCTP = 2
+};
+
+class DataEngineInterface {
+ public:
+ virtual ~DataEngineInterface() {}
+ virtual DataMediaChannel* CreateChannel(DataChannelType type) = 0;
+ virtual const std::vector<DataCodec>& data_codecs() = 0;
+};
+
+} // namespace cricket
+
+#endif // TALK_MEDIA_BASE_MEDIAENGINE_H_