OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/video/capture/win/video_capture_device_factory_win.h" | 5 #include "media/video/capture/win/video_capture_device_factory_win.h" |
6 | 6 |
7 #include <mfapi.h> | 7 #include <mfapi.h> |
8 #include <mferror.h> | 8 #include <mferror.h> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
215 return; | 215 return; |
216 | 216 |
217 ScopedComPtr<IEnumMoniker> enum_moniker; | 217 ScopedComPtr<IEnumMoniker> enum_moniker; |
218 hr = dev_enum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, | 218 hr = dev_enum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, |
219 enum_moniker.Receive(), 0); | 219 enum_moniker.Receive(), 0); |
220 // CreateClassEnumerator returns S_FALSE on some Windows OS when no camera | 220 // CreateClassEnumerator returns S_FALSE on some Windows OS when no camera |
221 // exists. Therefore the FAILED macro can't be used. | 221 // exists. Therefore the FAILED macro can't be used. |
222 if (hr != S_OK) | 222 if (hr != S_OK) |
223 return; | 223 return; |
224 | 224 |
225 // Walk the capture devices. No need to check for device presence again, that | 225 // Walk the capture devices. No need to check for device presence again since |
226 // is caught in GetDeviceFilter(). "google camera adapter" and old VFW devices | 226 // that is anyway needed in GetDeviceFilter(). "google camera adapter" and old |
227 // are already skipped in the previous GetDeviceNames() enumeration. | 227 // VFW devices are already skipped previously in GetDeviceNames() enumeration. |
228 base::win::ScopedComPtr<IBaseFilter> capture_filter; | 228 base::win::ScopedComPtr<IBaseFilter> capture_filter; |
229 hr = VideoCaptureDeviceWin::GetDeviceFilter(device, | 229 if (device.capture_api_type() == Name::DIRECT_SHOW_WDM) { |
230 capture_filter.Receive()); | 230 // Find the "normal" DirectShow device corresponding to the WDM device by |
231 // comparing USB IDs. | |
232 // TODO(mcasas): USB ID comparison won't work with PCIe capture cards. | |
233 Names device_names; | |
234 GetDeviceNamesDirectShow(&device_names); | |
235 const std::string current_device_model = device.GetModel(); | |
236 for (Names::const_iterator iter = device_names.begin(); | |
237 iter != device_names.end(); ++iter) { | |
238 if ((iter->GetModel().compare(current_device_model) == 0) && | |
239 (iter->capture_api_type() == Name::DIRECT_SHOW)) { | |
240 DVLOG(1) << "Enumerating formats for a WDM device."; | |
241 hr = VideoCaptureDeviceWin::GetDeviceFilter(*iter, | |
perkj_chrome
2014/09/01 09:57:43
GetDeviceFilter need the correct Name::id. So why
| |
242 capture_filter.Receive()); | |
243 break; | |
244 } | |
245 } | |
246 } else { | |
247 hr = VideoCaptureDeviceWin::GetDeviceFilter(device, | |
248 capture_filter.Receive()); | |
249 } | |
231 if (!capture_filter) { | 250 if (!capture_filter) { |
232 DVLOG(2) << "Failed to create capture filter."; | 251 DVLOG(2) << "Failed to create capture filter."; |
233 return; | 252 return; |
234 } | 253 } |
235 | 254 |
236 base::win::ScopedComPtr<IPin> output_capture_pin( | 255 base::win::ScopedComPtr<IPin> output_capture_pin( |
237 VideoCaptureDeviceWin::GetPin(capture_filter, | 256 VideoCaptureDeviceWin::GetPin(capture_filter, |
238 PINDIR_OUTPUT, | 257 PINDIR_OUTPUT, |
239 PIN_CATEGORY_CAPTURE)); | 258 PIN_CATEGORY_CAPTURE)); |
240 if (!output_capture_pin) { | 259 if (!output_capture_pin) { |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
418 const Name& device, | 437 const Name& device, |
419 VideoCaptureFormats* formats) { | 438 VideoCaptureFormats* formats) { |
420 DCHECK(thread_checker_.CalledOnValidThread()); | 439 DCHECK(thread_checker_.CalledOnValidThread()); |
421 if (use_media_foundation_) | 440 if (use_media_foundation_) |
422 GetDeviceSupportedFormatsMediaFoundation(device, formats); | 441 GetDeviceSupportedFormatsMediaFoundation(device, formats); |
423 else | 442 else |
424 GetDeviceSupportedFormatsDirectShow(device, formats); | 443 GetDeviceSupportedFormatsDirectShow(device, formats); |
425 } | 444 } |
426 | 445 |
427 } // namespace media | 446 } // namespace media |
OLD | NEW |