- add sources.
[platform/framework/web/crosswalk.git] / src / media / video / capture / win / filter_base_win.cc
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.
4
5 #include "media/video/capture/win/filter_base_win.h"
6
7 #pragma comment(lib, "strmiids.lib")
8
9 namespace media {
10
11 // Implement IEnumPins.
12 class PinEnumerator
13     : public IEnumPins,
14       public base::RefCounted<PinEnumerator> {
15  public:
16   explicit PinEnumerator(FilterBase* filter)
17       : filter_(filter),
18       index_(0) {
19   }
20
21   ~PinEnumerator() {
22   }
23
24   // IUnknown implementation.
25   STDMETHOD(QueryInterface)(REFIID iid, void** object_ptr) {
26     if (iid == IID_IEnumPins || iid == IID_IUnknown) {
27       AddRef();
28       *object_ptr = static_cast<IEnumPins*>(this);
29       return S_OK;
30     }
31     return E_NOINTERFACE;
32   }
33
34   STDMETHOD_(ULONG, AddRef)() {
35     base::RefCounted<PinEnumerator>::AddRef();
36     return 1;
37   }
38
39   STDMETHOD_(ULONG, Release)() {
40     base::RefCounted<PinEnumerator>::Release();
41     return 1;
42   }
43
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_++);
49       pin->AddRef();
50       pins[pins_fetched++] = pin;
51     }
52
53     if (fetched)
54       *fetched =  pins_fetched;
55
56     return pins_fetched == count ? S_OK : S_FALSE;
57   }
58
59   STDMETHOD(Skip)(ULONG count) {
60     if (filter_->NoOfPins()- index_ > count) {
61       index_ += count;
62       return S_OK;
63     }
64     index_ = 0;
65     return S_FALSE;
66   }
67
68   STDMETHOD(Reset)() {
69     index_ = 0;
70     return S_OK;
71   }
72
73   STDMETHOD(Clone)(IEnumPins** clone) {
74     PinEnumerator* pin_enum = new PinEnumerator(filter_);
75     pin_enum->AddRef();
76     pin_enum->index_ = index_;
77     *clone = pin_enum;
78     return S_OK;
79   }
80
81  private:
82   scoped_refptr<FilterBase> filter_;
83   size_t index_;
84 };
85
86 FilterBase::FilterBase() : state_(State_Stopped) {
87 }
88
89 FilterBase::~FilterBase() {
90 }
91
92 STDMETHODIMP FilterBase::EnumPins(IEnumPins** enum_pins) {
93   *enum_pins = new PinEnumerator(this);
94   (*enum_pins)->AddRef();
95   return S_OK;
96 }
97
98 STDMETHODIMP FilterBase::FindPin(LPCWSTR id, IPin** pin) {
99   return E_NOTIMPL;
100 }
101
102 STDMETHODIMP FilterBase::QueryFilterInfo(FILTER_INFO* info) {
103   info->pGraph = owning_graph_;
104   info->achName[0] = L'\0';
105   if (info->pGraph)
106     info->pGraph->AddRef();
107   return S_OK;
108 }
109
110 STDMETHODIMP FilterBase::JoinFilterGraph(IFilterGraph* graph, LPCWSTR name) {
111   owning_graph_ = graph;
112   return S_OK;
113 }
114
115 STDMETHODIMP FilterBase::QueryVendorInfo(LPWSTR *pVendorInfo) {
116   return S_OK;
117 }
118
119 // Implement IMediaFilter.
120 STDMETHODIMP FilterBase::Stop() {
121   state_ = State_Stopped;
122   return S_OK;
123 }
124
125 STDMETHODIMP FilterBase::Pause() {
126   state_ = State_Paused;
127   return S_OK;
128 }
129
130 STDMETHODIMP FilterBase::Run(REFERENCE_TIME start) {
131   state_ = State_Running;
132   return S_OK;
133 }
134
135 STDMETHODIMP FilterBase::GetState(DWORD msec_timeout, FILTER_STATE* state) {
136   *state = state_;
137   return S_OK;
138 }
139
140 STDMETHODIMP FilterBase::SetSyncSource(IReferenceClock* clock) {
141   return S_OK;
142 }
143
144 STDMETHODIMP FilterBase::GetSyncSource(IReferenceClock** clock) {
145   return E_NOTIMPL;
146 }
147
148 // Implement from IPersistent.
149 STDMETHODIMP FilterBase::GetClassID(CLSID* class_id) {
150   NOTREACHED();
151   return E_NOTIMPL;
152 }
153
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);
160   } else {
161     return E_NOINTERFACE;
162   }
163   AddRef();
164   return S_OK;
165 }
166
167 ULONG STDMETHODCALLTYPE FilterBase::AddRef() {
168   base::RefCounted<FilterBase>::AddRef();
169   return 1;
170 }
171
172 ULONG STDMETHODCALLTYPE FilterBase::Release() {
173   base::RefCounted<FilterBase>::Release();
174   return 1;
175 }
176
177 }  // namespace media