| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 }, | 41 }, |
| 42 }; | 42 }; |
| 43 | 43 |
| 44 // static | 44 // static |
| 45 DeviceInfoDS* DeviceInfoDS::Create() | 45 DeviceInfoDS* DeviceInfoDS::Create() |
| 46 { | 46 { |
| 47 DeviceInfoDS* dsInfo = new DeviceInfoDS(); | 47 DeviceInfoDS* dsInfo = new DeviceInfoDS(); |
| 48 if (!dsInfo || dsInfo->Init() != 0) | 48 if (!dsInfo || dsInfo->Init() != 0) |
| 49 { | 49 { |
| 50 delete dsInfo; | 50 delete dsInfo; |
| 51 dsInfo = NULL; | 51 dsInfo = nullptr; |
| 52 } | 52 } |
| 53 return dsInfo; | 53 return dsInfo; |
| 54 } | 54 } |
| 55 | 55 |
| 56 DeviceInfoDS::DeviceInfoDS() | 56 DeviceInfoDS::DeviceInfoDS() |
| 57 : _dsDevEnum(NULL), _dsMonikerDevEnum(NULL), | 57 : _dsDevEnum(nullptr), |
| 58 _CoUninitializeIsRequired(true) | 58 _dsMonikerDevEnum(nullptr), |
| 59 { | 59 _CoUninitializeIsRequired(true) { |
| 60 // 1) Initialize the COM library (make Windows load the DLLs). | 60 // 1) Initialize the COM library (make Windows load the DLLs). |
| 61 // | 61 // |
| 62 // CoInitializeEx must be called at least once, and is usually called only o
nce, | 62 // CoInitializeEx must be called at least once, and is usually called only |
| 63 // for each thread that uses the COM library. Multiple calls to CoInitialize
Ex | 63 // once, |
| 64 // by the same thread are allowed as long as they pass the same concurrency
flag, | 64 // for each thread that uses the COM library. Multiple calls to CoInitializeEx |
| 65 // but subsequent valid calls return S_FALSE. | 65 // by the same thread are allowed as long as they pass the same concurrency |
| 66 // To close the COM library gracefully on a thread, each successful call to | 66 // flag, |
| 67 // CoInitializeEx, including any call that returns S_FALSE, must be balanced | 67 // but subsequent valid calls return S_FALSE. |
| 68 // by a corresponding call to CoUninitialize. | 68 // To close the COM library gracefully on a thread, each successful call to |
| 69 // | 69 // CoInitializeEx, including any call that returns S_FALSE, must be balanced |
| 70 // by a corresponding call to CoUninitialize. |
| 71 // |
| 70 | 72 |
| 71 /*Apartment-threading, while allowing for multiple threads of execution, | 73 /*Apartment-threading, while allowing for multiple threads of execution, |
| 72 serializes all incoming calls by requiring that calls to methods of objects
created by this thread always run on the same thread | 74 serializes all incoming calls by requiring that calls to methods of objects |
| 73 the apartment/thread that created them. In addition, calls can arrive only
at message-queue boundaries (i.e., only during a | 75 created by this thread always run on the same thread |
| 74 PeekMessage, SendMessage, DispatchMessage, etc.). Because of this serializa
tion, it is not typically necessary to write concurrency control into | 76 the apartment/thread that created them. In addition, calls can arrive only at |
| 75 the code for the object, other than to avoid calls to PeekMessage and SendM
essage during processing that must not be interrupted by other method | 77 message-queue boundaries (i.e., only during a |
| 76 invocations or calls to other objects in the same apartment/thread.*/ | 78 PeekMessage, SendMessage, DispatchMessage, etc.). Because of this |
| 79 serialization, it is not typically necessary to write concurrency control |
| 80 into |
| 81 the code for the object, other than to avoid calls to PeekMessage and |
| 82 SendMessage during processing that must not be interrupted by other method |
| 83 invocations or calls to other objects in the same apartment/thread.*/ |
| 77 | 84 |
| 78 ///CoInitializeEx(NULL, COINIT_APARTMENTTHREADED ); //| COINIT_SPEED_OVER_ME
MORY | 85 /// CoInitializeEx(null, COINIT_APARTMENTTHREADED ); //| |
| 79 HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); // Use COINIT_MULTI
THREADED since Voice Engine uses COINIT_MULTITHREADED | 86 /// COINIT_SPEED_OVER_MEMORY |
| 80 if (FAILED(hr)) | 87 HRESULT hr = CoInitializeEx( |
| 81 { | 88 nullptr, COINIT_MULTITHREADED); // Use COINIT_MULTITHREADED since Voice |
| 82 // Avoid calling CoUninitialize() since CoInitializeEx() failed. | 89 // Engine uses COINIT_MULTITHREADED |
| 83 _CoUninitializeIsRequired = FALSE; | 90 if (FAILED(hr)) { |
| 91 // Avoid calling CoUninitialize() since CoInitializeEx() failed. |
| 92 _CoUninitializeIsRequired = FALSE; |
| 84 | 93 |
| 85 if (hr == RPC_E_CHANGED_MODE) | 94 if (hr == RPC_E_CHANGED_MODE) { |
| 86 { | 95 // Calling thread has already initialized COM to be used in a |
| 87 // Calling thread has already initialized COM to be used in a single
-threaded | 96 // single-threaded |
| 88 // apartment (STA). We are then prevented from using STA. | 97 // apartment (STA). We are then prevented from using STA. |
| 89 // Details: hr = 0x80010106 <=> "Cannot change thread mode after it
is set". | 98 // Details: hr = 0x80010106 <=> "Cannot change thread mode after it is |
| 90 // | 99 // set". |
| 91 WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceVideoCapture, 0, | 100 // |
| 92 "VideoCaptureWindowsDSInfo::VideoCaptureWindowsDSInfo " | 101 WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceVideoCapture, 0, |
| 93 "CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) => " | 102 "VideoCaptureWindowsDSInfo::VideoCaptureWindowsDSInfo " |
| 94 "RPC_E_CHANGED_MODE, error 0x%x", | 103 "CoInitializeEx(null, COINIT_APARTMENTTHREADED) => " |
| 95 hr); | 104 "RPC_E_CHANGED_MODE, error 0x%x", |
| 96 } | 105 hr); |
| 97 } | 106 } |
| 107 } |
| 98 } | 108 } |
| 99 | 109 |
| 100 DeviceInfoDS::~DeviceInfoDS() | 110 DeviceInfoDS::~DeviceInfoDS() |
| 101 { | 111 { |
| 102 RELEASE_AND_CLEAR(_dsMonikerDevEnum); | 112 RELEASE_AND_CLEAR(_dsMonikerDevEnum); |
| 103 RELEASE_AND_CLEAR(_dsDevEnum); | 113 RELEASE_AND_CLEAR(_dsDevEnum); |
| 104 if (_CoUninitializeIsRequired) | 114 if (_CoUninitializeIsRequired) |
| 105 { | 115 { |
| 106 CoUninitialize(); | 116 CoUninitialize(); |
| 107 } | 117 } |
| 108 } | 118 } |
| 109 | 119 |
| 110 int32_t DeviceInfoDS::Init() | 120 int32_t DeviceInfoDS::Init() |
| 111 { | 121 { |
| 112 HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, | 122 HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, nullptr, CLSCTX_INPROC, |
| 113 IID_ICreateDevEnum, (void **) &_dsDevEnum); | 123 IID_ICreateDevEnum, (void**)&_dsDevEnum); |
| 114 if (hr != NOERROR) | 124 if (hr != NOERROR) { |
| 115 { | 125 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, 0, |
| 116 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, 0, | 126 "Failed to create CLSID_SystemDeviceEnum, error 0x%x", hr); |
| 117 "Failed to create CLSID_SystemDeviceEnum, error 0x%x", hr); | 127 return -1; |
| 118 return -1; | |
| 119 } | 128 } |
| 120 return 0; | 129 return 0; |
| 121 } | 130 } |
| 122 uint32_t DeviceInfoDS::NumberOfDevices() | 131 uint32_t DeviceInfoDS::NumberOfDevices() |
| 123 { | 132 { |
| 124 ReadLockScoped cs(_apiLock); | 133 ReadLockScoped cs(_apiLock); |
| 125 return GetDeviceInfo(0, 0, 0, 0, 0, 0, 0); | 134 return GetDeviceInfo(0, 0, 0, 0, 0, 0, 0); |
| 126 } | 135 } |
| 127 | 136 |
| 128 int32_t DeviceInfoDS::GetDeviceName( | 137 int32_t DeviceInfoDS::GetDeviceName( |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 VARIANT varName; | 191 VARIANT varName; |
| 183 VariantInit(&varName); | 192 VariantInit(&varName); |
| 184 hr = pBag->Read(L"Description", &varName, 0); | 193 hr = pBag->Read(L"Description", &varName, 0); |
| 185 if (FAILED(hr)) | 194 if (FAILED(hr)) |
| 186 { | 195 { |
| 187 hr = pBag->Read(L"FriendlyName", &varName, 0); | 196 hr = pBag->Read(L"FriendlyName", &varName, 0); |
| 188 } | 197 } |
| 189 if (SUCCEEDED(hr)) | 198 if (SUCCEEDED(hr)) |
| 190 { | 199 { |
| 191 // ignore all VFW drivers | 200 // ignore all VFW drivers |
| 192 if ((wcsstr(varName.bstrVal, (L"(VFW)")) == NULL) && | 201 if ((wcsstr(varName.bstrVal, (L"(VFW)")) == nullptr) && |
| 193 (_wcsnicmp(varName.bstrVal, (L"Google Camera Adapter"),21) | 202 (_wcsnicmp(varName.bstrVal, (L"Google Camera Adapter"), |
| 194 != 0)) | 203 21) != 0)) { |
| 195 { | 204 // Found a valid device. |
| 196 // Found a valid device. | 205 if (index == static_cast<int>(deviceNumber)) { |
| 197 if (index == static_cast<int>(deviceNumber)) | 206 int convResult = 0; |
| 198 { | 207 if (deviceNameLength > 0) { |
| 199 int convResult = 0; | 208 convResult = WideCharToMultiByte( |
| 200 if (deviceNameLength > 0) | 209 CP_UTF8, 0, varName.bstrVal, -1, |
| 201 { | 210 (char*)deviceNameUTF8, deviceNameLength, nullptr, |
| 202 convResult = WideCharToMultiByte(CP_UTF8, 0, | 211 nullptr); |
| 203 varName.bstrVal, -1
, | 212 if (convResult == 0) { |
| 204 (char*) deviceNameU
TF8, | 213 WEBRTC_TRACE( |
| 205 deviceNameLength, N
ULL, | 214 webrtc::kTraceError, webrtc::kTraceVideoCapture, 0, |
| 206 NULL); | 215 "Failed to convert device name to UTF8. %d", |
| 207 if (convResult == 0) | 216 GetLastError()); |
| 208 { | 217 return -1; |
| 209 WEBRTC_TRACE(webrtc::kTraceError, | 218 } |
| 210 webrtc::kTraceVideoCapture, 0, | 219 } |
| 211 "Failed to convert device name to U
TF8. %d", | 220 if (deviceUniqueIdUTF8Length > 0) { |
| 212 GetLastError()); | 221 hr = pBag->Read(L"DevicePath", &varName, 0); |
| 213 return -1; | 222 if (FAILED(hr)) { |
| 214 } | 223 strncpy_s((char*)deviceUniqueIdUTF8, |
| 224 deviceUniqueIdUTF8Length, |
| 225 (char*)deviceNameUTF8, convResult); |
| 226 WEBRTC_TRACE(webrtc::kTraceError, |
| 227 webrtc::kTraceVideoCapture, 0, |
| 228 "Failed to get deviceUniqueIdUTF8 using " |
| 229 "deviceNameUTF8"); |
| 230 } else { |
| 231 convResult = WideCharToMultiByte( |
| 232 CP_UTF8, 0, varName.bstrVal, -1, |
| 233 (char*)deviceUniqueIdUTF8, deviceUniqueIdUTF8Length, |
| 234 nullptr, nullptr); |
| 235 if (convResult == 0) { |
| 236 WEBRTC_TRACE( |
| 237 webrtc::kTraceError, webrtc::kTraceVideoCapture, |
| 238 0, "Failed to convert device name to UTF8. %d", |
| 239 GetLastError()); |
| 240 return -1; |
| 215 } | 241 } |
| 216 if (deviceUniqueIdUTF8Length > 0) | 242 if (productUniqueIdUTF8 && |
| 217 { | 243 productUniqueIdUTF8Length > 0) { |
| 218 hr = pBag->Read(L"DevicePath", &varName, 0); | 244 GetProductId(deviceUniqueIdUTF8, productUniqueIdUTF8, |
| 219 if (FAILED(hr)) | 245 productUniqueIdUTF8Length); |
| 220 { | |
| 221 strncpy_s((char *) deviceUniqueIdUTF8, | |
| 222 deviceUniqueIdUTF8Length, | |
| 223 (char *) deviceNameUTF8, convResult); | |
| 224 WEBRTC_TRACE(webrtc::kTraceError, | |
| 225 webrtc::kTraceVideoCapture, 0, | |
| 226 "Failed to get deviceUniqueIdUTF8 u
sing deviceNameUTF8"); | |
| 227 } | |
| 228 else | |
| 229 { | |
| 230 convResult = WideCharToMultiByte( | |
| 231 CP_UTF8, | |
| 232 0, | |
| 233 varName.bstrVal, | |
| 234 -1, | |
| 235 (char*) deviceUniqueId
UTF8, | |
| 236 deviceUniqueIdUTF8Leng
th, | |
| 237 NULL, NULL); | |
| 238 if (convResult == 0) | |
| 239 { | |
| 240 WEBRTC_TRACE(webrtc::kTraceError, | |
| 241 webrtc::kTraceVideoCapture, 0, | |
| 242 "Failed to convert device name
to UTF8. %d", | |
| 243 GetLastError()); | |
| 244 return -1; | |
| 245 } | |
| 246 if (productUniqueIdUTF8 | |
| 247 && productUniqueIdUTF8Length > 0) | |
| 248 { | |
| 249 GetProductId(deviceUniqueIdUTF8, | |
| 250 productUniqueIdUTF8, | |
| 251 productUniqueIdUTF8Length); | |
| 252 } | |
| 253 } | |
| 254 } | 246 } |
| 255 | 247 } |
| 256 } | 248 } |
| 257 ++index; // increase the number of valid devices | 249 } |
| 250 ++index; // increase the number of valid devices |
| 258 } | 251 } |
| 259 } | 252 } |
| 260 VariantClear(&varName); | 253 VariantClear(&varName); |
| 261 pBag->Release(); | 254 pBag->Release(); |
| 262 pM->Release(); | 255 pM->Release(); |
| 263 } | 256 } |
| 264 | 257 |
| 265 } | 258 } |
| 266 if (deviceNameLength) | 259 if (deviceNameLength) |
| 267 { | 260 { |
| 268 WEBRTC_TRACE(webrtc::kTraceDebug, | 261 WEBRTC_TRACE(webrtc::kTraceDebug, |
| 269 webrtc::kTraceVideoCapture, 0, "%s %s", | 262 webrtc::kTraceVideoCapture, 0, "%s %s", |
| 270 __FUNCTION__, deviceNameUTF8); | 263 __FUNCTION__, deviceNameUTF8); |
| 271 } | 264 } |
| 272 return index; | 265 return index; |
| 273 } | 266 } |
| 274 | 267 |
| 275 IBaseFilter * DeviceInfoDS::GetDeviceFilter( | 268 IBaseFilter * DeviceInfoDS::GetDeviceFilter( |
| 276 const char* deviceUniqueIdUTF8, | 269 const char* deviceUniqueIdUTF8, |
| 277 char* productUniqueIdUTF8, | 270 char* productUniqueIdUTF8, |
| 278 uint32_t productUniqueIdUTF8Length) | 271 uint32_t productUniqueIdUTF8Length) |
| 279 { | 272 { |
| 280 | 273 const int32_t deviceUniqueIdUTF8Length = (int32_t)strlen( |
| 281 const int32_t deviceUniqueIdUTF8Length = | 274 (char*)deviceUniqueIdUTF8); // UTF8 is also nullptr terminated |
| 282 (int32_t) strlen((char*) deviceUniqueIdUTF8); // UTF8 is also NULL termi
nated | 275 if (deviceUniqueIdUTF8Length > kVideoCaptureUniqueNameLength) { |
| 283 if (deviceUniqueIdUTF8Length > kVideoCaptureUniqueNameLength) | 276 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, 0, |
| 284 { | 277 "Device name too long"); |
| 285 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, 0, | 278 return nullptr; |
| 286 "Device name too long"); | |
| 287 return NULL; | |
| 288 } | 279 } |
| 289 | 280 |
| 290 // enumerate all video capture devices | 281 // enumerate all video capture devices |
| 291 RELEASE_AND_CLEAR(_dsMonikerDevEnum); | 282 RELEASE_AND_CLEAR(_dsMonikerDevEnum); |
| 292 HRESULT hr = _dsDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategor
y, | 283 HRESULT hr = _dsDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategor
y, |
| 293 &_dsMonikerDevEnum, 0); | 284 &_dsMonikerDevEnum, 0); |
| 294 if (hr != NOERROR) | 285 if (hr != NOERROR) |
| 295 { | 286 { |
| 296 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, 0, | 287 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, 0, |
| 297 "Failed to enumerate CLSID_SystemDeviceEnum, error 0x%x." | 288 "Failed to enumerate CLSID_SystemDeviceEnum, error 0x%x." |
| 298 " No webcam exist?", hr); | 289 " No webcam exist?", hr); |
| 299 return 0; | 290 return 0; |
| 300 } | 291 } |
| 301 _dsMonikerDevEnum->Reset(); | 292 _dsMonikerDevEnum->Reset(); |
| 302 ULONG cFetched; | 293 ULONG cFetched; |
| 303 IMoniker *pM; | 294 IMoniker *pM; |
| 304 | 295 |
| 305 IBaseFilter *captureFilter = NULL; | 296 IBaseFilter* captureFilter = nullptr; |
| 306 bool deviceFound = false; | 297 bool deviceFound = false; |
| 307 while (S_OK == _dsMonikerDevEnum->Next(1, &pM, &cFetched) && !deviceFound) | 298 while (S_OK == _dsMonikerDevEnum->Next(1, &pM, &cFetched) && !deviceFound) |
| 308 { | 299 { |
| 309 IPropertyBag *pBag; | 300 IPropertyBag *pBag; |
| 310 hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **) &pBag); | 301 hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **) &pBag); |
| 311 if (S_OK == hr) | 302 if (S_OK == hr) |
| 312 { | 303 { |
| 313 // Find the description or friendly name. | 304 // Find the description or friendly name. |
| 314 VARIANT varName; | 305 VARIANT varName; |
| 315 VariantInit(&varName); | 306 VariantInit(&varName); |
| 316 if (deviceUniqueIdUTF8Length > 0) | 307 if (deviceUniqueIdUTF8Length > 0) |
| 317 { | 308 { |
| 318 hr = pBag->Read(L"DevicePath", &varName, 0); | 309 hr = pBag->Read(L"DevicePath", &varName, 0); |
| 319 if (FAILED(hr)) | 310 if (FAILED(hr)) |
| 320 { | 311 { |
| 321 hr = pBag->Read(L"Description", &varName, 0); | 312 hr = pBag->Read(L"Description", &varName, 0); |
| 322 if (FAILED(hr)) | 313 if (FAILED(hr)) |
| 323 { | 314 { |
| 324 hr = pBag->Read(L"FriendlyName", &varName, 0); | 315 hr = pBag->Read(L"FriendlyName", &varName, 0); |
| 325 } | 316 } |
| 326 } | 317 } |
| 327 if (SUCCEEDED(hr)) | 318 if (SUCCEEDED(hr)) |
| 328 { | 319 { |
| 329 char tempDevicePathUTF8[256]; | 320 char tempDevicePathUTF8[256]; |
| 330 tempDevicePathUTF8[0] = 0; | 321 tempDevicePathUTF8[0] = 0; |
| 331 WideCharToMultiByte(CP_UTF8, 0, varName.bstrVal, -1, | 322 WideCharToMultiByte( |
| 332 tempDevicePathUTF8, | 323 CP_UTF8, 0, varName.bstrVal, -1, tempDevicePathUTF8, |
| 333 sizeof(tempDevicePathUTF8), NULL, | 324 sizeof(tempDevicePathUTF8), nullptr, nullptr); |
| 334 NULL); | |
| 335 if (strncmp(tempDevicePathUTF8, | 325 if (strncmp(tempDevicePathUTF8, |
| 336 (const char*) deviceUniqueIdUTF8, | 326 (const char*) deviceUniqueIdUTF8, |
| 337 deviceUniqueIdUTF8Length) == 0) | 327 deviceUniqueIdUTF8Length) == 0) |
| 338 { | 328 { |
| 339 // We have found the requested device | 329 // We have found the requested device |
| 340 deviceFound = true; | 330 deviceFound = true; |
| 341 hr = pM->BindToObject(0, 0, IID_IBaseFilter, | 331 hr = pM->BindToObject(0, 0, IID_IBaseFilter, |
| 342 (void**) &captureFilter); | 332 (void**) &captureFilter); |
| 343 if FAILED(hr) | 333 if FAILED(hr) |
| 344 { | 334 { |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 409 if (!captureDevice) | 399 if (!captureDevice) |
| 410 return -1; | 400 return -1; |
| 411 IPin* outputCapturePin = GetOutputPin(captureDevice, GUID_NULL); | 401 IPin* outputCapturePin = GetOutputPin(captureDevice, GUID_NULL); |
| 412 if (!outputCapturePin) | 402 if (!outputCapturePin) |
| 413 { | 403 { |
| 414 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, 0, | 404 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, 0, |
| 415 "Failed to get capture device output pin"); | 405 "Failed to get capture device output pin"); |
| 416 RELEASE_AND_CLEAR(captureDevice); | 406 RELEASE_AND_CLEAR(captureDevice); |
| 417 return -1; | 407 return -1; |
| 418 } | 408 } |
| 419 IAMExtDevice* extDevice = NULL; | 409 IAMExtDevice* extDevice = nullptr; |
| 420 HRESULT hr = captureDevice->QueryInterface(IID_IAMExtDevice, | 410 HRESULT hr = captureDevice->QueryInterface(IID_IAMExtDevice, |
| 421 (void **) &extDevice); | 411 (void **) &extDevice); |
| 422 if (SUCCEEDED(hr) && extDevice) | 412 if (SUCCEEDED(hr) && extDevice) |
| 423 { | 413 { |
| 424 WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, 0, | 414 WEBRTC_TRACE(webrtc::kTraceInfo, webrtc::kTraceVideoCapture, 0, |
| 425 "This is an external device"); | 415 "This is an external device"); |
| 426 extDevice->Release(); | 416 extDevice->Release(); |
| 427 } | 417 } |
| 428 | 418 |
| 429 IAMStreamConfig* streamConfig = NULL; | 419 IAMStreamConfig* streamConfig = nullptr; |
| 430 hr = outputCapturePin->QueryInterface(IID_IAMStreamConfig, | 420 hr = outputCapturePin->QueryInterface(IID_IAMStreamConfig, |
| 431 (void**) &streamConfig); | 421 (void**) &streamConfig); |
| 432 if (FAILED(hr)) | 422 if (FAILED(hr)) |
| 433 { | 423 { |
| 434 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, 0, | 424 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, 0, |
| 435 "Failed to get IID_IAMStreamConfig interface from capture d
evice"); | 425 "Failed to get IID_IAMStreamConfig interface from capture d
evice"); |
| 436 return -1; | 426 return -1; |
| 437 } | 427 } |
| 438 | 428 |
| 439 // this gets the FPS | 429 // this gets the FPS |
| 440 IAMVideoControl* videoControlConfig = NULL; | 430 IAMVideoControl* videoControlConfig = nullptr; |
| 441 HRESULT hrVC = captureDevice->QueryInterface(IID_IAMVideoControl, | 431 HRESULT hrVC = captureDevice->QueryInterface(IID_IAMVideoControl, |
| 442 (void**) &videoControlConfig); | 432 (void**) &videoControlConfig); |
| 443 if (FAILED(hrVC)) | 433 if (FAILED(hrVC)) |
| 444 { | 434 { |
| 445 WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceVideoCapture, 0, | 435 WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceVideoCapture, 0, |
| 446 "IID_IAMVideoControl Interface NOT SUPPORTED"); | 436 "IID_IAMVideoControl Interface NOT SUPPORTED"); |
| 447 } | 437 } |
| 448 | 438 |
| 449 AM_MEDIA_TYPE *pmt = NULL; | 439 AM_MEDIA_TYPE* pmt = nullptr; |
| 450 VIDEO_STREAM_CONFIG_CAPS caps; | 440 VIDEO_STREAM_CONFIG_CAPS caps; |
| 451 int count, size; | 441 int count, size; |
| 452 | 442 |
| 453 hr = streamConfig->GetNumberOfCapabilities(&count, &size); | 443 hr = streamConfig->GetNumberOfCapabilities(&count, &size); |
| 454 if (FAILED(hr)) | 444 if (FAILED(hr)) |
| 455 { | 445 { |
| 456 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, 0, | 446 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, 0, |
| 457 "Failed to GetNumberOfCapabilities"); | 447 "Failed to GetNumberOfCapabilities"); |
| 458 RELEASE_AND_CLEAR(videoControlConfig); | 448 RELEASE_AND_CLEAR(videoControlConfig); |
| 459 RELEASE_AND_CLEAR(streamConfig); | 449 RELEASE_AND_CLEAR(streamConfig); |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 666 capability.width, | 656 capability.width, |
| 667 capability.height); | 657 capability.height); |
| 668 _captureCapabilities.push_back(capability); | 658 _captureCapabilities.push_back(capability); |
| 669 _captureCapabilitiesWindows.push_back(capability); | 659 _captureCapabilitiesWindows.push_back(capability); |
| 670 WEBRTC_TRACE( webrtc::kTraceInfo, webrtc::kTraceVideoCapture, 0, | 660 WEBRTC_TRACE( webrtc::kTraceInfo, webrtc::kTraceVideoCapture, 0, |
| 671 "Camera capability, width:%d height:%d type:%d fps:%d", | 661 "Camera capability, width:%d height:%d type:%d fps:%d", |
| 672 capability.width, capability.height, | 662 capability.width, capability.height, |
| 673 capability.rawType, capability.maxFPS); | 663 capability.rawType, capability.maxFPS); |
| 674 } | 664 } |
| 675 DeleteMediaType(pmt); | 665 DeleteMediaType(pmt); |
| 676 pmt = NULL; | 666 pmt = nullptr; |
| 677 } | 667 } |
| 678 RELEASE_AND_CLEAR(streamConfig); | 668 RELEASE_AND_CLEAR(streamConfig); |
| 679 RELEASE_AND_CLEAR(videoControlConfig); | 669 RELEASE_AND_CLEAR(videoControlConfig); |
| 680 RELEASE_AND_CLEAR(outputCapturePin); | 670 RELEASE_AND_CLEAR(outputCapturePin); |
| 681 RELEASE_AND_CLEAR(captureDevice); // Release the capture device | 671 RELEASE_AND_CLEAR(captureDevice); // Release the capture device |
| 682 | 672 |
| 683 // Store the new used device name | 673 // Store the new used device name |
| 684 _lastUsedDeviceNameLength = deviceUniqueIdUTF8Length; | 674 _lastUsedDeviceNameLength = deviceUniqueIdUTF8Length; |
| 685 _lastUsedDeviceName = (char*) realloc(_lastUsedDeviceName, | 675 _lastUsedDeviceName = (char*) realloc(_lastUsedDeviceName, |
| 686 _lastUsedDeviceNameLength | 676 _lastUsedDeviceNameLength |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 741 int32_t DeviceInfoDS::DisplayCaptureSettingsDialogBox( | 731 int32_t DeviceInfoDS::DisplayCaptureSettingsDialogBox( |
| 742 const char* deviceUniqueIdUTF8, | 732 const char* deviceUniqueIdUTF8, |
| 743 const char* dialogTitleUTF8, | 733 const char* dialogTitleUTF8, |
| 744 void* parentWindow, | 734 void* parentWindow, |
| 745 uint32_t positionX, | 735 uint32_t positionX, |
| 746 uint32_t positionY) | 736 uint32_t positionY) |
| 747 { | 737 { |
| 748 ReadLockScoped cs(_apiLock); | 738 ReadLockScoped cs(_apiLock); |
| 749 HWND window = (HWND) parentWindow; | 739 HWND window = (HWND) parentWindow; |
| 750 | 740 |
| 751 IBaseFilter* filter = GetDeviceFilter(deviceUniqueIdUTF8, NULL, 0); | 741 IBaseFilter* filter = GetDeviceFilter(deviceUniqueIdUTF8, nullptr, 0); |
| 752 if (!filter) | 742 if (!filter) |
| 753 return -1; | 743 return -1; |
| 754 | 744 |
| 755 ISpecifyPropertyPages* pPages = NULL; | 745 ISpecifyPropertyPages* pPages = nullptr; |
| 756 CAUUID uuid; | 746 CAUUID uuid; |
| 757 HRESULT hr = S_OK; | 747 HRESULT hr = S_OK; |
| 758 | 748 |
| 759 hr = filter->QueryInterface(IID_ISpecifyPropertyPages, (LPVOID*) &pPages); | 749 hr = filter->QueryInterface(IID_ISpecifyPropertyPages, (LPVOID*) &pPages); |
| 760 if (!SUCCEEDED(hr)) | 750 if (!SUCCEEDED(hr)) |
| 761 { | 751 { |
| 762 filter->Release(); | 752 filter->Release(); |
| 763 return -1; | 753 return -1; |
| 764 } | 754 } |
| 765 hr = pPages->GetPages(&uuid); | 755 hr = pPages->GetPages(&uuid); |
| 766 if (!SUCCEEDED(hr)) | 756 if (!SUCCEEDED(hr)) |
| 767 { | 757 { |
| 768 filter->Release(); | 758 filter->Release(); |
| 769 return -1; | 759 return -1; |
| 770 } | 760 } |
| 771 | 761 |
| 772 WCHAR tempDialogTitleWide[256]; | 762 WCHAR tempDialogTitleWide[256]; |
| 773 tempDialogTitleWide[0] = 0; | 763 tempDialogTitleWide[0] = 0; |
| 774 int size = 255; | 764 int size = 255; |
| 775 | 765 |
| 776 // UTF-8 to wide char | 766 // UTF-8 to wide char |
| 777 MultiByteToWideChar(CP_UTF8, 0, (char*) dialogTitleUTF8, -1, | 767 MultiByteToWideChar(CP_UTF8, 0, (char*) dialogTitleUTF8, -1, |
| 778 tempDialogTitleWide, size); | 768 tempDialogTitleWide, size); |
| 779 | 769 |
| 780 // Invoke a dialog box to display. | 770 // Invoke a dialog box to display. |
| 781 | 771 |
| 782 hr = OleCreatePropertyFrame(window, // You must create the parent window. | 772 hr = OleCreatePropertyFrame( |
| 783 positionX, // Horizontal position for the dialog
box. | 773 window, // You must create the parent window. |
| 784 positionY, // Vertical position for the dialog b
ox. | 774 positionX, // Horizontal position for the dialog box. |
| 785 tempDialogTitleWide,// String used for the dialo
g box caption. | 775 positionY, // Vertical position for the dialog box. |
| 786 1, // Number of pointers passed in pPlugin. | 776 tempDialogTitleWide, // String used for the dialog box caption. |
| 787 (LPUNKNOWN*) &filter, // Pointer to the filter. | 777 1, // Number of pointers passed in pPlugin. |
| 788 uuid.cElems, // Number of property pages. | 778 (LPUNKNOWN*)&filter, // Pointer to the filter. |
| 789 uuid.pElems, // Array of property page CLSIDs. | 779 uuid.cElems, // Number of property pages. |
| 790 LOCALE_USER_DEFAULT, // Locale ID for the dialog
box. | 780 uuid.pElems, // Array of property page CLSIDs. |
| 791 0, NULL); // Reserved | 781 LOCALE_USER_DEFAULT, // Locale ID for the dialog box. |
| 782 0, nullptr); // Reserved |
| 792 // Release memory. | 783 // Release memory. |
| 793 if (uuid.pElems) | 784 if (uuid.pElems) |
| 794 { | 785 { |
| 795 CoTaskMemFree(uuid.pElems); | 786 CoTaskMemFree(uuid.pElems); |
| 796 } | 787 } |
| 797 filter->Release(); | 788 filter->Release(); |
| 798 return 0; | 789 return 0; |
| 799 } | 790 } |
| 800 } // namespace videocapturemodule | 791 } // namespace videocapturemodule |
| 801 } // namespace webrtc | 792 } // namespace webrtc |
| OLD | NEW |