1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "media/video/capture/win/filter_base_win.h"
7 #pragma comment(lib, "strmiids.lib")
11 // Implement IEnumPins.
14 public base::RefCounted<PinEnumerator> {
16 explicit PinEnumerator(FilterBase* filter)
24 // IUnknown implementation.
25 STDMETHOD(QueryInterface)(REFIID iid, void** object_ptr) {
26 if (iid == IID_IEnumPins || iid == IID_IUnknown) {
28 *object_ptr = static_cast<IEnumPins*>(this);
34 STDMETHOD_(ULONG, AddRef)() {
35 base::RefCounted<PinEnumerator>::AddRef();
39 STDMETHOD_(ULONG, Release)() {
40 base::RefCounted<PinEnumerator>::Release();
44 // Implement IEnumPins.
45 STDMETHOD(Next)(ULONG count, IPin** pins, ULONG* fetched) {
46 ULONG pins_fetched = 0;
47 while (pins_fetched < count && filter_->NoOfPins() > index_) {
48 IPin* pin = filter_->GetPin(index_++);
50 pins[pins_fetched++] = pin;
54 *fetched = pins_fetched;
56 return pins_fetched == count ? S_OK : S_FALSE;
59 STDMETHOD(Skip)(ULONG count) {
60 if (filter_->NoOfPins()- index_ > count) {
73 STDMETHOD(Clone)(IEnumPins** clone) {
74 PinEnumerator* pin_enum = new PinEnumerator(filter_);
76 pin_enum->index_ = index_;
82 scoped_refptr<FilterBase> filter_;
86 FilterBase::FilterBase() : state_(State_Stopped) {
89 FilterBase::~FilterBase() {
92 STDMETHODIMP FilterBase::EnumPins(IEnumPins** enum_pins) {
93 *enum_pins = new PinEnumerator(this);
94 (*enum_pins)->AddRef();
98 STDMETHODIMP FilterBase::FindPin(LPCWSTR id, IPin** pin) {
102 STDMETHODIMP FilterBase::QueryFilterInfo(FILTER_INFO* info) {
103 info->pGraph = owning_graph_;
104 info->achName[0] = L'\0';
106 info->pGraph->AddRef();
110 STDMETHODIMP FilterBase::JoinFilterGraph(IFilterGraph* graph, LPCWSTR name) {
111 owning_graph_ = graph;
115 STDMETHODIMP FilterBase::QueryVendorInfo(LPWSTR *pVendorInfo) {
119 // Implement IMediaFilter.
120 STDMETHODIMP FilterBase::Stop() {
121 state_ = State_Stopped;
125 STDMETHODIMP FilterBase::Pause() {
126 state_ = State_Paused;
130 STDMETHODIMP FilterBase::Run(REFERENCE_TIME start) {
131 state_ = State_Running;
135 STDMETHODIMP FilterBase::GetState(DWORD msec_timeout, FILTER_STATE* state) {
140 STDMETHODIMP FilterBase::SetSyncSource(IReferenceClock* clock) {
144 STDMETHODIMP FilterBase::GetSyncSource(IReferenceClock** clock) {
148 // Implement from IPersistent.
149 STDMETHODIMP FilterBase::GetClassID(CLSID* class_id) {
154 // Implement IUnknown.
155 STDMETHODIMP FilterBase::QueryInterface(REFIID id, void** object_ptr) {
156 if (id == IID_IMediaFilter || id == IID_IUnknown) {
157 *object_ptr = static_cast<IMediaFilter*>(this);
158 } else if (id == IID_IPersist) {
159 *object_ptr = static_cast<IPersist*>(this);
161 return E_NOINTERFACE;
167 ULONG STDMETHODCALLTYPE FilterBase::AddRef() {
168 base::RefCounted<FilterBase>::AddRef();
172 ULONG STDMETHODCALLTYPE FilterBase::Release() {
173 base::RefCounted<FilterBase>::Release();