1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "allocator_shim/allocator_stub.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/command_line.h"
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/file_path.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h"
9b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "init_webrtc.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "talk/media/webrtc/webrtcmediaengine.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "webrtc/base/basictypes.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "webrtc/base/logging.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(LIBPEERCONNECTION_IMPLEMENTATION) || defined(LIBPEERCONNECTION_LIB)
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#error "Only compile the allocator proxy with the shared_library implementation"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_WIN)
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define ALLOC_EXPORT __declspec(dllexport)
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define ALLOC_EXPORT __attribute__((visibility("default")))
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if !defined(OS_MACOSX) && !defined(OS_ANDROID)
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// These are used by our new/delete overrides in
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// allocator_shim/allocator_proxy.cc
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)AllocateFunction g_alloc = NULL;
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DellocateFunction g_dealloc = NULL;
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Forward declare of the libjingle internal factory and destroy methods for the
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// WebRTC media engine.
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)cricket::MediaEngineInterface* CreateWebRtcMediaEngine(
34b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    webrtc::AudioDeviceModule* adm,
35b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    webrtc::AudioDeviceModule* adm_sc,
36b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    cricket::WebRtcVideoEncoderFactory* encoder_factory,
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cricket::WebRtcVideoDecoderFactory* decoder_factory);
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DestroyWebRtcMediaEngine(cricket::MediaEngineInterface* media_engine);
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Define webrtc:field_trial::FindFullName to provide webrtc with a field trial
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// implementation. The implementation is provided by the loader via the
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// InitializeModule.
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)FieldTrialFindFullName g_field_trial_find_ = NULL;
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace webrtc {
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace field_trial {
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string FindFullName(const std::string& trial_name) {
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return g_field_trial_find_(trial_name);
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace field_trial
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace webrtc
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)extern "C" {
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Initialize logging, set the forward allocator functions (not on mac), and
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// return pointers to libjingle's WebRTC factory methods.
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Called from init_webrtc.cc.
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ALLOC_EXPORT
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool InitializeModule(const CommandLine& command_line,
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if !defined(OS_MACOSX) && !defined(OS_ANDROID)
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      AllocateFunction alloc,
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      DellocateFunction dealloc,
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      FieldTrialFindFullName field_trial_find,
68a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                      logging::LogMessageHandlerFunction log_handler,
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                      webrtc::GetCategoryEnabledPtr trace_get_category_enabled,
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                      webrtc::AddTraceEventPtr trace_add_trace_event,
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      CreateWebRtcMediaEngineFunction* create_media_engine,
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                      DestroyWebRtcMediaEngineFunction* destroy_media_engine,
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                      InitDiagnosticLoggingDelegateFunctionFunction*
74e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch                          init_diagnostic_logging) {
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if !defined(OS_MACOSX) && !defined(OS_ANDROID)
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  g_alloc = alloc;
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  g_dealloc = dealloc;
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  g_field_trial_find_ = field_trial_find;
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  *create_media_engine = &CreateWebRtcMediaEngine;
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  *destroy_media_engine = &DestroyWebRtcMediaEngine;
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  *init_diagnostic_logging = &rtc::InitDiagnosticLoggingDelegateFunction;
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (CommandLine::Init(0, NULL)) {
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_WIN)
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This is not needed on Windows since CommandLine::Init has already
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // done the equivalent thing via the GetCommandLine() API.
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    CommandLine::ForCurrentProcess()->AppendArguments(command_line, true);
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    logging::LoggingSettings settings;
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    logging::InitLogging(settings);
95a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
96a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    // Override the log message handler to forward logs to chrome's handler.
97a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    logging::SetLogMessageHandler(log_handler);
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    webrtc::SetupEventTracer(trace_get_category_enabled,
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                             trace_add_trace_event);
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // extern "C"
105