| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_win.h" | 5 #include "media/video/capture/win/video_capture_device_win.h" |
| 6 | 6 |
| 7 #include <ks.h> | 7 #include <ks.h> |
| 8 #include <ksmedia.h> | 8 #include <ksmedia.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 ScopedComPtr<IBaseFilter> capture_filter; | 46 ScopedComPtr<IBaseFilter> capture_filter; |
| 47 DWORD fetched = 0; | 47 DWORD fetched = 0; |
| 48 while (enum_moniker->Next(1, moniker.Receive(), &fetched) == S_OK) { | 48 while (enum_moniker->Next(1, moniker.Receive(), &fetched) == S_OK) { |
| 49 ScopedComPtr<IPropertyBag> prop_bag; | 49 ScopedComPtr<IPropertyBag> prop_bag; |
| 50 hr = moniker->BindToStorage(0, 0, IID_IPropertyBag, prop_bag.ReceiveVoid()); | 50 hr = moniker->BindToStorage(0, 0, IID_IPropertyBag, prop_bag.ReceiveVoid()); |
| 51 if (FAILED(hr)) { | 51 if (FAILED(hr)) { |
| 52 moniker.Release(); | 52 moniker.Release(); |
| 53 continue; | 53 continue; |
| 54 } | 54 } |
| 55 | 55 |
| 56 // Find the description or friendly name. | 56 // Find the device via DevicePath, Description or FriendlyName, whichever is |
| 57 // available first. |
| 57 static const wchar_t* kPropertyNames[] = { | 58 static const wchar_t* kPropertyNames[] = { |
| 58 L"DevicePath", L"Description", L"FriendlyName" | 59 L"DevicePath", L"Description", L"FriendlyName" |
| 59 }; | 60 }; |
| 60 ScopedVariant name; | 61 ScopedVariant name; |
| 61 for (size_t i = 0; | 62 for (size_t i = 0; |
| 62 i < arraysize(kPropertyNames) && name.type() != VT_BSTR; ++i) { | 63 i < arraysize(kPropertyNames) && name.type() != VT_BSTR; ++i) { |
| 63 prop_bag->Read(kPropertyNames[i], name.Receive(), 0); | 64 prop_bag->Read(kPropertyNames[i], name.Receive(), 0); |
| 64 } | 65 } |
| 65 if (name.type() == VT_BSTR) { | 66 if (name.type() == VT_BSTR) { |
| 66 std::string device_path(base::SysWideToUTF8(V_BSTR(&name))); | 67 std::string device_path(base::SysWideToUTF8(V_BSTR(&name))); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 94 DWORD return_value; | 95 DWORD return_value; |
| 95 hr = ks_property->Get(AMPROPSETID_Pin, AMPROPERTY_PIN_CATEGORY, NULL, 0, | 96 hr = ks_property->Get(AMPROPSETID_Pin, AMPROPERTY_PIN_CATEGORY, NULL, 0, |
| 96 &pin_category, sizeof(pin_category), &return_value); | 97 &pin_category, sizeof(pin_category), &return_value); |
| 97 if (SUCCEEDED(hr) && (return_value == sizeof(pin_category))) { | 98 if (SUCCEEDED(hr) && (return_value == sizeof(pin_category))) { |
| 98 found = (pin_category == category); | 99 found = (pin_category == category); |
| 99 } | 100 } |
| 100 } | 101 } |
| 101 return found; | 102 return found; |
| 102 } | 103 } |
| 103 | 104 |
| 104 // Finds a IPin on a IBaseFilter given the direction an category. | 105 // Finds an IPin on an IBaseFilter given the direction and category. |
| 105 // static | 106 // static |
| 106 ScopedComPtr<IPin> VideoCaptureDeviceWin::GetPin(IBaseFilter* filter, | 107 ScopedComPtr<IPin> VideoCaptureDeviceWin::GetPin(IBaseFilter* filter, |
| 107 PIN_DIRECTION pin_dir, | 108 PIN_DIRECTION pin_dir, |
| 108 REFGUID category) { | 109 REFGUID category) { |
| 109 ScopedComPtr<IPin> pin; | 110 ScopedComPtr<IPin> pin; |
| 110 ScopedComPtr<IEnumPins> pin_emum; | 111 ScopedComPtr<IEnumPins> pin_enum; |
| 111 HRESULT hr = filter->EnumPins(pin_emum.Receive()); | 112 HRESULT hr = filter->EnumPins(pin_enum.Receive()); |
| 112 if (pin_emum == NULL) | 113 if (pin_enum == NULL) |
| 113 return pin; | 114 return pin; |
| 114 | 115 |
| 115 // Get first unconnected pin. | 116 // Get first unconnected pin. |
| 116 hr = pin_emum->Reset(); // set to first pin | 117 hr = pin_enum->Reset(); // set to first pin |
| 117 while ((hr = pin_emum->Next(1, pin.Receive(), NULL)) == S_OK) { | 118 while ((hr = pin_enum->Next(1, pin.Receive(), NULL)) == S_OK) { |
| 118 PIN_DIRECTION this_pin_dir = static_cast<PIN_DIRECTION>(-1); | 119 PIN_DIRECTION this_pin_dir = static_cast<PIN_DIRECTION>(-1); |
| 119 hr = pin->QueryDirection(&this_pin_dir); | 120 hr = pin->QueryDirection(&this_pin_dir); |
| 120 if (pin_dir == this_pin_dir) { | 121 if (pin_dir == this_pin_dir) { |
| 121 if (category == GUID_NULL || PinMatchesCategory(pin, category)) | 122 if (category == GUID_NULL || PinMatchesCategory(pin, category)) |
| 122 return pin; | 123 return pin; |
| 123 } | 124 } |
| 124 pin.Release(); | 125 pin.Release(); |
| 125 } | 126 } |
| 126 | 127 |
| 127 DCHECK(!pin); | 128 DCHECK(!pin); |
| (...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 551 } | 552 } |
| 552 } | 553 } |
| 553 | 554 |
| 554 void VideoCaptureDeviceWin::SetErrorState(const std::string& reason) { | 555 void VideoCaptureDeviceWin::SetErrorState(const std::string& reason) { |
| 555 DCHECK(CalledOnValidThread()); | 556 DCHECK(CalledOnValidThread()); |
| 556 DVLOG(1) << reason; | 557 DVLOG(1) << reason; |
| 557 state_ = kError; | 558 state_ = kError; |
| 558 client_->OnError(reason); | 559 client_->OnError(reason); |
| 559 } | 560 } |
| 560 } // namespace media | 561 } // namespace media |
| OLD | NEW |