| 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 | 
|---|