yading@10
|
1 /*
|
yading@10
|
2 * DirectShow capture interface
|
yading@10
|
3 * Copyright (c) 2010 Ramiro Polla
|
yading@10
|
4 *
|
yading@10
|
5 * This file is part of FFmpeg.
|
yading@10
|
6 *
|
yading@10
|
7 * FFmpeg is free software; you can redistribute it and/or
|
yading@10
|
8 * modify it under the terms of the GNU Lesser General Public
|
yading@10
|
9 * License as published by the Free Software Foundation; either
|
yading@10
|
10 * version 2.1 of the License, or (at your option) any later version.
|
yading@10
|
11 *
|
yading@10
|
12 * FFmpeg is distributed in the hope that it will be useful,
|
yading@10
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@10
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@10
|
15 * Lesser General Public License for more details.
|
yading@10
|
16 *
|
yading@10
|
17 * You should have received a copy of the GNU Lesser General Public
|
yading@10
|
18 * License along with FFmpeg; if not, write to the Free Software
|
yading@10
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@10
|
20 */
|
yading@10
|
21
|
yading@10
|
22 #include "dshow_capture.h"
|
yading@10
|
23
|
yading@10
|
24 DECLARE_QUERYINTERFACE(libAVFilter,
|
yading@10
|
25 { {&IID_IUnknown,0}, {&IID_IBaseFilter,0} })
|
yading@10
|
26 DECLARE_ADDREF(libAVFilter)
|
yading@10
|
27 DECLARE_RELEASE(libAVFilter)
|
yading@10
|
28
|
yading@10
|
29 long WINAPI
|
yading@10
|
30 libAVFilter_GetClassID(libAVFilter *this, CLSID *id)
|
yading@10
|
31 {
|
yading@10
|
32 dshowdebug("libAVFilter_GetClassID(%p)\n", this);
|
yading@10
|
33 /* I'm not creating a ClassID just for this. */
|
yading@10
|
34 return E_FAIL;
|
yading@10
|
35 }
|
yading@10
|
36 long WINAPI
|
yading@10
|
37 libAVFilter_Stop(libAVFilter *this)
|
yading@10
|
38 {
|
yading@10
|
39 dshowdebug("libAVFilter_Stop(%p)\n", this);
|
yading@10
|
40 this->state = State_Stopped;
|
yading@10
|
41 return S_OK;
|
yading@10
|
42 }
|
yading@10
|
43 long WINAPI
|
yading@10
|
44 libAVFilter_Pause(libAVFilter *this)
|
yading@10
|
45 {
|
yading@10
|
46 dshowdebug("libAVFilter_Pause(%p)\n", this);
|
yading@10
|
47 this->state = State_Paused;
|
yading@10
|
48 return S_OK;
|
yading@10
|
49 }
|
yading@10
|
50 long WINAPI
|
yading@10
|
51 libAVFilter_Run(libAVFilter *this, REFERENCE_TIME start)
|
yading@10
|
52 {
|
yading@10
|
53 dshowdebug("libAVFilter_Run(%p) %"PRId64"\n", this, start);
|
yading@10
|
54 this->state = State_Running;
|
yading@10
|
55 this->start_time = start;
|
yading@10
|
56 return S_OK;
|
yading@10
|
57 }
|
yading@10
|
58 long WINAPI
|
yading@10
|
59 libAVFilter_GetState(libAVFilter *this, DWORD ms, FILTER_STATE *state)
|
yading@10
|
60 {
|
yading@10
|
61 dshowdebug("libAVFilter_GetState(%p)\n", this);
|
yading@10
|
62 if (!state)
|
yading@10
|
63 return E_POINTER;
|
yading@10
|
64 *state = this->state;
|
yading@10
|
65 return S_OK;
|
yading@10
|
66 }
|
yading@10
|
67 long WINAPI
|
yading@10
|
68 libAVFilter_SetSyncSource(libAVFilter *this, IReferenceClock *clock)
|
yading@10
|
69 {
|
yading@10
|
70 dshowdebug("libAVFilter_SetSyncSource(%p)\n", this);
|
yading@10
|
71
|
yading@10
|
72 if (this->clock != clock) {
|
yading@10
|
73 if (this->clock)
|
yading@10
|
74 IReferenceClock_Release(this->clock);
|
yading@10
|
75 this->clock = clock;
|
yading@10
|
76 if (clock)
|
yading@10
|
77 IReferenceClock_AddRef(clock);
|
yading@10
|
78 }
|
yading@10
|
79
|
yading@10
|
80 return S_OK;
|
yading@10
|
81 }
|
yading@10
|
82 long WINAPI
|
yading@10
|
83 libAVFilter_GetSyncSource(libAVFilter *this, IReferenceClock **clock)
|
yading@10
|
84 {
|
yading@10
|
85 dshowdebug("libAVFilter_GetSyncSource(%p)\n", this);
|
yading@10
|
86
|
yading@10
|
87 if (!clock)
|
yading@10
|
88 return E_POINTER;
|
yading@10
|
89 if (this->clock)
|
yading@10
|
90 IReferenceClock_AddRef(this->clock);
|
yading@10
|
91 *clock = this->clock;
|
yading@10
|
92
|
yading@10
|
93 return S_OK;
|
yading@10
|
94 }
|
yading@10
|
95 long WINAPI
|
yading@10
|
96 libAVFilter_EnumPins(libAVFilter *this, IEnumPins **enumpin)
|
yading@10
|
97 {
|
yading@10
|
98 libAVEnumPins *new;
|
yading@10
|
99 dshowdebug("libAVFilter_EnumPins(%p)\n", this);
|
yading@10
|
100
|
yading@10
|
101 if (!enumpin)
|
yading@10
|
102 return E_POINTER;
|
yading@10
|
103 new = libAVEnumPins_Create(this->pin, this);
|
yading@10
|
104 if (!new)
|
yading@10
|
105 return E_OUTOFMEMORY;
|
yading@10
|
106
|
yading@10
|
107 *enumpin = (IEnumPins *) new;
|
yading@10
|
108 return S_OK;
|
yading@10
|
109 }
|
yading@10
|
110 long WINAPI
|
yading@10
|
111 libAVFilter_FindPin(libAVFilter *this, const wchar_t *id, IPin **pin)
|
yading@10
|
112 {
|
yading@10
|
113 libAVPin *found = NULL;
|
yading@10
|
114 dshowdebug("libAVFilter_FindPin(%p)\n", this);
|
yading@10
|
115
|
yading@10
|
116 if (!id || !pin)
|
yading@10
|
117 return E_POINTER;
|
yading@10
|
118 if (!wcscmp(id, L"In")) {
|
yading@10
|
119 found = this->pin;
|
yading@10
|
120 libAVPin_AddRef(found);
|
yading@10
|
121 }
|
yading@10
|
122 *pin = (IPin *) found;
|
yading@10
|
123 if (!found)
|
yading@10
|
124 return VFW_E_NOT_FOUND;
|
yading@10
|
125
|
yading@10
|
126 return S_OK;
|
yading@10
|
127 }
|
yading@10
|
128 long WINAPI
|
yading@10
|
129 libAVFilter_QueryFilterInfo(libAVFilter *this, FILTER_INFO *info)
|
yading@10
|
130 {
|
yading@10
|
131 dshowdebug("libAVFilter_QueryFilterInfo(%p)\n", this);
|
yading@10
|
132
|
yading@10
|
133 if (!info)
|
yading@10
|
134 return E_POINTER;
|
yading@10
|
135 if (this->info.pGraph)
|
yading@10
|
136 IFilterGraph_AddRef(this->info.pGraph);
|
yading@10
|
137 *info = this->info;
|
yading@10
|
138
|
yading@10
|
139 return S_OK;
|
yading@10
|
140 }
|
yading@10
|
141 long WINAPI
|
yading@10
|
142 libAVFilter_JoinFilterGraph(libAVFilter *this, IFilterGraph *graph,
|
yading@10
|
143 const wchar_t *name)
|
yading@10
|
144 {
|
yading@10
|
145 dshowdebug("libAVFilter_JoinFilterGraph(%p)\n", this);
|
yading@10
|
146
|
yading@10
|
147 this->info.pGraph = graph;
|
yading@10
|
148 if (name)
|
yading@10
|
149 wcscpy(this->info.achName, name);
|
yading@10
|
150
|
yading@10
|
151 return S_OK;
|
yading@10
|
152 }
|
yading@10
|
153 long WINAPI
|
yading@10
|
154 libAVFilter_QueryVendorInfo(libAVFilter *this, wchar_t **info)
|
yading@10
|
155 {
|
yading@10
|
156 dshowdebug("libAVFilter_QueryVendorInfo(%p)\n", this);
|
yading@10
|
157
|
yading@10
|
158 if (!info)
|
yading@10
|
159 return E_POINTER;
|
yading@10
|
160 *info = wcsdup(L"libAV");
|
yading@10
|
161
|
yading@10
|
162 return S_OK;
|
yading@10
|
163 }
|
yading@10
|
164
|
yading@10
|
165 static int
|
yading@10
|
166 libAVFilter_Setup(libAVFilter *this, void *priv_data, void *callback,
|
yading@10
|
167 enum dshowDeviceType type)
|
yading@10
|
168 {
|
yading@10
|
169 IBaseFilterVtbl *vtbl = this->vtbl;
|
yading@10
|
170 SETVTBL(vtbl, libAVFilter, QueryInterface);
|
yading@10
|
171 SETVTBL(vtbl, libAVFilter, AddRef);
|
yading@10
|
172 SETVTBL(vtbl, libAVFilter, Release);
|
yading@10
|
173 SETVTBL(vtbl, libAVFilter, GetClassID);
|
yading@10
|
174 SETVTBL(vtbl, libAVFilter, Stop);
|
yading@10
|
175 SETVTBL(vtbl, libAVFilter, Pause);
|
yading@10
|
176 SETVTBL(vtbl, libAVFilter, Run);
|
yading@10
|
177 SETVTBL(vtbl, libAVFilter, GetState);
|
yading@10
|
178 SETVTBL(vtbl, libAVFilter, SetSyncSource);
|
yading@10
|
179 SETVTBL(vtbl, libAVFilter, GetSyncSource);
|
yading@10
|
180 SETVTBL(vtbl, libAVFilter, EnumPins);
|
yading@10
|
181 SETVTBL(vtbl, libAVFilter, FindPin);
|
yading@10
|
182 SETVTBL(vtbl, libAVFilter, QueryFilterInfo);
|
yading@10
|
183 SETVTBL(vtbl, libAVFilter, JoinFilterGraph);
|
yading@10
|
184 SETVTBL(vtbl, libAVFilter, QueryVendorInfo);
|
yading@10
|
185
|
yading@10
|
186 this->pin = libAVPin_Create(this);
|
yading@10
|
187
|
yading@10
|
188 this->priv_data = priv_data;
|
yading@10
|
189 this->callback = callback;
|
yading@10
|
190 this->type = type;
|
yading@10
|
191
|
yading@10
|
192 return 1;
|
yading@10
|
193 }
|
yading@10
|
194 static int
|
yading@10
|
195 libAVFilter_Cleanup(libAVFilter *this)
|
yading@10
|
196 {
|
yading@10
|
197 libAVPin_Release(this->pin);
|
yading@10
|
198 return 1;
|
yading@10
|
199 }
|
yading@10
|
200 DECLARE_CREATE(libAVFilter, libAVFilter_Setup(this, priv_data, callback, type),
|
yading@10
|
201 void *priv_data, void *callback, enum dshowDeviceType type)
|
yading@10
|
202 DECLARE_DESTROY(libAVFilter, libAVFilter_Cleanup)
|