1fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org/* 2fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org * 4fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org * Use of this source code is governed by a BSD-style license 5fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org * that can be found in the LICENSE file in the root of the source 6fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org * tree. An additional intellectual property rights grant can be found 7fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org * in the file PATENTS. All contributing project authors may 8fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org */ 10fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org 1125bbc982baeb7ba97c20b90d27828597dc3dc7cffischman@webrtc.org#if !defined(__has_feature) || !__has_feature(objc_arc) 1225bbc982baeb7ba97c20b90d27828597dc3dc7cffischman@webrtc.org#error "This file requires ARC support." 1325bbc982baeb7ba97c20b90d27828597dc3dc7cffischman@webrtc.org#endif 1425bbc982baeb7ba97c20b90d27828597dc3dc7cffischman@webrtc.org 15fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org#include "webrtc/modules/video_capture/ios/device_info_ios_objc.h" 16b0de73f515c79cc070f6321a78024cf0393b2036fischman@webrtc.org#include "webrtc/modules/video_capture/ios/rtc_video_capture_ios_objc.h" 17fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org#include "webrtc/system_wrappers/interface/ref_count.h" 18fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org#include "webrtc/system_wrappers/interface/scoped_refptr.h" 19fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org#include "webrtc/system_wrappers/interface/trace.h" 20fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org 21fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.orgusing namespace webrtc; 22fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.orgusing namespace videocapturemodule; 23fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org 24fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.orgVideoCaptureModule* VideoCaptureImpl::Create(const int32_t capture_id, 25fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org const char* deviceUniqueIdUTF8) { 26fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org return VideoCaptureIos::Create(capture_id, deviceUniqueIdUTF8); 27fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org} 28fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org 29fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.orgVideoCaptureIos::VideoCaptureIos(const int32_t capture_id) 30fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org : VideoCaptureImpl(capture_id), is_capturing_(false), id_(capture_id) { 31fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org capability_.width = kDefaultWidth; 32fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org capability_.height = kDefaultHeight; 33fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org capability_.maxFPS = kDefaultFrameRate; 34fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org} 35fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org 36fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.orgVideoCaptureIos::~VideoCaptureIos() { 3724224fc7d82146f4766cda7aaf37624818f38700fischman@webrtc.org if (is_capturing_) { 38fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org [capture_device_ stopCapture]; 39fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org } 40fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org} 41fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org 42fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.orgVideoCaptureModule* VideoCaptureIos::Create(const int32_t capture_id, 43fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org const char* deviceUniqueIdUTF8) { 44fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org if (!deviceUniqueIdUTF8[0]) { 45fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org return NULL; 46fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org } 47fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org 48fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org RefCountImpl<VideoCaptureIos>* capture_module = 49fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org new RefCountImpl<VideoCaptureIos>(capture_id); 50fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org 51fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org const int32_t name_length = strlen(deviceUniqueIdUTF8); 52fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org if (name_length > kVideoCaptureUniqueNameLength) 53fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org return NULL; 54fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org 55fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org capture_module->_deviceUniqueId = new char[name_length + 1]; 56fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org strncpy(capture_module->_deviceUniqueId, deviceUniqueIdUTF8, name_length + 1); 57fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org capture_module->_deviceUniqueId[name_length] = '\0'; 58fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org 59fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org capture_module->capture_device_ = 60b0de73f515c79cc070f6321a78024cf0393b2036fischman@webrtc.org [[RTCVideoCaptureIosObjC alloc] initWithOwner:capture_module 61b0de73f515c79cc070f6321a78024cf0393b2036fischman@webrtc.org captureId:capture_module->id_]; 62fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org if (!capture_module->capture_device_) { 63fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org return NULL; 64fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org } 65fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org 66fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org if (![capture_module->capture_device_ setCaptureDeviceByUniqueId:[ 67fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org [NSString alloc] initWithCString:deviceUniqueIdUTF8 68fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org encoding:NSUTF8StringEncoding]]) { 69fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org return NULL; 70fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org } 71fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org return capture_module; 72fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org} 73fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org 74fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.orgint32_t VideoCaptureIos::StartCapture( 75fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org const VideoCaptureCapability& capability) { 76fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org capability_ = capability; 77fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org 78fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org if (![capture_device_ startCaptureWithCapability:capability]) { 79fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org return -1; 80fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org } 81fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org 82fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org is_capturing_ = true; 83fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org 84fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org return 0; 85fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org} 86fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org 87fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.orgint32_t VideoCaptureIos::StopCapture() { 88fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org if (![capture_device_ stopCapture]) { 89fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org return -1; 90fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org } 91fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org 92fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org is_capturing_ = false; 93fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org return 0; 94fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org} 95fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org 96fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.orgbool VideoCaptureIos::CaptureStarted() { return is_capturing_; } 97fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org 98fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.orgint32_t VideoCaptureIos::CaptureSettings(VideoCaptureCapability& settings) { 99fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org settings = capability_; 100fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org settings.rawType = kVideoNV12; 101fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org return 0; 102fd6d89fe4ab5ff36c8eab9643af74bb7d7193d8csjlee@webrtc.org} 103