OLD | NEW |
(Empty) | |
| 1 /* |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
| 3 * |
| 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ |
| 10 |
| 11 #include "webrtc/modules/video_capture/mac/qtkit/video_capture_qtkit.h" |
| 12 #import "webrtc/modules/video_capture/mac/qtkit/video_capture_qtkit_info_objc.h" |
| 13 #import "webrtc/modules/video_capture/mac/qtkit/video_capture_qtkit_objc.h" |
| 14 #include "webrtc/modules/video_capture/video_capture_config.h" |
| 15 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
| 16 #include "webrtc/system_wrappers/include/trace.h" |
| 17 |
| 18 namespace webrtc |
| 19 { |
| 20 |
| 21 namespace videocapturemodule |
| 22 { |
| 23 |
| 24 VideoCaptureMacQTKit::VideoCaptureMacQTKit(const int32_t id) : |
| 25 VideoCaptureImpl(id), |
| 26 _captureDevice(NULL), |
| 27 _captureInfo(NULL), |
| 28 _isCapturing(false), |
| 29 _id(id), |
| 30 _captureWidth(QTKIT_DEFAULT_WIDTH), |
| 31 _captureHeight(QTKIT_DEFAULT_HEIGHT), |
| 32 _captureFrameRate(QTKIT_DEFAULT_FRAME_RATE), |
| 33 _frameCount(0) |
| 34 { |
| 35 |
| 36 memset(_currentDeviceNameUTF8, 0, MAX_NAME_LENGTH); |
| 37 memset(_currentDeviceUniqueIdUTF8, 0, MAX_NAME_LENGTH); |
| 38 memset(_currentDeviceProductUniqueIDUTF8, 0, MAX_NAME_LENGTH); |
| 39 } |
| 40 |
| 41 VideoCaptureMacQTKit::~VideoCaptureMacQTKit() |
| 42 { |
| 43 |
| 44 WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCapture, _id, |
| 45 "~VideoCaptureMacQTKit() called"); |
| 46 if(_captureDevice) |
| 47 { |
| 48 [_captureDevice registerOwner:nil]; |
| 49 [_captureDevice stopCapture]; |
| 50 [_captureDevice release]; |
| 51 } |
| 52 |
| 53 if(_captureInfo) |
| 54 { |
| 55 [_captureInfo release]; |
| 56 } |
| 57 } |
| 58 |
| 59 int32_t VideoCaptureMacQTKit::Init( |
| 60 const int32_t id, const char* iDeviceUniqueIdUTF8) |
| 61 { |
| 62 CriticalSectionScoped cs(&_apiCs); |
| 63 |
| 64 |
| 65 const int32_t nameLength = |
| 66 (int32_t) strlen((char*)iDeviceUniqueIdUTF8); |
| 67 if(nameLength>kVideoCaptureUniqueNameLength) |
| 68 return -1; |
| 69 |
| 70 // Store the device name |
| 71 _deviceUniqueId = new char[nameLength+1]; |
| 72 memcpy(_deviceUniqueId, iDeviceUniqueIdUTF8,nameLength+1); |
| 73 |
| 74 _captureDevice = [[VideoCaptureMacQTKitObjC alloc] init]; |
| 75 if(NULL == _captureDevice) |
| 76 { |
| 77 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, id, |
| 78 "Failed to create an instance of " |
| 79 "VideoCaptureMacQTKitObjC"); |
| 80 return -1; |
| 81 } |
| 82 |
| 83 [_captureDevice registerOwner:this]; |
| 84 |
| 85 if(0 == strcmp((char*)iDeviceUniqueIdUTF8, "")) |
| 86 { |
| 87 // the user doesn't want to set a capture device at this time |
| 88 return 0; |
| 89 } |
| 90 |
| 91 _captureInfo = [[VideoCaptureMacQTKitInfoObjC alloc]init]; |
| 92 if(nil == _captureInfo) |
| 93 { |
| 94 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, id, |
| 95 "Failed to create an instance of VideoCaptureMacQTKitInfoObjC"); |
| 96 return -1; |
| 97 } |
| 98 |
| 99 int captureDeviceCount = [[_captureInfo getCaptureDeviceCount]intValue]; |
| 100 if(captureDeviceCount < 0) |
| 101 { |
| 102 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, id, |
| 103 "No Capture Devices Present"); |
| 104 return -1; |
| 105 } |
| 106 |
| 107 const int NAME_LENGTH = 1024; |
| 108 char deviceNameUTF8[1024] = ""; |
| 109 char deviceUniqueIdUTF8[1024] = ""; |
| 110 char deviceProductUniqueIDUTF8[1024] = ""; |
| 111 |
| 112 bool captureDeviceFound = false; |
| 113 for(int index = 0; index < captureDeviceCount; index++){ |
| 114 |
| 115 memset(deviceNameUTF8, 0, NAME_LENGTH); |
| 116 memset(deviceUniqueIdUTF8, 0, NAME_LENGTH); |
| 117 memset(deviceProductUniqueIDUTF8, 0, NAME_LENGTH); |
| 118 if(-1 == [[_captureInfo getDeviceNamesFromIndex:index |
| 119 DefaultName:deviceNameUTF8 WithLength:NAME_LENGTH |
| 120 AndUniqueID:deviceUniqueIdUTF8 WithLength:NAME_LENGTH |
| 121 AndProductID:deviceProductUniqueIDUTF8 |
| 122 WithLength:NAME_LENGTH]intValue]) |
| 123 { |
| 124 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id, |
| 125 "GetDeviceName returned -1 for index %d", index); |
| 126 return -1; |
| 127 } |
| 128 if(0 == strcmp((const char*)iDeviceUniqueIdUTF8, |
| 129 (char*)deviceUniqueIdUTF8)) |
| 130 { |
| 131 // we have a match |
| 132 captureDeviceFound = true; |
| 133 break; |
| 134 } |
| 135 } |
| 136 |
| 137 if(false == captureDeviceFound) |
| 138 { |
| 139 WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, _id, |
| 140 "Failed to find capture device unique ID %s", |
| 141 iDeviceUniqueIdUTF8); |
| 142 return -1; |
| 143 } |
| 144 |
| 145 // at this point we know that the user has passed in a valid camera. Let's |
| 146 // set it as the current. |
| 147 if(![_captureDevice setCaptureDeviceById:(char*)deviceUniqueIdUTF8]) |
| 148 { |
| 149 strcpy((char*)_deviceUniqueId, (char*)deviceUniqueIdUTF8); |
| 150 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id, |
| 151 "Failed to set capture device %s (unique ID %s) even " |
| 152 "though it was a valid return from " |
| 153 "VideoCaptureMacQTKitInfo", deviceNameUTF8, |
| 154 iDeviceUniqueIdUTF8); |
| 155 return -1; |
| 156 } |
| 157 |
| 158 WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, _id, |
| 159 "successfully Init VideoCaptureMacQTKit" ); |
| 160 return 0; |
| 161 } |
| 162 |
| 163 int32_t VideoCaptureMacQTKit::StartCapture( |
| 164 const VideoCaptureCapability& capability) |
| 165 { |
| 166 |
| 167 _captureWidth = capability.width; |
| 168 _captureHeight = capability.height; |
| 169 _captureFrameRate = capability.maxFPS; |
| 170 _captureDelay = 120; |
| 171 |
| 172 [_captureDevice setCaptureHeight:_captureHeight |
| 173 width:_captureWidth |
| 174 frameRate:_captureFrameRate]; |
| 175 |
| 176 [_captureDevice startCapture]; |
| 177 _isCapturing = true; |
| 178 return 0; |
| 179 } |
| 180 |
| 181 int32_t VideoCaptureMacQTKit::StopCapture() |
| 182 { |
| 183 [_captureDevice stopCapture]; |
| 184 _isCapturing = false; |
| 185 return 0; |
| 186 } |
| 187 |
| 188 bool VideoCaptureMacQTKit::CaptureStarted() |
| 189 { |
| 190 return _isCapturing; |
| 191 } |
| 192 |
| 193 int32_t VideoCaptureMacQTKit::CaptureSettings(VideoCaptureCapability& settings) |
| 194 { |
| 195 settings.width = _captureWidth; |
| 196 settings.height = _captureHeight; |
| 197 settings.maxFPS = _captureFrameRate; |
| 198 return 0; |
| 199 } |
| 200 |
| 201 |
| 202 // ********** begin functions inherited from DeviceInfoImpl ********** |
| 203 |
| 204 struct VideoCaptureCapabilityMacQTKit:public VideoCaptureCapability |
| 205 { |
| 206 VideoCaptureCapabilityMacQTKit() |
| 207 { |
| 208 } |
| 209 }; |
| 210 } // namespace videocapturemodule |
| 211 } // namespace webrtc |
OLD | NEW |