1 /*
2 * Copyright 2015 Jacek Caban for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19 #include "wmvcore.h"
20 #include "wmsdkidl.h"
21
22 #include "wine/debug.h"
23 #include "wine/heap.h"
24
25 WINE_DEFAULT_DEBUG_CHANNEL(wmvcore);
26
27 typedef struct {
28 IWMWriter IWMWriter_iface;
29 IWMWriterAdvanced3 IWMWriterAdvanced3_iface;
30 LONG ref;
31 } WMWriter;
32
impl_from_IWMWriter(IWMWriter * iface)33 static inline WMWriter *impl_from_IWMWriter(IWMWriter *iface)
34 {
35 return CONTAINING_RECORD(iface, WMWriter, IWMWriter_iface);
36 }
37
WMWriter_QueryInterface(IWMWriter * iface,REFIID riid,void ** ppv)38 static HRESULT WINAPI WMWriter_QueryInterface(IWMWriter *iface, REFIID riid, void **ppv)
39 {
40 WMWriter *This = impl_from_IWMWriter(iface);
41
42 if(IsEqualGUID(&IID_IUnknown, riid)) {
43 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
44 *ppv = &This->IWMWriter_iface;
45 }else if(IsEqualGUID(&IID_IWMWriter, riid)) {
46 TRACE("(%p)->(IID_IWMWriter %p)\n", This, ppv);
47 *ppv = &This->IWMWriter_iface;
48 }else if(IsEqualGUID(&IID_IWMWriterAdvanced, riid)) {
49 TRACE("(%p)->(IID_IWMWriterAdvanced %p)\n", This, ppv);
50 *ppv = &This->IWMWriterAdvanced3_iface;
51 }else if(IsEqualGUID(&IID_IWMWriterAdvanced2, riid)) {
52 TRACE("(%p)->(IID_IWMWriterAdvanced2 %p)\n", This, ppv);
53 *ppv = &This->IWMWriterAdvanced3_iface;
54 }else if(IsEqualGUID(&IID_IWMWriterAdvanced3, riid)) {
55 TRACE("(%p)->(IID_IWMWriterAdvanced3 %p)\n", This, ppv);
56 *ppv = &This->IWMWriterAdvanced3_iface;
57 }else {
58 FIXME("Unsupported iface %s\n", debugstr_guid(riid));
59 *ppv = NULL;
60 return E_NOINTERFACE;
61 }
62
63 IUnknown_AddRef((IUnknown*)*ppv);
64 return S_OK;
65 }
66
WMWriter_AddRef(IWMWriter * iface)67 static ULONG WINAPI WMWriter_AddRef(IWMWriter *iface)
68 {
69 WMWriter *This = impl_from_IWMWriter(iface);
70 LONG ref = InterlockedIncrement(&This->ref);
71
72 TRACE("(%p) ref=%d\n", This, ref);
73
74 return ref;
75 }
76
WMWriter_Release(IWMWriter * iface)77 static ULONG WINAPI WMWriter_Release(IWMWriter *iface)
78 {
79 WMWriter *This = impl_from_IWMWriter(iface);
80 LONG ref = InterlockedDecrement(&This->ref);
81
82 TRACE("(%p) ref=%d\n", This, ref);
83
84 if(!ref)
85 heap_free(This);
86
87 return ref;
88 }
89
WMWriter_SetProfileByID(IWMWriter * iface,REFGUID guidProfile)90 static HRESULT WINAPI WMWriter_SetProfileByID(IWMWriter *iface, REFGUID guidProfile)
91 {
92 WMWriter *This = impl_from_IWMWriter(iface);
93 FIXME("(%p)->(%s)\n", This, debugstr_guid(guidProfile));
94 return E_NOTIMPL;
95 }
96
WMWriter_SetProfile(IWMWriter * iface,IWMProfile * profile)97 static HRESULT WINAPI WMWriter_SetProfile(IWMWriter *iface, IWMProfile *profile)
98 {
99 WMWriter *This = impl_from_IWMWriter(iface);
100 FIXME("(%p)->(%p)\n", This, profile);
101 return E_NOTIMPL;
102 }
103
WMWriter_SetOutputFilename(IWMWriter * iface,const WCHAR * filename)104 static HRESULT WINAPI WMWriter_SetOutputFilename(IWMWriter *iface, const WCHAR *filename)
105 {
106 WMWriter *This = impl_from_IWMWriter(iface);
107 FIXME("(%p)->(%s)\n", This, debugstr_w(filename));
108 return E_NOTIMPL;
109 }
110
WMWriter_GetInputCount(IWMWriter * iface,DWORD * pcInputs)111 static HRESULT WINAPI WMWriter_GetInputCount(IWMWriter *iface, DWORD *pcInputs)
112 {
113 WMWriter *This = impl_from_IWMWriter(iface);
114 FIXME("(%p)->(%p)\n", This, pcInputs);
115 return E_NOTIMPL;
116 }
117
WMWriter_GetInputProps(IWMWriter * iface,DWORD dwInputNum,IWMInputMediaProps ** input)118 static HRESULT WINAPI WMWriter_GetInputProps(IWMWriter *iface, DWORD dwInputNum, IWMInputMediaProps **input)
119 {
120 WMWriter *This = impl_from_IWMWriter(iface);
121 FIXME("(%p)->(%d %p)\n", This, dwInputNum, input);
122 return E_NOTIMPL;
123 }
124
WMWriter_SetInputProps(IWMWriter * iface,DWORD dwInputNum,IWMInputMediaProps * input)125 static HRESULT WINAPI WMWriter_SetInputProps(IWMWriter *iface, DWORD dwInputNum, IWMInputMediaProps *input)
126 {
127 WMWriter *This = impl_from_IWMWriter(iface);
128 FIXME("(%p)->(%d %p)\n", This, dwInputNum, input);
129 return E_NOTIMPL;
130 }
131
WMWriter_GetInputFormatCount(IWMWriter * iface,DWORD dwInputNumber,DWORD * pcFormat)132 static HRESULT WINAPI WMWriter_GetInputFormatCount(IWMWriter *iface, DWORD dwInputNumber, DWORD *pcFormat)
133 {
134 WMWriter *This = impl_from_IWMWriter(iface);
135 FIXME("(%p)->(%d %p)\n", This, dwInputNumber, pcFormat);
136 return E_NOTIMPL;
137 }
138
WMWriter_GetInputFormat(IWMWriter * iface,DWORD dwInputNumber,DWORD dwFormatNumber,IWMInputMediaProps ** props)139 static HRESULT WINAPI WMWriter_GetInputFormat(IWMWriter *iface, DWORD dwInputNumber, DWORD dwFormatNumber,
140 IWMInputMediaProps **props)
141 {
142 WMWriter *This = impl_from_IWMWriter(iface);
143 FIXME("(%p)->(%d %d %p)\n", This, dwInputNumber, dwFormatNumber, props);
144 return E_NOTIMPL;
145 }
146
WMWriter_BeginWriting(IWMWriter * iface)147 static HRESULT WINAPI WMWriter_BeginWriting(IWMWriter *iface)
148 {
149 WMWriter *This = impl_from_IWMWriter(iface);
150 FIXME("(%p)\n", This);
151 return E_NOTIMPL;
152 }
153
WMWriter_EndWriting(IWMWriter * iface)154 static HRESULT WINAPI WMWriter_EndWriting(IWMWriter *iface)
155 {
156 WMWriter *This = impl_from_IWMWriter(iface);
157 FIXME("(%p)\n", This);
158 return E_NOTIMPL;
159 }
160
WMWriter_AllocateSample(IWMWriter * iface,DWORD size,INSSBuffer ** sample)161 static HRESULT WINAPI WMWriter_AllocateSample(IWMWriter *iface, DWORD size, INSSBuffer **sample)
162 {
163 WMWriter *This = impl_from_IWMWriter(iface);
164 FIXME("(%p)->(%d %p)\n", This, size, sample);
165 return E_NOTIMPL;
166 }
167
WMWriter_WriteSample(IWMWriter * iface,DWORD dwInputNum,QWORD cnsSampleTime,DWORD flags,INSSBuffer * sample)168 static HRESULT WINAPI WMWriter_WriteSample(IWMWriter *iface, DWORD dwInputNum, QWORD cnsSampleTime,
169 DWORD flags, INSSBuffer *sample)
170 {
171 WMWriter *This = impl_from_IWMWriter(iface);
172 FIXME("(%p)->(%d %s %x %p)\n", This, dwInputNum, wine_dbgstr_longlong(cnsSampleTime), flags, sample);
173 return E_NOTIMPL;
174 }
175
WMWriter_Flush(IWMWriter * iface)176 static HRESULT WINAPI WMWriter_Flush(IWMWriter *iface)
177 {
178 WMWriter *This = impl_from_IWMWriter(iface);
179 FIXME("(%p)\n", This);
180 return E_NOTIMPL;
181 }
182
183 static const IWMWriterVtbl WMWriterVtbl = {
184 WMWriter_QueryInterface,
185 WMWriter_AddRef,
186 WMWriter_Release,
187 WMWriter_SetProfileByID,
188 WMWriter_SetProfile,
189 WMWriter_SetOutputFilename,
190 WMWriter_GetInputCount,
191 WMWriter_GetInputProps,
192 WMWriter_SetInputProps,
193 WMWriter_GetInputFormatCount,
194 WMWriter_GetInputFormat,
195 WMWriter_BeginWriting,
196 WMWriter_EndWriting,
197 WMWriter_AllocateSample,
198 WMWriter_WriteSample,
199 WMWriter_Flush
200 };
201
impl_from_IWMWriterAdvanced3(IWMWriterAdvanced3 * iface)202 static inline WMWriter *impl_from_IWMWriterAdvanced3(IWMWriterAdvanced3 *iface)
203 {
204 return CONTAINING_RECORD(iface, WMWriter, IWMWriterAdvanced3_iface);
205 }
206
WMWriterAdvanced_QueryInterface(IWMWriterAdvanced3 * iface,REFIID riid,void ** ppv)207 static HRESULT WINAPI WMWriterAdvanced_QueryInterface(IWMWriterAdvanced3 *iface, REFIID riid, void **ppv)
208 {
209 WMWriter *This = impl_from_IWMWriterAdvanced3(iface);
210 return IWMWriter_QueryInterface(&This->IWMWriter_iface, riid, ppv);
211 }
212
WMWriterAdvanced_AddRef(IWMWriterAdvanced3 * iface)213 static ULONG WINAPI WMWriterAdvanced_AddRef(IWMWriterAdvanced3 *iface)
214 {
215 WMWriter *This = impl_from_IWMWriterAdvanced3(iface);
216 return IWMWriter_AddRef(&This->IWMWriter_iface);
217 }
218
WMWriterAdvanced_Release(IWMWriterAdvanced3 * iface)219 static ULONG WINAPI WMWriterAdvanced_Release(IWMWriterAdvanced3 *iface)
220 {
221 WMWriter *This = impl_from_IWMWriterAdvanced3(iface);
222 return IWMWriter_Release(&This->IWMWriter_iface);
223 }
224
WMWriterAdvanced_GetSinkCount(IWMWriterAdvanced3 * iface,DWORD * sinks)225 static HRESULT WINAPI WMWriterAdvanced_GetSinkCount(IWMWriterAdvanced3 *iface, DWORD *sinks)
226 {
227 WMWriter *This = impl_from_IWMWriterAdvanced3(iface);
228 FIXME("(%p)->(%p)\n", This, sinks);
229 return E_NOTIMPL;
230 }
231
WMWriterAdvanced_GetSink(IWMWriterAdvanced3 * iface,DWORD sink_num,IWMWriterSink ** sink)232 static HRESULT WINAPI WMWriterAdvanced_GetSink(IWMWriterAdvanced3 *iface, DWORD sink_num, IWMWriterSink **sink)
233 {
234 WMWriter *This = impl_from_IWMWriterAdvanced3(iface);
235 FIXME("(%p)->(%u %p)\n", This, sink_num, sink);
236 return E_NOTIMPL;
237 }
238
WMWriterAdvanced_AddSink(IWMWriterAdvanced3 * iface,IWMWriterSink * sink)239 static HRESULT WINAPI WMWriterAdvanced_AddSink(IWMWriterAdvanced3 *iface, IWMWriterSink *sink)
240 {
241 WMWriter *This = impl_from_IWMWriterAdvanced3(iface);
242 FIXME("(%p)->(%p)\n", This, sink);
243 return E_NOTIMPL;
244 }
245
WMWriterAdvanced_RemoveSink(IWMWriterAdvanced3 * iface,IWMWriterSink * sink)246 static HRESULT WINAPI WMWriterAdvanced_RemoveSink(IWMWriterAdvanced3 *iface, IWMWriterSink *sink)
247 {
248 WMWriter *This = impl_from_IWMWriterAdvanced3(iface);
249 FIXME("(%p)->(%p)\n", This, sink);
250 return E_NOTIMPL;
251 }
252
WMWriterAdvanced_WriteStreamSample(IWMWriterAdvanced3 * iface,WORD stream_num,QWORD sample_time,DWORD sample_send_time,QWORD sample_duration,DWORD flags,INSSBuffer * sample)253 static HRESULT WINAPI WMWriterAdvanced_WriteStreamSample(IWMWriterAdvanced3 *iface, WORD stream_num,
254 QWORD sample_time, DWORD sample_send_time, QWORD sample_duration, DWORD flags, INSSBuffer *sample)
255 {
256 WMWriter *This = impl_from_IWMWriterAdvanced3(iface);
257 FIXME("(%p)->(%u %s %u %s %x %p)\n", This, stream_num, wine_dbgstr_longlong(sample_time),
258 sample_send_time, wine_dbgstr_longlong(sample_duration), flags, sample);
259 return E_NOTIMPL;
260 }
261
WMWriterAdvanced_SetLiveSource(IWMWriterAdvanced3 * iface,BOOL is_live_source)262 static HRESULT WINAPI WMWriterAdvanced_SetLiveSource(IWMWriterAdvanced3 *iface, BOOL is_live_source)
263 {
264 WMWriter *This = impl_from_IWMWriterAdvanced3(iface);
265 FIXME("(%p)->(%x)\n", This, is_live_source);
266 return E_NOTIMPL;
267 }
268
WMWriterAdvanced_IsRealTime(IWMWriterAdvanced3 * iface,BOOL * real_time)269 static HRESULT WINAPI WMWriterAdvanced_IsRealTime(IWMWriterAdvanced3 *iface, BOOL *real_time)
270 {
271 WMWriter *This = impl_from_IWMWriterAdvanced3(iface);
272 FIXME("(%p)->(%p)\n", This, real_time);
273 return E_NOTIMPL;
274 }
275
WMWriterAdvanced_GetWriterTime(IWMWriterAdvanced3 * iface,QWORD * current_time)276 static HRESULT WINAPI WMWriterAdvanced_GetWriterTime(IWMWriterAdvanced3 *iface, QWORD *current_time)
277 {
278 WMWriter *This = impl_from_IWMWriterAdvanced3(iface);
279 FIXME("(%p)->(%p)\n", This, current_time);
280 return E_NOTIMPL;
281 }
282
WMWriterAdvanced_GetStatistics(IWMWriterAdvanced3 * iface,WORD stream_num,WM_WRITER_STATISTICS * stats)283 static HRESULT WINAPI WMWriterAdvanced_GetStatistics(IWMWriterAdvanced3 *iface, WORD stream_num, WM_WRITER_STATISTICS *stats)
284 {
285 WMWriter *This = impl_from_IWMWriterAdvanced3(iface);
286 FIXME("(%p)->(%u %p)\n", This, stream_num, stats);
287 return E_NOTIMPL;
288 }
289
WMWriterAdvanced_SetSyncTolerance(IWMWriterAdvanced3 * iface,DWORD window)290 static HRESULT WINAPI WMWriterAdvanced_SetSyncTolerance(IWMWriterAdvanced3 *iface, DWORD window)
291 {
292 WMWriter *This = impl_from_IWMWriterAdvanced3(iface);
293 FIXME("(%p)->(%u)\n", This, window);
294 return E_NOTIMPL;
295 }
296
WMWriterAdvanced_GetSyncTolerance(IWMWriterAdvanced3 * iface,DWORD * window)297 static HRESULT WINAPI WMWriterAdvanced_GetSyncTolerance(IWMWriterAdvanced3 *iface, DWORD *window)
298 {
299 WMWriter *This = impl_from_IWMWriterAdvanced3(iface);
300 FIXME("(%p)->(%p)\n", This, window);
301 return E_NOTIMPL;
302 }
303
WMWriterAdvanced2_GetInputSetting(IWMWriterAdvanced3 * iface,DWORD input_num,const WCHAR * name,WMT_ATTR_DATATYPE * time,BYTE * value,WORD * length)304 static HRESULT WINAPI WMWriterAdvanced2_GetInputSetting(IWMWriterAdvanced3 *iface, DWORD input_num,
305 const WCHAR *name, WMT_ATTR_DATATYPE *time, BYTE *value, WORD *length)
306 {
307 WMWriter *This = impl_from_IWMWriterAdvanced3(iface);
308 FIXME("(%p)->(%u %s %p %p %p)\n", This, input_num, debugstr_w(name), time, value, length);
309 return E_NOTIMPL;
310 }
311
WMWriterAdvanced2_SetInputSetting(IWMWriterAdvanced3 * iface,DWORD input_num,const WCHAR * name,WMT_ATTR_DATATYPE type,const BYTE * value,WORD length)312 static HRESULT WINAPI WMWriterAdvanced2_SetInputSetting(IWMWriterAdvanced3 *iface, DWORD input_num,
313 const WCHAR *name, WMT_ATTR_DATATYPE type, const BYTE *value, WORD length)
314 {
315 WMWriter *This = impl_from_IWMWriterAdvanced3(iface);
316 FIXME("(%p)->(%u %s %d %p %u)\n", This, input_num, debugstr_w(name), type, value, length);
317 return E_NOTIMPL;
318 }
319
WMWriterAdvanced3_GetStatisticsEx(IWMWriterAdvanced3 * iface,WORD stream_num,WM_WRITER_STATISTICS_EX * stats)320 static HRESULT WINAPI WMWriterAdvanced3_GetStatisticsEx(IWMWriterAdvanced3 *iface, WORD stream_num,
321 WM_WRITER_STATISTICS_EX *stats)
322 {
323 WMWriter *This = impl_from_IWMWriterAdvanced3(iface);
324 FIXME("(%p)->(%u %p)\n", This, stream_num, stats);
325 return E_NOTIMPL;
326 }
327
WMWriterAdvanced3_SetNonBlocking(IWMWriterAdvanced3 * iface)328 static HRESULT WINAPI WMWriterAdvanced3_SetNonBlocking(IWMWriterAdvanced3 *iface)
329 {
330 WMWriter *This = impl_from_IWMWriterAdvanced3(iface);
331 FIXME("(%p)\n", This);
332 return E_NOTIMPL;
333 }
334
335 static const IWMWriterAdvanced3Vtbl WMWriterAdvanced3Vtbl = {
336 WMWriterAdvanced_QueryInterface,
337 WMWriterAdvanced_AddRef,
338 WMWriterAdvanced_Release,
339 WMWriterAdvanced_GetSinkCount,
340 WMWriterAdvanced_GetSink,
341 WMWriterAdvanced_AddSink,
342 WMWriterAdvanced_RemoveSink,
343 WMWriterAdvanced_WriteStreamSample,
344 WMWriterAdvanced_SetLiveSource,
345 WMWriterAdvanced_IsRealTime,
346 WMWriterAdvanced_GetWriterTime,
347 WMWriterAdvanced_GetStatistics,
348 WMWriterAdvanced_SetSyncTolerance,
349 WMWriterAdvanced_GetSyncTolerance,
350 WMWriterAdvanced2_GetInputSetting,
351 WMWriterAdvanced2_SetInputSetting,
352 WMWriterAdvanced3_GetStatisticsEx,
353 WMWriterAdvanced3_SetNonBlocking
354 };
355
WMCreateWriter(IUnknown * reserved,IWMWriter ** writer)356 HRESULT WINAPI WMCreateWriter(IUnknown *reserved, IWMWriter **writer)
357 {
358 WMWriter *ret;
359
360 TRACE("(%p %p)\n", reserved, writer);
361
362 ret = heap_alloc(sizeof(*ret));
363 if(!ret)
364 return E_OUTOFMEMORY;
365
366 ret->IWMWriter_iface.lpVtbl = &WMWriterVtbl;
367 ret->IWMWriterAdvanced3_iface.lpVtbl = &WMWriterAdvanced3Vtbl;
368 ret->ref = 1;
369
370 *writer = &ret->IWMWriter_iface;
371 return S_OK;
372 }
373
WMCreateWriterPriv(IWMWriter ** writer)374 HRESULT WINAPI WMCreateWriterPriv(IWMWriter **writer)
375 {
376 return WMCreateWriter(NULL, writer);
377 }
378