1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11ac6d919eec548c708588f29923f617a17283c7e2andresp@webrtc.org#include "webrtc/video_engine/vie_impl.h"
12ac6d919eec548c708588f29923f617a17283c7e2andresp@webrtc.org
13ac6d919eec548c708588f29923f617a17283c7e2andresp@webrtc.org#include "webrtc/common.h"
143468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org#include "webrtc/system_wrappers/interface/logging.h"
15ac6d919eec548c708588f29923f617a17283c7e2andresp@webrtc.org#include "webrtc/system_wrappers/interface/trace.h"
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1990f05ed8888e93e3ae5b7d2a2534f77ad8b58aa2andresp@webrtc.orgenum { kModuleId = 0 };
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoEngine* VideoEngine::Create() {
22ac6d919eec548c708588f29923f617a17283c7e2andresp@webrtc.org  return new VideoEngineImpl(new Config(), true /* owns_config */);
23ac6d919eec548c708588f29923f617a17283c7e2andresp@webrtc.org}
24ac6d919eec548c708588f29923f617a17283c7e2andresp@webrtc.org
25ac6d919eec548c708588f29923f617a17283c7e2andresp@webrtc.orgVideoEngine* VideoEngine::Create(const Config& config) {
26ac6d919eec548c708588f29923f617a17283c7e2andresp@webrtc.org  return new VideoEngineImpl(&config, false /* owns_config */);
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool VideoEngine::Delete(VideoEngine*& video_engine) {
303468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org  if (!video_engine)
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return false;
323468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org
333468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org  LOG_F(LS_INFO);
347ab726855f2ceb9ff6365e3240668d58f45e6761andrew@webrtc.org  VideoEngineImpl* vie_impl = static_cast<VideoEngineImpl*>(video_engine);
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Check all reference counters.
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEBaseImpl* vie_base = vie_impl;
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_base->GetCount() > 0) {
393468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org    LOG(LS_ERROR) << "ViEBase ref count > 0: " << vie_base->GetCount();
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return false;
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VIDEO_ENGINE_CAPTURE_API
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViECaptureImpl* vie_capture = vie_impl;
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_capture->GetCount() > 0) {
453468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org    LOG(LS_ERROR) << "ViECapture ref count > 0: " << vie_capture->GetCount();
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return false;
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VIDEO_ENGINE_CODEC_API
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViECodecImpl* vie_codec = vie_impl;
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_codec->GetCount() > 0) {
523468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org    LOG(LS_ERROR) << "ViECodec ref count > 0: " << vie_codec->GetCount();
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return false;
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VIDEO_ENGINE_EXTERNAL_CODEC_API
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEExternalCodecImpl* vie_external_codec = vie_impl;
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_external_codec->GetCount() > 0) {
593468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org    LOG(LS_ERROR) << "ViEExternalCodec ref count > 0: "
603468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org                  << vie_external_codec->GetCount();
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return false;
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VIDEO_ENGINE_FILE_API
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEFileImpl* vie_file = vie_impl;
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_file->GetCount() > 0) {
673468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org    LOG(LS_ERROR) << "ViEFile ref count > 0: " << vie_file->GetCount();
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return false;
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VIDEO_ENGINE_IMAGE_PROCESS_API
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEImageProcessImpl* vie_image_process = vie_impl;
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_image_process->GetCount() > 0) {
743468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org    LOG(LS_ERROR) << "ViEImageProcess ref count > 0: "
753468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org                  << vie_image_process->GetCount();
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return false;
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViENetworkImpl* vie_network = vie_impl;
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_network->GetCount() > 0) {
813468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org    LOG(LS_ERROR) << "ViENetwork ref count > 0: " << vie_network->GetCount();
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return false;
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VIDEO_ENGINE_RENDER_API
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViERenderImpl* vie_render = vie_impl;
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_render->GetCount() > 0) {
873468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org    LOG(LS_ERROR) << "ViERender ref count > 0: " << vie_render->GetCount();
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return false;
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VIDEO_ENGINE_RTP_RTCP_API
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViERTP_RTCPImpl* vie_rtp_rtcp = vie_impl;
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_rtp_rtcp->GetCount() > 0) {
943468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org    LOG(LS_ERROR) << "ViERTP_RTCP ref count > 0: " << vie_rtp_rtcp->GetCount();
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return false;
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  delete vie_impl;
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  vie_impl = NULL;
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_engine = NULL;
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return true;
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoEngine::SetTraceFile(const char* file_nameUTF8,
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              const bool add_file_counter) {
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!file_nameUTF8) {
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (Trace::SetTraceFile(file_nameUTF8, add_file_counter) == -1) {
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1143468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org  LOG_F(LS_INFO) << "filename: " << file_nameUTF8
1153468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org                 << " add_file_counter: " << (add_file_counter ? "yes" : "no");
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoEngine::SetTraceFilter(const unsigned int filter) {
12006eaa5465d57f416c14bb3a587ba4146290d6a58andrew@webrtc.org  uint32_t old_filter = Trace::level_filter();
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (filter == kTraceNone && old_filter != kTraceNone) {
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Do the logging before turning it off.
1243468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org    LOG_F(LS_INFO) << "filter: " << filter;
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
12706eaa5465d57f416c14bb3a587ba4146290d6a58andrew@webrtc.org  Trace::set_level_filter(filter);
1283468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org  LOG_F(LS_INFO) << "filter: " << filter;
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoEngine::SetTraceCallback(TraceCallback* callback) {
1333468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org  LOG_F(LS_INFO);
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return Trace::SetTraceCallback(callback);
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace webrtc
138