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