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