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 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
212 int index = 0; | 212 int index = 0; |
213 ScopedVariant device_id; | 213 ScopedVariant device_id; |
214 while (enum_moniker->Next(1, moniker.Receive(), NULL) == S_OK) { | 214 while (enum_moniker->Next(1, moniker.Receive(), NULL) == S_OK) { |
215 ScopedComPtr<IPropertyBag> prop_bag; | 215 ScopedComPtr<IPropertyBag> prop_bag; |
216 hr = moniker->BindToStorage(0, 0, IID_IPropertyBag, prop_bag.ReceiveVoid()); | 216 hr = moniker->BindToStorage(0, 0, IID_IPropertyBag, prop_bag.ReceiveVoid()); |
217 if (FAILED(hr)) { | 217 if (FAILED(hr)) { |
218 moniker.Release(); | 218 moniker.Release(); |
219 continue; | 219 continue; |
220 } | 220 } |
221 | 221 |
222 std::string id; | |
222 device_id.Reset(); | 223 device_id.Reset(); |
223 hr = prop_bag->Read(L"DevicePath", device_id.Receive(), 0); | 224 hr = prop_bag->Read(L"DevicePath", device_id.Receive(), 0); |
224 if (FAILED(hr)) { | 225 if (FAILED(hr) || device_id.type() != VT_BSTR) { |
225 DVLOG(1) << "Couldn't read a device's DevicePath."; | 226 // If there is no clear DevicePath, try with Description and FriendlyName. |
tommi (sloooow) - chröme
2014/06/10 07:36:29
Is fetching the Description before FriendlyName th
mcasas
2014/06/10 15:01:14
The idea/sinppet comes from l.128-l.130 of this fi
| |
226 return; | 227 ScopedVariant name; |
228 if (SUCCEEDED(prop_bag->Read(L"Description", name.Receive(), 0)) || | |
229 SUCCEEDED(prop_bag->Read(L"FriendlyName", name.Receive(), 0))) { | |
230 id = base::SysWideToUTF8(V_BSTR(&name)); | |
231 } | |
232 } else { | |
233 DCHECK_EQ(device_id.type(), VT_BSTR); | |
234 id = base::SysWideToUTF8(V_BSTR(&device_id)); | |
227 } | 235 } |
228 if (device.id() == base::SysWideToUTF8(V_BSTR(&device_id))) | 236 |
237 if (device.id() == id) | |
229 break; | 238 break; |
230 moniker.Release(); | 239 moniker.Release(); |
231 } | 240 } |
232 | 241 |
233 if (moniker.get()) { | 242 if (moniker.get()) { |
234 base::win::ScopedComPtr<IBaseFilter> capture_filter; | 243 base::win::ScopedComPtr<IBaseFilter> capture_filter; |
235 hr = VideoCaptureDeviceWin::GetDeviceFilter(device, | 244 hr = VideoCaptureDeviceWin::GetDeviceFilter(device, |
236 capture_filter.Receive()); | 245 capture_filter.Receive()); |
237 if (!capture_filter) { | 246 if (!capture_filter) { |
238 DVLOG(2) << "Failed to create capture filter."; | 247 DVLOG(2) << "Failed to create capture filter."; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
281 VideoCaptureDeviceWin::TranslateMediaSubtypeToPixelFormat( | 290 VideoCaptureDeviceWin::TranslateMediaSubtypeToPixelFormat( |
282 media_type->subtype); | 291 media_type->subtype); |
283 if (format.pixel_format == PIXEL_FORMAT_UNKNOWN) | 292 if (format.pixel_format == PIXEL_FORMAT_UNKNOWN) |
284 continue; | 293 continue; |
285 VIDEOINFOHEADER* h = | 294 VIDEOINFOHEADER* h = |
286 reinterpret_cast<VIDEOINFOHEADER*>(media_type->pbFormat); | 295 reinterpret_cast<VIDEOINFOHEADER*>(media_type->pbFormat); |
287 format.frame_size.SetSize(h->bmiHeader.biWidth, | 296 format.frame_size.SetSize(h->bmiHeader.biWidth, |
288 h->bmiHeader.biHeight); | 297 h->bmiHeader.biHeight); |
289 // Trust the frame rate from the VIDEOINFOHEADER. | 298 // Trust the frame rate from the VIDEOINFOHEADER. |
290 format.frame_rate = (h->AvgTimePerFrame > 0) ? | 299 format.frame_rate = (h->AvgTimePerFrame > 0) ? |
291 static_cast<int>(kSecondsToReferenceTime / h->AvgTimePerFrame) : | 300 (kSecondsToReferenceTime / static_cast<float>(h->AvgTimePerFrame)) : |
tommi (sloooow) - chröme
2014/06/10 07:36:29
nit: extra parenthesis aren't needed
mcasas
2014/06/10 15:01:14
Done.
| |
292 0; | 301 0.0; |
302 | |
293 formats->push_back(format); | 303 formats->push_back(format); |
294 DVLOG(1) << device.name() << " resolution: " | 304 DVLOG(1) << device.name() << " resolution: " |
295 << format.frame_size.ToString() << ", fps: " << format.frame_rate | 305 << format.frame_size.ToString() << ", fps: " << format.frame_rate |
296 << ", pixel format: " << format.pixel_format; | 306 << ", pixel format: " << format.pixel_format; |
297 } | 307 } |
298 } | 308 } |
299 } | 309 } |
300 } | 310 } |
301 | 311 |
302 static void GetDeviceSupportedFormatsMediaFoundation( | 312 static void GetDeviceSupportedFormatsMediaFoundation( |
(...skipping 26 matching lines...) Expand all Loading... | |
329 } | 339 } |
330 VideoCaptureFormat capture_format; | 340 VideoCaptureFormat capture_format; |
331 capture_format.frame_size.SetSize(width, height); | 341 capture_format.frame_size.SetSize(width, height); |
332 | 342 |
333 UINT32 numerator, denominator; | 343 UINT32 numerator, denominator; |
334 hr = MFGetAttributeRatio(type, MF_MT_FRAME_RATE, &numerator, &denominator); | 344 hr = MFGetAttributeRatio(type, MF_MT_FRAME_RATE, &numerator, &denominator); |
335 if (FAILED(hr)) { | 345 if (FAILED(hr)) { |
336 DLOG(ERROR) << "MFGetAttributeSize: " << std::hex << hr; | 346 DLOG(ERROR) << "MFGetAttributeSize: " << std::hex << hr; |
337 return; | 347 return; |
338 } | 348 } |
339 capture_format.frame_rate = denominator ? numerator / denominator : 0; | 349 capture_format.frame_rate = denominator ? |
350 numerator / static_cast<float>(denominator) : 0.0f; | |
340 | 351 |
341 GUID type_guid; | 352 GUID type_guid; |
342 hr = type->GetGUID(MF_MT_SUBTYPE, &type_guid); | 353 hr = type->GetGUID(MF_MT_SUBTYPE, &type_guid); |
343 if (FAILED(hr)) { | 354 if (FAILED(hr)) { |
344 DLOG(ERROR) << "GetGUID: " << std::hex << hr; | 355 DLOG(ERROR) << "GetGUID: " << std::hex << hr; |
345 return; | 356 return; |
346 } | 357 } |
347 VideoCaptureDeviceMFWin::FormatFromGuid(type_guid, | 358 VideoCaptureDeviceMFWin::FormatFromGuid(type_guid, |
348 &capture_format.pixel_format); | 359 &capture_format.pixel_format); |
349 type.Release(); | 360 type.Release(); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
427 const VideoCaptureDevice::Name& device, | 438 const VideoCaptureDevice::Name& device, |
428 VideoCaptureFormats* formats) { | 439 VideoCaptureFormats* formats) { |
429 DCHECK(thread_checker_.CalledOnValidThread()); | 440 DCHECK(thread_checker_.CalledOnValidThread()); |
430 if (use_media_foundation_) | 441 if (use_media_foundation_) |
431 GetDeviceSupportedFormatsMediaFoundation(device, formats); | 442 GetDeviceSupportedFormatsMediaFoundation(device, formats); |
432 else | 443 else |
433 GetDeviceSupportedFormatsDirectShow(device, formats); | 444 GetDeviceSupportedFormatsDirectShow(device, formats); |
434 } | 445 } |
435 | 446 |
436 } // namespace media | 447 } // namespace media |
OLD | NEW |