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
11281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/vie_capture_impl.h"
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
13bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org#include <map>
14bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org
15022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org#include "webrtc/system_wrappers/interface/logging.h"
16281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/include/vie_errors.h"
17281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/vie_capturer.h"
18281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/vie_channel.h"
19281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/vie_channel_manager.h"
20281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/vie_defines.h"
21281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/vie_encoder.h"
22281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/vie_impl.h"
23281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/vie_input_manager.h"
24281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/vie_shared_data.h"
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
28bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.orgclass CpuOveruseObserver;
29bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgViECapture* ViECapture::GetInterface(VideoEngine* video_engine) {
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VIDEO_ENGINE_CAPTURE_API
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!video_engine) {
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return NULL;
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
357ab726855f2ceb9ff6365e3240668d58f45e6761andrew@webrtc.org  VideoEngineImpl* vie_impl = static_cast<VideoEngineImpl*>(video_engine);
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViECaptureImpl* vie_capture_impl = vie_impl;
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Increase ref count.
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  (*vie_capture_impl)++;
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return vie_capture_impl;
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return NULL;
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViECaptureImpl::Release() {
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Decrease ref count
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  (*this)--;
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
4967879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t ref_count = GetCount();
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (ref_count < 0) {
51022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org    LOG(LS_WARNING) << "ViECapture released too many times.";
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViEAPIDoesNotExist);
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return ref_count;
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgViECaptureImpl::ViECaptureImpl(ViESharedData* shared_data)
59022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org    : shared_data_(shared_data) {}
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
61022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.orgViECaptureImpl::~ViECaptureImpl() {}
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViECaptureImpl::NumberOfCaptureDevices() {
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return  shared_data_->input_manager()->NumberOfCaptureDevices();
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViECaptureImpl::GetCaptureDevice(unsigned int list_number,
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                     char* device_nameUTF8,
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                     unsigned int device_nameUTF8Length,
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                     char* unique_idUTF8,
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                     unsigned int unique_idUTF8Length) {
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return shared_data_->input_manager()->GetDeviceName(
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      list_number,
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      device_nameUTF8, device_nameUTF8Length,
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      unique_idUTF8, unique_idUTF8Length);
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViECaptureImpl::AllocateCaptureDevice(
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const char* unique_idUTF8,
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const unsigned int unique_idUTF8Length,
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int& capture_id) {
83022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org  LOG(LS_INFO) << "AllocateCaptureDevice " << unique_idUTF8;
8467879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  const int32_t result =
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      shared_data_->input_manager()->CreateCaptureDevice(
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          unique_idUTF8,
8767879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org          static_cast<const uint32_t>(unique_idUTF8Length),
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          capture_id);
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (result != 0) {
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(result);
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViECaptureImpl::AllocateExternalCaptureDevice(
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int& capture_id, ViEExternalCapture*& external_capture) {
9867879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  const int32_t result =
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      shared_data_->input_manager()->CreateExternalCaptureDevice(
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          external_capture, capture_id);
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (result != 0) {
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(result);
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
106022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org  LOG(LS_INFO) << "External capture device allocated: " << capture_id;
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViECaptureImpl::AllocateCaptureDevice(
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    VideoCaptureModule& capture_module, int& capture_id) {  // NOLINT
1127645e4dedc3700d785a8e6b377db8c1659ff2583mflodman@webrtc.org  int32_t result = shared_data_->input_manager()->CreateCaptureDevice(
1137645e4dedc3700d785a8e6b377db8c1659ff2583mflodman@webrtc.org      &capture_module, capture_id);
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (result != 0) {
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(result);
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
118022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org  LOG(LS_INFO) << "External capture device, by module, allocated: "
119022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org               << capture_id;
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViECaptureImpl::ReleaseCaptureDevice(const int capture_id) {
125022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org  LOG(LS_INFO) << "ReleaseCaptureDevice " << capture_id;
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  {
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ViEInputManagerScoped is((*(shared_data_->input_manager())));
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ViECapturer* vie_capture = is.Capture(capture_id);
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!vie_capture) {
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      shared_data_->SetLastError(kViECaptureDeviceDoesNotExist);
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      return -1;
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return shared_data_->input_manager()->DestroyCaptureDevice(capture_id);
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViECaptureImpl::ConnectCaptureDevice(const int capture_id,
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         const int video_channel) {
139022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org  LOG(LS_INFO) << "Connect capture id " << capture_id
140022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org               << " to channel " << video_channel;
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEInputManagerScoped is(*(shared_data_->input_manager()));
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViECapturer* vie_capture = is.Capture(capture_id);
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!vie_capture) {
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceDoesNotExist);
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEEncoder* vie_encoder = cs.Encoder(video_channel);
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!vie_encoder) {
152022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org    LOG(LS_ERROR) << "Channel doesn't exist.";
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceInvalidChannelId);
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_encoder->Owner() != video_channel) {
157022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org    LOG(LS_ERROR) << "Can't connect capture device to a receive device.";
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceInvalidChannelId);
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  //  Check if the encoder already has a connected frame provider
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (is.FrameProvider(vie_encoder) != NULL) {
163022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org    LOG(LS_ERROR) << "Channel already connected to capture device.";
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceAlreadyConnected);
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
167a18c6e5b2811221b60e3d7e72516aa20927e13ddmflodman@webrtc.org  if (vie_capture->RegisterFrameCallback(video_channel, vie_encoder) != 0) {
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceUnknownError);
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
171bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org  std::map<int, CpuOveruseObserver*>::iterator it =
172bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org      shared_data_->overuse_observers()->find(video_channel);
173bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org  if (it != shared_data_->overuse_observers()->end()) {
174bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org    vie_capture->RegisterCpuOveruseObserver(it->second);
175bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org  }
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViECaptureImpl::DisconnectCaptureDevice(const int video_channel) {
181022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org  LOG(LS_INFO) << "DisconnectCaptureDevice " << video_channel;
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEEncoder* vie_encoder = cs.Encoder(video_channel);
185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!vie_encoder) {
186022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org    LOG(LS_ERROR) << "Channel doesn't exist.";
187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceInvalidChannelId);
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEInputManagerScoped is(*(shared_data_->input_manager()));
192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEFrameProviderBase* frame_provider = is.FrameProvider(vie_encoder);
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!frame_provider) {
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceNotConnected);
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (frame_provider->Id() < kViECaptureIdBase ||
198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      frame_provider->Id() > kViECaptureIdMax) {
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceNotConnected);
200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
203bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org  ViECapturer* vie_capture = is.Capture(frame_provider->Id());
204bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org  assert(vie_capture);
205bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org  vie_capture->RegisterCpuOveruseObserver(NULL);
206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (frame_provider->DeregisterFrameCallback(vie_encoder) != 0) {
207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceUnknownError);
208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViECaptureImpl::StartCapture(const int capture_id,
215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 const CaptureCapability& capture_capability) {
2161d95c5aecd0a4924f39f24834fb06d06e61f181easapersson@webrtc.org  LOG(LS_INFO) << "StartCapture " << capture_id;
217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEInputManagerScoped is(*(shared_data_->input_manager()));
219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViECapturer* vie_capture = is.Capture(capture_id);
220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!vie_capture) {
221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceDoesNotExist);
222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_capture->Started()) {
225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceAlreadyStarted);
226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_capture->Start(capture_capability) != 0) {
229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceUnknownError);
230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViECaptureImpl::StopCapture(const int capture_id) {
236022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org  LOG(LS_INFO) << "StopCapture " << capture_id;
237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEInputManagerScoped is(*(shared_data_->input_manager()));
239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViECapturer* vie_capture = is.Capture(capture_id);
240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!vie_capture) {
241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceDoesNotExist);
242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!vie_capture->Started()) {
245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceNotStarted);
246022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org    return 0;
247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_capture->Stop() != 0) {
249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceUnknownError);
250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViECaptureImpl::SetRotateCapturedFrames(
256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    const int capture_id,
257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    const RotateCapturedFrame rotation) {
258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int i_rotation = -1;
259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  switch (rotation) {
260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case RotateCapturedFrame_0:
261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      i_rotation = 0;
262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case RotateCapturedFrame_90:
264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      i_rotation = 90;
265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case RotateCapturedFrame_180:
267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      i_rotation = 180;
268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case RotateCapturedFrame_270:
270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      i_rotation = 270;
271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
273022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org  LOG(LS_INFO) << "SetRotateCaptureFrames for " << capture_id
274022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org               << ", rotation " << i_rotation;
275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEInputManagerScoped is(*(shared_data_->input_manager()));
277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViECapturer* vie_capture = is.Capture(capture_id);
278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!vie_capture) {
279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceDoesNotExist);
280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_capture->SetRotateCapturedFrames(rotation) != 0) {
283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceUnknownError);
284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViECaptureImpl::SetCaptureDelay(const int capture_id,
290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                    const unsigned int capture_delay_ms) {
291022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org  LOG(LS_INFO) << "SetCaptureDelay " << capture_delay_ms
292022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org               << ", for device " << capture_id;
293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEInputManagerScoped is(*(shared_data_->input_manager()));
295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViECapturer* vie_capture = is.Capture(capture_id);
296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!vie_capture) {
297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceDoesNotExist);
298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_capture->SetCaptureDelay(capture_delay_ms) != 0) {
302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceUnknownError);
303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViECaptureImpl::NumberOfCapabilities(
309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    const char* unique_idUTF8,
310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    const unsigned int unique_idUTF8Length) {
311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(WEBRTC_MAC)
313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // TODO(mflodman) Move to capture module!
314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // QTKit framework handles all capabilities and capture settings
315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // automatically (mandatory).
316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Thus this function cannot be supported on the Mac platform.
317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  shared_data_->SetLastError(kViECaptureDeviceMacQtkitNotSupported);
318022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org  LOG_F(LS_ERROR) << "API not supported on Mac OS X.";
319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return shared_data_->input_manager()->NumberOfCaptureCapabilities(
322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      unique_idUTF8);
323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViECaptureImpl::GetCaptureCapability(const char* unique_idUTF8,
327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         const unsigned int unique_idUTF8Length,
328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         const unsigned int capability_number,
329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         CaptureCapability& capability) {
330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(WEBRTC_MAC)
332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // TODO(mflodman) Move to capture module!
333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // QTKit framework handles all capabilities and capture settings
334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // automatically (mandatory).
335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Thus this function cannot be supported on the Mac platform.
336022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org  LOG_F(LS_ERROR) << "API not supported on Mac OS X.";
337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  shared_data_->SetLastError(kViECaptureDeviceMacQtkitNotSupported);
338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (shared_data_->input_manager()->GetCaptureCapability(
341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          unique_idUTF8, capability_number, capability) != 0) {
342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceUnknownError);
343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViECaptureImpl::ShowCaptureSettingsDialogBox(
349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    const char* unique_idUTF8,
350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    const unsigned int unique_idUTF8Length,
351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    const char* dialog_title,
352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void* parent_window,
353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    const unsigned int x,
354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    const unsigned int y) {
355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(WEBRTC_MAC)
356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // TODO(mflodman) Move to capture module
357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // QTKit framework handles all capabilities and capture settings
358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // automatically (mandatory).
359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Thus this function cannot be supported on the Mac platform.
360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  shared_data_->SetLastError(kViECaptureDeviceMacQtkitNotSupported);
361022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org  LOG_F(LS_ERROR) << "API not supported on Mac OS X.";
362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return shared_data_->input_manager()->DisplayCaptureSettingsDialogBox(
365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org           unique_idUTF8, dialog_title,
366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org           parent_window, x, y);
367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViECaptureImpl::GetOrientation(const char* unique_idUTF8,
370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                   RotateCapturedFrame& orientation) {
371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (shared_data_->input_manager()->GetOrientation(
372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      unique_idUTF8,
373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      orientation) != 0) {
374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceUnknownError);
375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViECaptureImpl::EnableBrightnessAlarm(const int capture_id,
382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                          const bool enable) {
383022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org  LOG(LS_INFO) << "EnableBrightnessAlarm for device " << capture_id
384022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org               << ", status " << enable;
385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEInputManagerScoped is(*(shared_data_->input_manager()));
386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViECapturer* vie_capture = is.Capture(capture_id);
387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!vie_capture) {
388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceDoesNotExist);
389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_capture->EnableBrightnessAlarm(enable) != 0) {
392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceUnknownError);
393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViECaptureImpl::RegisterObserver(const int capture_id,
399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                     ViECaptureObserver& observer) {
400022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org  LOG(LS_INFO) << "Register capture observer " << capture_id;
401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEInputManagerScoped is(*(shared_data_->input_manager()));
402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViECapturer* vie_capture = is.Capture(capture_id);
403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!vie_capture) {
404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceDoesNotExist);
405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_capture->IsObserverRegistered()) {
408022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org    LOG_F(LS_ERROR) << "Observer already registered.";
409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureObserverAlreadyRegistered);
410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_capture->RegisterObserver(&observer) != 0) {
413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceUnknownError);
414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViECaptureImpl::DeregisterObserver(const int capture_id) {
420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEInputManagerScoped is(*(shared_data_->input_manager()));
421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViECapturer* vie_capture = is.Capture(capture_id);
422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!vie_capture) {
423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceDoesNotExist);
424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
426b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!vie_capture->IsObserverRegistered()) {
427b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceObserverNotRegistered);
428b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
429b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
430b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_capture->DeRegisterObserver() != 0) {
432b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViECaptureDeviceUnknownError);
433b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
436b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace webrtc
439