blob: e2763093308e365cc5fdd6c7b875624e52340a7d [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
pwestin@webrtc.orgae197202012-04-04 14:43:54 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
andresp@webrtc.org7707d062013-05-13 10:50:50 +000011#include "webrtc/video_engine/vie_impl.h"
12
13#include "webrtc/common.h"
14#include "webrtc/system_wrappers/interface/trace.h"
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +000015
leozwang@google.com22b699d2011-08-09 17:27:33 +000016#ifdef WEBRTC_ANDROID
andrew@webrtc.org94caca72012-10-30 21:58:00 +000017#include "webrtc/modules/video_capture/include/video_capture_factory.h"
andrew@webrtc.org9841d922012-10-31 05:22:11 +000018#include "webrtc/modules/video_render/include/video_render.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000019#endif
20
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +000021namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000022
andresp@webrtc.org44272732013-05-08 19:20:23 +000023enum { kModuleId = 0 };
niklase@google.com470e71d2011-07-07 08:21:25 +000024
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +000025VideoEngine* VideoEngine::Create() {
andresp@webrtc.org7707d062013-05-13 10:50:50 +000026 return new VideoEngineImpl(new Config(), true /* owns_config */);
27}
28
29VideoEngine* VideoEngine::Create(const Config& config) {
30 return new VideoEngineImpl(&config, false /* owns_config */);
niklase@google.com470e71d2011-07-07 08:21:25 +000031}
32
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +000033bool VideoEngine::Delete(VideoEngine*& video_engine) {
34 if (!video_engine) {
andresp@webrtc.org44272732013-05-08 19:20:23 +000035 WEBRTC_TRACE(kTraceError, kTraceVideo, kModuleId,
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +000036 "VideoEngine::Delete - No argument");
37 return false;
38 }
andresp@webrtc.org44272732013-05-08 19:20:23 +000039 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, kModuleId,
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +000040 "VideoEngine::Delete(vie = 0x%p)", video_engine);
andrew@webrtc.orgd72262d2013-05-09 02:12:07 +000041 VideoEngineImpl* vie_impl = static_cast<VideoEngineImpl*>(video_engine);
niklase@google.com470e71d2011-07-07 08:21:25 +000042
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +000043 // Check all reference counters.
44 ViEBaseImpl* vie_base = vie_impl;
45 if (vie_base->GetCount() > 0) {
andresp@webrtc.org44272732013-05-08 19:20:23 +000046 WEBRTC_TRACE(kTraceError, kTraceVideo, kModuleId,
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +000047 "ViEBase ref count: %d", vie_base->GetCount());
48 return false;
49 }
niklase@google.com470e71d2011-07-07 08:21:25 +000050#ifdef WEBRTC_VIDEO_ENGINE_CAPTURE_API
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +000051 ViECaptureImpl* vie_capture = vie_impl;
52 if (vie_capture->GetCount() > 0) {
andresp@webrtc.org44272732013-05-08 19:20:23 +000053 WEBRTC_TRACE(kTraceError, kTraceVideo, kModuleId,
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +000054 "ViECapture ref count: %d", vie_capture->GetCount());
55 return false;
56 }
niklase@google.com470e71d2011-07-07 08:21:25 +000057#endif
58#ifdef WEBRTC_VIDEO_ENGINE_CODEC_API
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +000059 ViECodecImpl* vie_codec = vie_impl;
60 if (vie_codec->GetCount() > 0) {
andresp@webrtc.org44272732013-05-08 19:20:23 +000061 WEBRTC_TRACE(kTraceError, kTraceVideo, kModuleId,
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +000062 "ViECodec ref count: %d", vie_codec->GetCount());
63 return false;
64 }
niklase@google.com470e71d2011-07-07 08:21:25 +000065#endif
66#ifdef WEBRTC_VIDEO_ENGINE_ENCRYPTION_API
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +000067 ViEEncryptionImpl* vie_encryption = vie_impl;
68 if (vie_encryption->GetCount() > 0) {
andresp@webrtc.org44272732013-05-08 19:20:23 +000069 WEBRTC_TRACE(kTraceError, kTraceVideo, kModuleId,
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +000070 "ViEEncryption ref count: %d", vie_encryption->GetCount());
71 return false;
72 }
niklase@google.com470e71d2011-07-07 08:21:25 +000073#endif
74#ifdef WEBRTC_VIDEO_ENGINE_EXTERNAL_CODEC_API
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +000075 ViEExternalCodecImpl* vie_external_codec = vie_impl;
76 if (vie_external_codec->GetCount() > 0) {
andresp@webrtc.org44272732013-05-08 19:20:23 +000077 WEBRTC_TRACE(kTraceError, kTraceVideo, kModuleId,
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +000078 "ViEEncryption ref count: %d", vie_encryption->GetCount());
79 return false;
80 }
niklase@google.com470e71d2011-07-07 08:21:25 +000081#endif
82#ifdef WEBRTC_VIDEO_ENGINE_FILE_API
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +000083 ViEFileImpl* vie_file = vie_impl;
84 if (vie_file->GetCount() > 0) {
andresp@webrtc.org44272732013-05-08 19:20:23 +000085 WEBRTC_TRACE(kTraceError, kTraceVideo, kModuleId,
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +000086 "ViEFile ref count: %d", vie_file->GetCount());
87 return false;
88 }
niklase@google.com470e71d2011-07-07 08:21:25 +000089#endif
90#ifdef WEBRTC_VIDEO_ENGINE_IMAGE_PROCESS_API
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +000091 ViEImageProcessImpl* vie_image_process = vie_impl;
92 if (vie_image_process->GetCount() > 0) {
andresp@webrtc.org44272732013-05-08 19:20:23 +000093 WEBRTC_TRACE(kTraceError, kTraceVideo, kModuleId,
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +000094 "ViEImageProcess ref count: %d",
95 vie_image_process->GetCount());
96 return false;
97 }
niklase@google.com470e71d2011-07-07 08:21:25 +000098#endif
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +000099 ViENetworkImpl* vie_network = vie_impl;
100 if (vie_network->GetCount() > 0) {
andresp@webrtc.org44272732013-05-08 19:20:23 +0000101 WEBRTC_TRACE(kTraceError, kTraceVideo, kModuleId,
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +0000102 "ViENetwork ref count: %d", vie_network->GetCount());
103 return false;
104 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000105#ifdef WEBRTC_VIDEO_ENGINE_RENDER_API
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +0000106 ViERenderImpl* vie_render = vie_impl;
107 if (vie_render->GetCount() > 0) {
andresp@webrtc.org44272732013-05-08 19:20:23 +0000108 WEBRTC_TRACE(kTraceError, kTraceVideo, kModuleId,
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +0000109 "ViERender ref count: %d", vie_render->GetCount());
110 return false;
111 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000112#endif
113#ifdef WEBRTC_VIDEO_ENGINE_RTP_RTCP_API
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +0000114 ViERTP_RTCPImpl* vie_rtp_rtcp = vie_impl;
115 if (vie_rtp_rtcp->GetCount() > 0) {
andresp@webrtc.org44272732013-05-08 19:20:23 +0000116 WEBRTC_TRACE(kTraceError, kTraceVideo, kModuleId,
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +0000117 "ViERTP_RTCP ref count: %d", vie_rtp_rtcp->GetCount());
118 return false;
119 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000120#endif
121
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +0000122 delete vie_impl;
123 vie_impl = NULL;
124 video_engine = NULL;
niklase@google.com470e71d2011-07-07 08:21:25 +0000125
andresp@webrtc.org44272732013-05-08 19:20:23 +0000126 WEBRTC_TRACE(kTraceInfo, kTraceVideo, kModuleId,
127 "%s: instance deleted.", __FUNCTION__);
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +0000128 return true;
niklase@google.com470e71d2011-07-07 08:21:25 +0000129}
130
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +0000131int VideoEngine::SetTraceFile(const char* file_nameUTF8,
132 const bool add_file_counter) {
133 if (!file_nameUTF8) {
134 return -1;
135 }
136 if (Trace::SetTraceFile(file_nameUTF8, add_file_counter) == -1) {
137 return -1;
138 }
andresp@webrtc.org44272732013-05-08 19:20:23 +0000139 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, kModuleId,
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +0000140 "SetTraceFileName(file_nameUTF8 = %s, add_file_counter = %d",
141 file_nameUTF8, add_file_counter);
142 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000143}
144
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +0000145int VideoEngine::SetTraceFilter(const unsigned int filter) {
andrew@webrtc.org90805182013-09-05 16:40:43 +0000146 uint32_t old_filter = Trace::level_filter();
niklase@google.com470e71d2011-07-07 08:21:25 +0000147
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +0000148 if (filter == kTraceNone && old_filter != kTraceNone) {
149 // Do the logging before turning it off.
andresp@webrtc.org44272732013-05-08 19:20:23 +0000150 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, kModuleId,
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +0000151 "SetTraceFilter(filter = 0x%x)", filter);
152 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000153
andrew@webrtc.org90805182013-09-05 16:40:43 +0000154 Trace::set_level_filter(filter);
andresp@webrtc.org44272732013-05-08 19:20:23 +0000155 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, kModuleId,
niklase@google.com470e71d2011-07-07 08:21:25 +0000156 "SetTraceFilter(filter = 0x%x)", filter);
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +0000157 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000158}
159
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +0000160int VideoEngine::SetTraceCallback(TraceCallback* callback) {
andresp@webrtc.org44272732013-05-08 19:20:23 +0000161 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, kModuleId,
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +0000162 "SetTraceCallback(TraceCallback = 0x%p)", callback);
163 return Trace::SetTraceCallback(callback);
niklase@google.com470e71d2011-07-07 08:21:25 +0000164}
165
leozwang@webrtc.orgf9cd6932012-01-23 16:56:13 +0000166int VideoEngine::SetAndroidObjects(void* javaVM, void* javaContext) {
andresp@webrtc.org44272732013-05-08 19:20:23 +0000167 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, kModuleId,
niklase@google.com470e71d2011-07-07 08:21:25 +0000168 "SetAndroidObjects()");
169
leozwang@webrtc.org77609632012-07-13 22:00:43 +0000170#if defined(WEBRTC_ANDROID) && !defined(WEBRTC_CHROMIUM_BUILD)
171 if (SetCaptureAndroidVM(javaVM, javaContext) != 0) {
andresp@webrtc.org44272732013-05-08 19:20:23 +0000172 WEBRTC_TRACE(kTraceError, kTraceVideo, kModuleId,
leozwang@webrtc.org77609632012-07-13 22:00:43 +0000173 "Could not set capture Android VM");
niklase@google.com470e71d2011-07-07 08:21:25 +0000174 return -1;
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +0000175 }
leozwang@webrtc.org77609632012-07-13 22:00:43 +0000176 if (SetRenderAndroidVM(javaVM) != 0) {
andresp@webrtc.org44272732013-05-08 19:20:23 +0000177 WEBRTC_TRACE(kTraceError, kTraceVideo, kModuleId,
leozwang@webrtc.org77609632012-07-13 22:00:43 +0000178 "Could not set render Android VM");
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +0000179 return -1;
180 }
181 return 0;
182#else
andresp@webrtc.org44272732013-05-08 19:20:23 +0000183 WEBRTC_TRACE(kTraceError, kTraceVideo, kModuleId,
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +0000184 "WEBRTC_ANDROID not defined for VideoEngine::SetAndroidObjects");
185 return -1;
niklase@google.com470e71d2011-07-07 08:21:25 +0000186#endif
187}
mflodman@webrtc.org1bdf1df2011-12-20 11:57:47 +0000188
189} // namespace webrtc