blob: 6c17f14387087888f9addcad3927c9a95a515b18 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
leozwang@webrtc.org1745e932012-03-01 16:30:40 +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
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000011#include "video_engine/vie_capture_impl.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000012
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000013#include "system_wrappers/interface/trace.h"
mflodman@webrtc.orga4863db2011-12-22 08:51:52 +000014#include "video_engine/include/vie_errors.h"
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000015#include "video_engine/vie_capturer.h"
16#include "video_engine/vie_channel.h"
17#include "video_engine/vie_channel_manager.h"
18#include "video_engine/vie_defines.h"
19#include "video_engine/vie_encoder.h"
20#include "video_engine/vie_impl.h"
21#include "video_engine/vie_input_manager.h"
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000022#include "video_engine/vie_shared_data.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000023
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000024namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000025
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000026ViECapture* ViECapture::GetInterface(VideoEngine* video_engine) {
niklase@google.com470e71d2011-07-07 08:21:25 +000027#ifdef WEBRTC_VIDEO_ENGINE_CAPTURE_API
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000028 if (!video_engine) {
niklase@google.com470e71d2011-07-07 08:21:25 +000029 return NULL;
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000030 }
31 VideoEngineImpl* vie_impl = reinterpret_cast<VideoEngineImpl*>(video_engine);
32 ViECaptureImpl* vie_capture_impl = vie_impl;
33 // Increase ref count.
34 (*vie_capture_impl)++;
35 return vie_capture_impl;
36#else
37 return NULL;
niklase@google.com470e71d2011-07-07 08:21:25 +000038#endif
39}
40
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000041int ViECaptureImpl::Release() {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000042 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, shared_data_->instance_id(),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000043 "ViECapture::Release()");
44 // Decrease ref count
45 (*this)--;
niklase@google.com470e71d2011-07-07 08:21:25 +000046
pbos@webrtc.orgb238d122013-04-09 13:41:51 +000047 int32_t ref_count = GetCount();
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000048 if (ref_count < 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000049 WEBRTC_TRACE(kTraceWarning, kTraceVideo, shared_data_->instance_id(),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000050 "ViECapture release too many times");
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000051 shared_data_->SetLastError(kViEAPIDoesNotExist);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000052 return -1;
53 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000054 WEBRTC_TRACE(kTraceInfo, kTraceVideo, shared_data_->instance_id(),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000055 "ViECapture reference count: %d", ref_count);
56 return ref_count;
niklase@google.com470e71d2011-07-07 08:21:25 +000057}
58
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000059ViECaptureImpl::ViECaptureImpl(ViESharedData* shared_data)
60 : shared_data_(shared_data) {
61 WEBRTC_TRACE(kTraceMemory, kTraceVideo, shared_data_->instance_id(),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000062 "ViECaptureImpl::ViECaptureImpl() Ctor");
niklase@google.com470e71d2011-07-07 08:21:25 +000063}
64
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000065ViECaptureImpl::~ViECaptureImpl() {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000066 WEBRTC_TRACE(kTraceMemory, kTraceVideo, shared_data_->instance_id(),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000067 "ViECaptureImpl::~ViECaptureImpl() Dtor");
niklase@google.com470e71d2011-07-07 08:21:25 +000068}
69
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000070int ViECaptureImpl::NumberOfCaptureDevices() {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000071 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_->instance_id()),
72 "%s", __FUNCTION__);
73 if (!shared_data_->Initialized()) {
74 shared_data_->SetLastError(kViENotInitialized);
75 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000076 "%s - ViE instance %d not initialized", __FUNCTION__,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000077 shared_data_->instance_id());
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000078 return -1;
79 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000080 return shared_data_->input_manager()->NumberOfCaptureDevices();
niklase@google.com470e71d2011-07-07 08:21:25 +000081}
82
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000083
84int ViECaptureImpl::GetCaptureDevice(unsigned int list_number,
85 char* device_nameUTF8,
86 unsigned int device_nameUTF8Length,
87 char* unique_idUTF8,
88 unsigned int unique_idUTF8Length) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000089 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000090 "%s(list_number: %d)", __FUNCTION__, list_number);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000091 if (!shared_data_->Initialized()) {
92 shared_data_->SetLastError(kViENotInitialized);
93 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000094 "%s - ViE instance %d not initialized", __FUNCTION__,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000095 shared_data_->instance_id());
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000096 return -1;
97 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000098 return shared_data_->input_manager()->GetDeviceName(
mflodman@webrtc.org605972e2011-12-16 08:59:24 +000099 list_number,
leozwang@webrtc.org1745e932012-03-01 16:30:40 +0000100 device_nameUTF8, device_nameUTF8Length,
101 unique_idUTF8, unique_idUTF8Length);
niklase@google.com470e71d2011-07-07 08:21:25 +0000102}
103
niklase@google.com470e71d2011-07-07 08:21:25 +0000104int ViECaptureImpl::AllocateCaptureDevice(
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000105 const char* unique_idUTF8,
106 const unsigned int unique_idUTF8Length,
107 int& capture_id) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000108 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000109 "%s(unique_idUTF8: %s)", __FUNCTION__, unique_idUTF8);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000110 if (!shared_data_->Initialized()) {
111 shared_data_->SetLastError(kViENotInitialized);
112 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000113 "%s - ViE instance %d not initialized", __FUNCTION__,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000114 shared_data_->instance_id());
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000115 return -1;
116 }
pbos@webrtc.orgb238d122013-04-09 13:41:51 +0000117 const int32_t result =
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000118 shared_data_->input_manager()->CreateCaptureDevice(
leozwang@webrtc.org1745e932012-03-01 16:30:40 +0000119 unique_idUTF8,
pbos@webrtc.orgb238d122013-04-09 13:41:51 +0000120 static_cast<const uint32_t>(unique_idUTF8Length),
leozwang@webrtc.org1745e932012-03-01 16:30:40 +0000121 capture_id);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000122 if (result != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000123 shared_data_->SetLastError(result);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000124 return -1;
125 }
126 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000127}
128
niklase@google.com470e71d2011-07-07 08:21:25 +0000129int ViECaptureImpl::AllocateExternalCaptureDevice(
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000130 int& capture_id, ViEExternalCapture*& external_capture) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000131 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_->instance_id()),
132 "%s", __FUNCTION__);
niklase@google.com470e71d2011-07-07 08:21:25 +0000133
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000134 if (!shared_data_->Initialized()) {
135 shared_data_->SetLastError(kViENotInitialized);
136 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000137 "%s - ViE instance %d not initialized", __FUNCTION__,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000138 shared_data_->instance_id());
niklase@google.com470e71d2011-07-07 08:21:25 +0000139 return -1;
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000140 }
pbos@webrtc.orgb238d122013-04-09 13:41:51 +0000141 const int32_t result =
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000142 shared_data_->input_manager()->CreateExternalCaptureDevice(
143 external_capture, capture_id);
niklase@google.com470e71d2011-07-07 08:21:25 +0000144
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000145 if (result != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000146 shared_data_->SetLastError(result);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000147 return -1;
148 }
149 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000150}
151
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +0000152int ViECaptureImpl::AllocateCaptureDevice(
153 VideoCaptureModule& capture_module, int& capture_id) { // NOLINT
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000154 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_->instance_id()),
155 "%s", __FUNCTION__);
niklase@google.com470e71d2011-07-07 08:21:25 +0000156
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000157 if (!shared_data_->Initialized()) {
158 shared_data_->SetLastError(kViENotInitialized);
159 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000160 "%s - ViE instance %d not initialized", __FUNCTION__,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000161 shared_data_->instance_id());
niklase@google.com470e71d2011-07-07 08:21:25 +0000162 return -1;
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000163 }
pbos@webrtc.orgb238d122013-04-09 13:41:51 +0000164 const int32_t result =
mflodman@webrtc.org8baed512012-06-21 12:11:50 +0000165 shared_data_->input_manager()->CreateCaptureDevice(&capture_module,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000166 capture_id);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000167 if (result != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000168 shared_data_->SetLastError(result);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000169 return -1;
170 }
171 return 0;
172}
173
174
175int ViECaptureImpl::ReleaseCaptureDevice(const int capture_id) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000176 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000177 "%s(capture_id: %d)", __FUNCTION__, capture_id);
178 {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000179 ViEInputManagerScoped is((*(shared_data_->input_manager())));
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000180 ViECapturer* vie_capture = is.Capture(capture_id);
181 if (!vie_capture) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000182 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000183 "%s: Capture device %d doesn't exist", __FUNCTION__,
184 capture_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000185 shared_data_->SetLastError(kViECaptureDeviceDoesNotExist);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000186 return -1;
187 }
188 }
189
190 // Destroy the capture device.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000191 return shared_data_->input_manager()->DestroyCaptureDevice(capture_id);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000192}
193
194int ViECaptureImpl::ConnectCaptureDevice(const int capture_id,
195 const int video_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000196 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
197 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000198 "%s(capture_id: %d, video_channel: %d)", __FUNCTION__,
199 capture_id, video_channel);
200
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000201 ViEInputManagerScoped is(*(shared_data_->input_manager()));
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000202 ViECapturer* vie_capture = is.Capture(capture_id);
203 if (!vie_capture) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000204 WEBRTC_TRACE(kTraceError, kTraceVideo,
205 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000206 "%s: Capture device %d doesn't exist", __FUNCTION__,
207 capture_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000208 shared_data_->SetLastError(kViECaptureDeviceDoesNotExist);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000209 return -1;
210 }
211
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000212 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000213 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
214 if (!vie_encoder) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000215 WEBRTC_TRACE(kTraceError, kTraceVideo,
216 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000217 "%s: Channel %d doesn't exist", __FUNCTION__,
218 video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000219 shared_data_->SetLastError(kViECaptureDeviceInvalidChannelId);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000220 return -1;
221 }
mflodman@webrtc.org9ec883e2012-03-05 17:12:41 +0000222 if (vie_encoder->Owner() != video_channel) {
223 WEBRTC_TRACE(kTraceError, kTraceVideo,
224 ViEId(shared_data_->instance_id(), video_channel),
225 "Can't connect capture device to a receive only channel.");
226 shared_data_->SetLastError(kViECaptureDeviceInvalidChannelId);
227 return -1;
228 }
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000229 // Check if the encoder already has a connected frame provider
230 if (is.FrameProvider(vie_encoder) != NULL) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000231 WEBRTC_TRACE(kTraceError, kTraceVideo,
232 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000233 "%s: Channel %d already connected to a capture device.",
234 __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000235 shared_data_->SetLastError(kViECaptureDeviceAlreadyConnected);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000236 return -1;
237 }
238 VideoCodec codec;
239 bool use_hardware_encoder = false;
mflodman@webrtc.orgf5e99db2012-06-27 09:49:37 +0000240 if (vie_encoder->GetEncoder(&codec) == 0) {
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000241 // Try to provide the encoder with pre-encoded frames if possible.
242 if (vie_capture->PreEncodeToViEEncoder(codec, *vie_encoder,
243 video_channel) == 0) {
244 use_hardware_encoder = true;
245 }
246 }
247 // If we don't use the camera as hardware encoder, we register the vie_encoder
248 // for callbacks.
249 if (!use_hardware_encoder &&
250 vie_capture->RegisterFrameCallback(video_channel, vie_encoder) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000251 shared_data_->SetLastError(kViECaptureDeviceUnknownError);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000252 return -1;
253 }
254 return 0;
255}
256
257
258int ViECaptureImpl::DisconnectCaptureDevice(const int video_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000259 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
260 ViEId(shared_data_->instance_id(), video_channel),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000261 "%s(video_channel: %d)", __FUNCTION__, video_channel);
262
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000263 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000264 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
265 if (!vie_encoder) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000266 WEBRTC_TRACE(kTraceError, kTraceVideo,
267 ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000268 "%s: Channel %d doesn't exist", __FUNCTION__,
269 video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000270 shared_data_->SetLastError(kViECaptureDeviceInvalidChannelId);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000271 return -1;
272 }
273
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000274 ViEInputManagerScoped is(*(shared_data_->input_manager()));
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000275 ViEFrameProviderBase* frame_provider = is.FrameProvider(vie_encoder);
276 if (!frame_provider) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000277 WEBRTC_TRACE(kTraceWarning, kTraceVideo,
278 ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000279 "%s: No capture device connected to channel %d",
280 __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000281 shared_data_->SetLastError(kViECaptureDeviceNotConnected);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000282 return -1;
283 }
284 if (frame_provider->Id() < kViECaptureIdBase ||
285 frame_provider->Id() > kViECaptureIdMax) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000286 WEBRTC_TRACE(kTraceWarning, kTraceVideo,
287 ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000288 "%s: No capture device connected to channel %d",
289 __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000290 shared_data_->SetLastError(kViECaptureDeviceNotConnected);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000291 return -1;
292 }
293
294 if (frame_provider->DeregisterFrameCallback(vie_encoder) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000295 shared_data_->SetLastError(kViECaptureDeviceUnknownError);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000296 return -1;
297 }
298
299 return 0;
300}
301
302int ViECaptureImpl::StartCapture(const int capture_id,
mflodman@webrtc.orge5297d22012-01-17 12:44:41 +0000303 const CaptureCapability& capture_capability) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000304 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000305 "%s(capture_id: %d)", __FUNCTION__, capture_id);
306
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000307 ViEInputManagerScoped is(*(shared_data_->input_manager()));
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000308 ViECapturer* vie_capture = is.Capture(capture_id);
309 if (!vie_capture) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000310 WEBRTC_TRACE(kTraceError, kTraceVideo,
311 ViEId(shared_data_->instance_id(), capture_id),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000312 "%s: Capture device %d doesn't exist", __FUNCTION__,
313 capture_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000314 shared_data_->SetLastError(kViECaptureDeviceDoesNotExist);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000315 return -1;
316 }
317 if (vie_capture->Started()) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000318 shared_data_->SetLastError(kViECaptureDeviceAlreadyStarted);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000319 return -1;
320 }
321 if (vie_capture->Start(capture_capability) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000322 shared_data_->SetLastError(kViECaptureDeviceUnknownError);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000323 return -1;
324 }
325 return 0;
326}
327
328int ViECaptureImpl::StopCapture(const int capture_id) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000329 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000330 "%s(capture_id: %d)", __FUNCTION__, capture_id);
331
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000332 ViEInputManagerScoped is(*(shared_data_->input_manager()));
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000333 ViECapturer* vie_capture = is.Capture(capture_id);
334 if (!vie_capture) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000335 WEBRTC_TRACE(kTraceError, kTraceVideo,
336 ViEId(shared_data_->instance_id(), capture_id),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000337 "%s: Capture device %d doesn't exist", __FUNCTION__,
338 capture_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000339 shared_data_->SetLastError(kViECaptureDeviceDoesNotExist);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000340 return -1;
341 }
342 if (!vie_capture->Started()) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000343 shared_data_->SetLastError(kViECaptureDeviceNotStarted);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000344 return -1;
345 }
346 if (vie_capture->Stop() != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000347 shared_data_->SetLastError(kViECaptureDeviceUnknownError);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000348 return -1;
349 }
350
351 return 0;
352}
353
354int ViECaptureImpl::SetRotateCapturedFrames(
355 const int capture_id,
356 const RotateCapturedFrame rotation) {
357 int i_rotation = -1;
358 switch (rotation) {
359 case RotateCapturedFrame_0:
360 i_rotation = 0;
361 break;
362 case RotateCapturedFrame_90:
363 i_rotation = 90;
364 break;
365 case RotateCapturedFrame_180:
366 i_rotation = 180;
367 break;
368 case RotateCapturedFrame_270:
369 i_rotation = 270;
370 break;
371 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000372 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000373 "%s(rotation: %d)", __FUNCTION__, i_rotation);
374
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000375 ViEInputManagerScoped is(*(shared_data_->input_manager()));
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000376 ViECapturer* vie_capture = is.Capture(capture_id);
377 if (!vie_capture) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000378 WEBRTC_TRACE(kTraceError, kTraceVideo,
379 ViEId(shared_data_->instance_id(), capture_id),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000380 "%s: Capture device %d doesn't exist", __FUNCTION__,
381 capture_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000382 shared_data_->SetLastError(kViECaptureDeviceDoesNotExist);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000383 return -1;
384 }
385 if (vie_capture->SetRotateCapturedFrames(rotation) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000386 shared_data_->SetLastError(kViECaptureDeviceUnknownError);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000387 return -1;
388 }
389 return 0;
390}
391
392int ViECaptureImpl::SetCaptureDelay(const int capture_id,
393 const unsigned int capture_delay_ms) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000394 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000395 "%s(capture_id: %d, capture_delay_ms %u)", __FUNCTION__,
396 capture_id, capture_delay_ms);
397
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000398 ViEInputManagerScoped is(*(shared_data_->input_manager()));
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000399 ViECapturer* vie_capture = is.Capture(capture_id);
400 if (!vie_capture) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000401 WEBRTC_TRACE(kTraceError, kTraceVideo,
402 ViEId(shared_data_->instance_id(), capture_id),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000403 "%s: Capture device %d doesn't exist", __FUNCTION__,
404 capture_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000405 shared_data_->SetLastError(kViECaptureDeviceDoesNotExist);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000406 return -1;
407 }
408
409 if (vie_capture->SetCaptureDelay(capture_delay_ms) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000410 shared_data_->SetLastError(kViECaptureDeviceUnknownError);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000411 return -1;
412 }
413 return 0;
414}
415
416int ViECaptureImpl::NumberOfCapabilities(
417 const char* unique_idUTF8,
418 const unsigned int unique_idUTF8Length) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000419 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000420 "%s(capture_device_name: %s)", __FUNCTION__, unique_idUTF8);
421
andrew@webrtc.orgf3b65db2012-09-06 18:17:00 +0000422#if defined(WEBRTC_MAC)
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000423 // TODO(mflodman) Move to capture module!
424 // QTKit framework handles all capabilities and capture settings
425 // automatically (mandatory).
426 // Thus this function cannot be supported on the Mac platform.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000427 shared_data_->SetLastError(kViECaptureDeviceMacQtkitNotSupported);
428 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000429 "%s This API is not supported on Mac OS", __FUNCTION__,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000430 shared_data_->instance_id());
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000431 return -1;
niklase@google.com470e71d2011-07-07 08:21:25 +0000432#endif
433
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000434 if (!shared_data_->Initialized()) {
435 shared_data_->SetLastError(kViENotInitialized);
436 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000437 "%s - ViE instance %d not initialized", __FUNCTION__,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000438 shared_data_->instance_id());
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000439 return -1;
440 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000441 return shared_data_->input_manager()->NumberOfCaptureCapabilities(
leozwang@webrtc.org1745e932012-03-01 16:30:40 +0000442 unique_idUTF8);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000443}
444
445
446int ViECaptureImpl::GetCaptureCapability(const char* unique_idUTF8,
447 const unsigned int unique_idUTF8Length,
448 const unsigned int capability_number,
449 CaptureCapability& capability) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000450 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000451 "%s(capture_device_name: %s)", __FUNCTION__, unique_idUTF8);
452
andrew@webrtc.orgf3b65db2012-09-06 18:17:00 +0000453#if defined(WEBRTC_MAC)
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000454 // TODO(mflodman) Move to capture module!
455 // QTKit framework handles all capabilities and capture settings
456 // automatically (mandatory).
457 // Thus this function cannot be supported on the Mac platform.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000458 shared_data_->SetLastError(kViECaptureDeviceMacQtkitNotSupported);
459 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000460 "%s This API is not supported on Mac OS", __FUNCTION__,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000461 shared_data_->instance_id());
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000462 return -1;
463#endif
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000464 if (!shared_data_->Initialized()) {
465 shared_data_->SetLastError(kViENotInitialized);
466 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000467 "%s - ViE instance %d not initialized", __FUNCTION__,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000468 shared_data_->instance_id());
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000469 return -1;
470 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000471 if (shared_data_->input_manager()->GetCaptureCapability(
leozwang@webrtc.org1745e932012-03-01 16:30:40 +0000472 unique_idUTF8, capability_number, capability) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000473 shared_data_->SetLastError(kViECaptureDeviceUnknownError);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000474 return -1;
475 }
476 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000477}
478
479int ViECaptureImpl::ShowCaptureSettingsDialogBox(
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000480 const char* unique_idUTF8,
481 const unsigned int unique_idUTF8Length,
482 const char* dialog_title,
483 void* parent_window,
484 const unsigned int x,
485 const unsigned int y) {
andrew@webrtc.orgf3b65db2012-09-06 18:17:00 +0000486#if defined(WEBRTC_MAC)
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000487 // TODO(mflodman) Move to capture module
488 // QTKit framework handles all capabilities and capture settings
489 // automatically (mandatory).
490 // Thus this function cannot be supported on the Mac platform.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000491 shared_data_->SetLastError(kViECaptureDeviceMacQtkitNotSupported);
492 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000493 "%s This API is not supported on Mac OS", __FUNCTION__,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000494 shared_data_->instance_id());
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000495 return -1;
496#endif
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000497 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000498 "%s capture_id (capture_device_name: %s)", __FUNCTION__,
499 unique_idUTF8);
500
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000501 return shared_data_->input_manager()->DisplayCaptureSettingsDialogBox(
leozwang@webrtc.org1745e932012-03-01 16:30:40 +0000502 unique_idUTF8, dialog_title,
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000503 parent_window, x, y);
504}
505
506int ViECaptureImpl::GetOrientation(const char* unique_idUTF8,
507 RotateCapturedFrame& orientation) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000508 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000509 "%s (capture_device_name: %s)", __FUNCTION__, unique_idUTF8);
510
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000511 if (!shared_data_->Initialized()) {
512 shared_data_->SetLastError(kViENotInitialized);
513 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000514 "%s - ViE instance %d not initialized", __FUNCTION__,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000515 shared_data_->instance_id());
niklase@google.com470e71d2011-07-07 08:21:25 +0000516 return -1;
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000517 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000518 if (shared_data_->input_manager()->GetOrientation(
leozwang@webrtc.org1745e932012-03-01 16:30:40 +0000519 unique_idUTF8,
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000520 orientation) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000521 shared_data_->SetLastError(kViECaptureDeviceUnknownError);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000522 return -1;
523 }
524 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000525}
526
niklase@google.com470e71d2011-07-07 08:21:25 +0000527
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000528int ViECaptureImpl::EnableBrightnessAlarm(const int capture_id,
529 const bool enable) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000530 ViEInputManagerScoped is(*(shared_data_->input_manager()));
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000531 ViECapturer* vie_capture = is.Capture(capture_id);
532 if (!vie_capture) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000533 WEBRTC_TRACE(kTraceError, kTraceVideo,
534 ViEId(shared_data_->instance_id(), capture_id),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000535 "%s: Capture device %d doesn't exist", __FUNCTION__,
536 capture_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000537 shared_data_->SetLastError(kViECaptureDeviceDoesNotExist);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000538 return -1;
539 }
540 if (vie_capture->EnableBrightnessAlarm(enable) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000541 shared_data_->SetLastError(kViECaptureDeviceUnknownError);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000542 return -1;
543 }
544 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000545}
546
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000547int ViECaptureImpl::RegisterObserver(const int capture_id,
548 ViECaptureObserver& observer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000549 ViEInputManagerScoped is(*(shared_data_->input_manager()));
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000550 ViECapturer* vie_capture = is.Capture(capture_id);
551 if (!vie_capture) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000552 WEBRTC_TRACE(kTraceError, kTraceVideo,
553 ViEId(shared_data_->instance_id(), capture_id),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000554 "%s: Capture device %d doesn't exist", __FUNCTION__,
555 capture_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000556 shared_data_->SetLastError(kViECaptureDeviceDoesNotExist);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000557 return -1;
558 }
559 if (vie_capture->IsObserverRegistered()) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000560 WEBRTC_TRACE(kTraceError, kTraceVideo,
561 ViEId(shared_data_->instance_id(), capture_id),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000562 "%s: Observer already registered", __FUNCTION__);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000563 shared_data_->SetLastError(kViECaptureObserverAlreadyRegistered);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000564 return -1;
565 }
mflodman@webrtc.org8baed512012-06-21 12:11:50 +0000566 if (vie_capture->RegisterObserver(&observer) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000567 shared_data_->SetLastError(kViECaptureDeviceUnknownError);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000568 return -1;
569 }
570 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000571}
572
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000573int ViECaptureImpl::DeregisterObserver(const int capture_id) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000574 ViEInputManagerScoped is(*(shared_data_->input_manager()));
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000575 ViECapturer* vie_capture = is.Capture(capture_id);
576 if (!vie_capture) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000577 WEBRTC_TRACE(kTraceError, kTraceVideo,
578 ViEId(shared_data_->instance_id(), capture_id),
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000579 "%s: Capture device %d doesn't exist", __FUNCTION__,
580 capture_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000581 shared_data_->SetLastError(kViECaptureDeviceDoesNotExist);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000582 return -1;
583 }
584 if (!vie_capture->IsObserverRegistered()) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000585 shared_data_->SetLastError(kViECaptureDeviceObserverNotRegistered);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000586 return -1;
587 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000588
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000589 if (vie_capture->DeRegisterObserver() != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000590 shared_data_->SetLastError(kViECaptureDeviceUnknownError);
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000591 return -1;
592 }
593 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000594}
595
mflodman@webrtc.org605972e2011-12-16 08:59:24 +0000596} // namespace webrtc