1 //
2 // libjingle
3 // Copyright 2004 Google Inc.
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are met:
7 //
8 // 1. Redistributions of source code must retain the above copyright notice,
9 // this list of conditions and the following disclaimer.
10 // 2. Redistributions in binary form must reproduce the above copyright notice,
11 // this list of conditions and the following disclaimer in the documentation
12 // and/or other materials provided with the distribution.
13 // 3. The name of the author may not be used to endorse or promote products
14 // derived from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 //
27
28 #include "talk/media/base/mediaengine.h"
29
30 namespace cricket {
31 const int MediaEngineInterface::kDefaultAudioDelayOffset = 0;
32 }
33
34 #if !defined(DISABLE_MEDIA_ENGINE_FACTORY)
35
36 #if defined(HAVE_LINPHONE)
37 #include "talk/media/other/linphonemediaengine.h"
38 #endif // HAVE_LINPHONE
39 #if defined(HAVE_WEBRTC_VOICE)
40 #include "talk/media/webrtc/webrtcvoiceengine.h"
41 #endif // HAVE_WEBRTC_VOICE
42 #if defined(HAVE_WEBRTC_VIDEO)
43 #include "talk/media/webrtc/webrtcvideoengine.h"
44 #endif // HAVE_WEBRTC_VIDEO
45 #if defined(HAVE_LMI)
46 #include "talk/media/base/hybridvideoengine.h"
47 #include "talk/media/lmi/lmimediaengine.h"
48 #endif // HAVE_LMI
49 #ifdef HAVE_CONFIG_H
50 #include "config.h"
51 #endif // HAVE_CONFIG
52
53 namespace cricket {
54 #if defined(HAVE_WEBRTC_VOICE)
55 #define AUDIO_ENG_NAME WebRtcVoiceEngine
56 #else
57 #define AUDIO_ENG_NAME NullVoiceEngine
58 #endif
59
60 #if defined(HAVE_WEBRTC_VIDEO)
61 #if !defined(HAVE_LMI)
62 template<>
63 CompositeMediaEngine<WebRtcVoiceEngine, WebRtcVideoEngine>::
CompositeMediaEngine()64 CompositeMediaEngine() {
65 video_.SetVoiceEngine(&voice_);
66 }
67 #define VIDEO_ENG_NAME WebRtcVideoEngine
68 #else
69 // If we have both WebRtcVideoEngine and LmiVideoEngine, enable dual-stack.
70 // This small class here allows us to hook the WebRtcVideoChannel up to
71 // the capturer owned by the LMI engine, without infecting the rest of the
72 // HybridVideoEngine classes with this abstraction violation.
73 class WebRtcLmiHybridVideoEngine
74 : public HybridVideoEngine<WebRtcVideoEngine, LmiVideoEngine> {
75 public:
76 void SetVoiceEngine(WebRtcVoiceEngine* engine) {
77 video1_.SetVoiceEngine(engine);
78 }
79 };
80 template<>
81 CompositeMediaEngine<WebRtcVoiceEngine, WebRtcLmiHybridVideoEngine>::
82 CompositeMediaEngine() {
83 video_.SetVoiceEngine(&voice_);
84 }
85 #define VIDEO_ENG_NAME WebRtcLmiHybridVideoEngine
86 #endif
87 #elif defined(HAVE_LMI)
88 #define VIDEO_ENG_NAME LmiVideoEngine
89 #else
90 #define VIDEO_ENG_NAME NullVideoEngine
91 #endif
92
93 MediaEngineFactory::MediaEngineCreateFunction
94 MediaEngineFactory::create_function_ = NULL;
95 MediaEngineFactory::MediaEngineCreateFunction
SetCreateFunction(MediaEngineCreateFunction function)96 MediaEngineFactory::SetCreateFunction(MediaEngineCreateFunction function) {
97 MediaEngineCreateFunction old_function = create_function_;
98 create_function_ = function;
99 return old_function;
100 };
101
Create()102 MediaEngineInterface* MediaEngineFactory::Create() {
103 if (create_function_) {
104 return create_function_();
105 } else {
106 #if defined(HAVE_LINPHONE)
107 return new LinphoneMediaEngine("", "");
108 #elif defined(AUDIO_ENG_NAME) && defined(VIDEO_ENG_NAME)
109 return new CompositeMediaEngine<AUDIO_ENG_NAME, VIDEO_ENG_NAME>();
110 #else
111 return new NullMediaEngine();
112 #endif
113 }
114 }
115
116 }; // namespace cricket
117
118 #endif // DISABLE_MEDIA_ENGINE_FACTORY
119