xref: /reactos/dll/directx/wine/qedit/timeline.c (revision fc82f8e2)
1 /*              DirectShow Timeline object (QEDIT.DLL)
2  *
3  * Copyright 2016 Alex Henrie
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18  */
19 
20 #include "qedit_private.h"
21 
22 typedef struct {
23     IUnknown IUnknown_inner;
24     IAMTimeline IAMTimeline_iface;
25     IUnknown *outer_unk;
26     LONG ref;
27 } TimelineImpl;
28 
29 static inline TimelineImpl *impl_from_IUnknown(IUnknown *iface)
30 {
31     return CONTAINING_RECORD(iface, TimelineImpl, IUnknown_inner);
32 }
33 
34 static inline TimelineImpl *impl_from_IAMTimeline(IAMTimeline *iface)
35 {
36     return CONTAINING_RECORD(iface, TimelineImpl, IAMTimeline_iface);
37 }
38 
39 typedef struct {
40     IAMTimelineObj IAMTimelineObj_iface;
41     IAMTimelineGroup IAMTimelineGroup_iface;
42     LONG ref;
43     TIMELINE_MAJOR_TYPE timeline_type;
44 } TimelineObjImpl;
45 
46 static inline TimelineObjImpl *impl_from_IAMTimelineObj(IAMTimelineObj *iface)
47 {
48     return CONTAINING_RECORD(iface, TimelineObjImpl, IAMTimelineObj_iface);
49 }
50 
51 static inline TimelineObjImpl *impl_from_IAMTimelineGroup(IAMTimelineGroup *iface)
52 {
53     return CONTAINING_RECORD(iface, TimelineObjImpl, IAMTimelineGroup_iface);
54 }
55 
56 static const IAMTimelineObjVtbl IAMTimelineObj_VTable;
57 static const IAMTimelineGroupVtbl IAMTimelineGroup_VTable;
58 
59 /* Timeline inner IUnknown */
60 
61 static HRESULT WINAPI Timeline_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
62 {
63     TimelineImpl *This = impl_from_IUnknown(iface);
64 
65     TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
66 
67     if (!ppv)
68         return E_POINTER;
69 
70     *ppv = NULL;
71     if (IsEqualIID(riid, &IID_IUnknown))
72         *ppv = &This->IUnknown_inner;
73     else if (IsEqualIID(riid, &IID_IAMTimeline))
74         *ppv = &This->IAMTimeline_iface;
75     else
76         WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppv);
77 
78     if (!*ppv)
79         return E_NOINTERFACE;
80 
81     IUnknown_AddRef((IUnknown*)*ppv);
82     return S_OK;
83 }
84 
85 static ULONG WINAPI Timeline_AddRef(IUnknown *iface)
86 {
87     TimelineImpl *This = impl_from_IUnknown(iface);
88     ULONG ref = InterlockedIncrement(&This->ref);
89 
90     TRACE("(%p) new ref = %u\n", This, ref);
91 
92     return ref;
93 }
94 
95 static ULONG WINAPI Timeline_Release(IUnknown *iface)
96 {
97     TimelineImpl *This = impl_from_IUnknown(iface);
98     ULONG ref = InterlockedDecrement(&This->ref);
99 
100     TRACE("(%p) new ref = %u\n", This, ref);
101 
102     if (ref == 0)
103         CoTaskMemFree(This);
104 
105     return ref;
106 }
107 
108 static const IUnknownVtbl timeline_vtbl =
109 {
110     Timeline_QueryInterface,
111     Timeline_AddRef,
112     Timeline_Release,
113 };
114 
115 /* IAMTimeline implementation */
116 
117 static HRESULT WINAPI Timeline_IAMTimeline_QueryInterface(IAMTimeline *iface, REFIID riid, void **ppv)
118 {
119     TimelineImpl *This = impl_from_IAMTimeline(iface);
120     return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
121 }
122 
123 static ULONG WINAPI Timeline_IAMTimeline_AddRef(IAMTimeline *iface)
124 {
125     TimelineImpl *This = impl_from_IAMTimeline(iface);
126     return IUnknown_AddRef(This->outer_unk);
127 }
128 
129 static ULONG WINAPI Timeline_IAMTimeline_Release(IAMTimeline *iface)
130 {
131     TimelineImpl *This = impl_from_IAMTimeline(iface);
132     return IUnknown_Release(This->outer_unk);
133 }
134 
135 static HRESULT WINAPI Timeline_IAMTimeline_CreateEmptyNode(IAMTimeline *iface, IAMTimelineObj **obj,
136                                                            TIMELINE_MAJOR_TYPE type)
137 {
138     TimelineImpl *This = impl_from_IAMTimeline(iface);
139     TimelineObjImpl* obj_impl;
140 
141     TRACE("(%p)->(%p,%d)\n", This, obj, type);
142 
143     if (!obj)
144         return E_POINTER;
145 
146     switch (type)
147     {
148         case TIMELINE_MAJOR_TYPE_COMPOSITE:
149         case TIMELINE_MAJOR_TYPE_TRACK:
150         case TIMELINE_MAJOR_TYPE_SOURCE:
151         case TIMELINE_MAJOR_TYPE_TRANSITION:
152         case TIMELINE_MAJOR_TYPE_EFFECT:
153         case TIMELINE_MAJOR_TYPE_GROUP:
154             break;
155         default:
156             return E_INVALIDARG;
157     }
158 
159     obj_impl = CoTaskMemAlloc(sizeof(TimelineObjImpl));
160     if (!obj_impl) {
161         *obj = NULL;
162         return E_OUTOFMEMORY;
163     }
164 
165     obj_impl->ref = 1;
166     obj_impl->IAMTimelineObj_iface.lpVtbl = &IAMTimelineObj_VTable;
167     obj_impl->IAMTimelineGroup_iface.lpVtbl = &IAMTimelineGroup_VTable;
168     obj_impl->timeline_type = type;
169 
170     *obj = &obj_impl->IAMTimelineObj_iface;
171     return S_OK;
172 }
173 
174 static HRESULT WINAPI Timeline_IAMTimeline_AddGroup(IAMTimeline *iface, IAMTimelineObj *group)
175 {
176     TimelineImpl *This = impl_from_IAMTimeline(iface);
177     FIXME("(%p)->(%p): not implemented!\n", This, group);
178     return E_NOTIMPL;
179 }
180 
181 static HRESULT WINAPI Timeline_IAMTimeline_RemGroupFromList(IAMTimeline *iface, IAMTimelineObj *group)
182 {
183     TimelineImpl *This = impl_from_IAMTimeline(iface);
184     FIXME("(%p)->(%p): not implemented!\n", This, group);
185     return E_NOTIMPL;
186 }
187 
188 static HRESULT WINAPI Timeline_IAMTimeline_GetGroup(IAMTimeline *iface, IAMTimelineObj **group, LONG index)
189 {
190     TimelineImpl *This = impl_from_IAMTimeline(iface);
191     FIXME("(%p)->(%p,%d): not implemented!\n", This, group, index);
192     return E_NOTIMPL;
193 }
194 
195 static HRESULT WINAPI Timeline_IAMTimeline_GetGroupCount(IAMTimeline *iface, LONG *count)
196 {
197     TimelineImpl *This = impl_from_IAMTimeline(iface);
198     FIXME("(%p)->(%p): not implemented!\n", This, count);
199     return E_NOTIMPL;
200 }
201 
202 static HRESULT WINAPI Timeline_IAMTimeline_ClearAllGroups(IAMTimeline *iface)
203 {
204     TimelineImpl *This = impl_from_IAMTimeline(iface);
205     FIXME("(%p): not implemented!\n", This);
206     return E_NOTIMPL;
207 }
208 
209 static HRESULT WINAPI Timeline_IAMTimeline_GetInsertMode(IAMTimeline *iface, LONG *mode)
210 {
211     TimelineImpl *This = impl_from_IAMTimeline(iface);
212     FIXME("(%p)->(%p): not implemented!\n", This, mode);
213     return E_NOTIMPL;
214 }
215 
216 static HRESULT WINAPI Timeline_IAMTimeline_SetInsertMode(IAMTimeline *iface, LONG mode)
217 {
218     TimelineImpl *This = impl_from_IAMTimeline(iface);
219     FIXME("(%p)->(%d): not implemented!\n", This, mode);
220     return E_NOTIMPL;
221 }
222 
223 static HRESULT WINAPI Timeline_IAMTimeline_EnableTransitions(IAMTimeline *iface, BOOL enabled)
224 {
225     TimelineImpl *This = impl_from_IAMTimeline(iface);
226     FIXME("(%p)->(%d): not implemented!\n", This, enabled);
227     return E_NOTIMPL;
228 }
229 
230 static HRESULT WINAPI Timeline_IAMTimeline_TransitionsEnabled(IAMTimeline *iface, BOOL *enabled)
231 {
232     TimelineImpl *This = impl_from_IAMTimeline(iface);
233     FIXME("(%p)->(%p): not implemented!\n", This, enabled);
234     return E_NOTIMPL;
235 }
236 
237 static HRESULT WINAPI Timeline_IAMTimeline_EnableEffects(IAMTimeline *iface, BOOL enabled)
238 {
239     TimelineImpl *This = impl_from_IAMTimeline(iface);
240     FIXME("(%p)->(%d): not implemented!\n", This, enabled);
241     return E_NOTIMPL;
242 }
243 
244 static HRESULT WINAPI Timeline_IAMTimeline_EffectsEnabled(IAMTimeline *iface, BOOL *enabled)
245 {
246     TimelineImpl *This = impl_from_IAMTimeline(iface);
247     FIXME("(%p)->(%p): not implemented!\n", This, enabled);
248     return E_NOTIMPL;
249 }
250 
251 static HRESULT WINAPI Timeline_IAMTimeline_SetInterestRange(IAMTimeline *iface, REFERENCE_TIME start,
252                                                             REFERENCE_TIME stop)
253 {
254     TimelineImpl *This = impl_from_IAMTimeline(iface);
255     FIXME("(%p)->(%s,%s): not implemented!\n", This, wine_dbgstr_longlong(start),
256           wine_dbgstr_longlong(stop));
257     return E_NOTIMPL;
258 }
259 
260 static HRESULT WINAPI Timeline_IAMTimeline_GetDuration(IAMTimeline *iface, REFERENCE_TIME *duration)
261 {
262     TimelineImpl *This = impl_from_IAMTimeline(iface);
263     FIXME("(%p)->(%p): not implemented!\n", This, duration);
264     return E_NOTIMPL;
265 }
266 
267 static HRESULT WINAPI Timeline_IAMTimeline_GetDuration2(IAMTimeline *iface, double *duration)
268 {
269     TimelineImpl *This = impl_from_IAMTimeline(iface);
270     FIXME("(%p)->(%p): not implemented!\n", This, duration);
271     return E_NOTIMPL;
272 }
273 
274 static HRESULT WINAPI Timeline_IAMTimeline_SetDefaultFPS(IAMTimeline *iface, double fps)
275 {
276     TimelineImpl *This = impl_from_IAMTimeline(iface);
277     FIXME("(%p)->(%f): not implemented!\n", This, fps);
278     return E_NOTIMPL;
279 }
280 
281 static HRESULT WINAPI Timeline_IAMTimeline_GetDefaultFPS(IAMTimeline *iface, double *fps)
282 {
283     TimelineImpl *This = impl_from_IAMTimeline(iface);
284     FIXME("(%p)->(%p): not implemented!\n", This, fps);
285     return E_NOTIMPL;
286 }
287 
288 static HRESULT WINAPI Timeline_IAMTimeline_IsDirty(IAMTimeline *iface, BOOL *dirty)
289 {
290     TimelineImpl *This = impl_from_IAMTimeline(iface);
291     FIXME("(%p)->(%p): not implemented!\n", This, dirty);
292     return E_NOTIMPL;
293 }
294 
295 static HRESULT WINAPI Timeline_IAMTimeline_GetDirtyRange(IAMTimeline *iface, REFERENCE_TIME *start,
296                                                          REFERENCE_TIME *stop)
297 {
298     TimelineImpl *This = impl_from_IAMTimeline(iface);
299     FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
300     return E_NOTIMPL;
301 }
302 
303 static HRESULT WINAPI Timeline_IAMTimeline_GetCountOfType(IAMTimeline *iface, LONG group, LONG *value,
304                                                           LONG *value_with_comps, TIMELINE_MAJOR_TYPE type)
305 {
306     TimelineImpl *This = impl_from_IAMTimeline(iface);
307     FIXME("(%p)->(%d,%p,%p,%04x): not implemented!\n", This, group, value, value_with_comps, type);
308     return E_NOTIMPL;
309 }
310 
311 static HRESULT WINAPI Timeline_IAMTimeline_ValidateSourceNames(IAMTimeline *iface, LONG flags, IMediaLocator *override,
312                                                                LONG_PTR notify_event)
313 {
314     TimelineImpl *This = impl_from_IAMTimeline(iface);
315     FIXME("(%p)->(%d,%p,%lx): not implemented!\n", This, flags, override, notify_event);
316     return E_NOTIMPL;
317 }
318 
319 static HRESULT WINAPI Timeline_IAMTimeline_SetDefaultTransition(IAMTimeline *iface, GUID *guid)
320 {
321     TimelineImpl *This = impl_from_IAMTimeline(iface);
322     FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_guid(guid));
323     return E_NOTIMPL;
324 }
325 
326 static HRESULT WINAPI Timeline_IAMTimeline_GetDefaultTransition(IAMTimeline *iface, GUID *guid)
327 {
328     TimelineImpl *This = impl_from_IAMTimeline(iface);
329     FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_guid(guid));
330     return E_NOTIMPL;
331 }
332 
333 static HRESULT WINAPI Timeline_IAMTimeline_SetDefaultEffect(IAMTimeline *iface, GUID *guid)
334 {
335     TimelineImpl *This = impl_from_IAMTimeline(iface);
336     FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_guid(guid));
337     return E_NOTIMPL;
338 }
339 
340 static HRESULT WINAPI Timeline_IAMTimeline_GetDefaultEffect(IAMTimeline *iface, GUID *guid)
341 {
342     TimelineImpl *This = impl_from_IAMTimeline(iface);
343     FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_guid(guid));
344     return E_NOTIMPL;
345 }
346 
347 static HRESULT WINAPI Timeline_IAMTimeline_SetDefaultTransitionB(IAMTimeline *iface, BSTR guidb)
348 {
349     TimelineImpl *This = impl_from_IAMTimeline(iface);
350     FIXME("(%p)->(%p): not implemented!\n", This, guidb);
351     return E_NOTIMPL;
352 }
353 
354 static HRESULT WINAPI Timeline_IAMTimeline_GetDefaultTransitionB(IAMTimeline *iface, BSTR *guidb)
355 {
356     TimelineImpl *This = impl_from_IAMTimeline(iface);
357     FIXME("(%p)->(%p): not implemented!\n", This, guidb);
358     return E_NOTIMPL;
359 }
360 
361 static HRESULT WINAPI Timeline_IAMTimeline_SetDefaultEffectB(IAMTimeline *iface, BSTR guidb)
362 {
363     TimelineImpl *This = impl_from_IAMTimeline(iface);
364     FIXME("(%p)->(%p): not implemented!\n", This, guidb);
365     return E_NOTIMPL;
366 }
367 
368 static HRESULT WINAPI Timeline_IAMTimeline_GetDefaultEffectB(IAMTimeline *iface, BSTR *guidb)
369 {
370     TimelineImpl *This = impl_from_IAMTimeline(iface);
371     FIXME("(%p)->(%p): not implemented!\n", This, guidb);
372     return E_NOTIMPL;
373 }
374 
375 static const IAMTimelineVtbl IAMTimeline_VTable =
376 {
377     Timeline_IAMTimeline_QueryInterface,
378     Timeline_IAMTimeline_AddRef,
379     Timeline_IAMTimeline_Release,
380     Timeline_IAMTimeline_CreateEmptyNode,
381     Timeline_IAMTimeline_AddGroup,
382     Timeline_IAMTimeline_RemGroupFromList,
383     Timeline_IAMTimeline_GetGroup,
384     Timeline_IAMTimeline_GetGroupCount,
385     Timeline_IAMTimeline_ClearAllGroups,
386     Timeline_IAMTimeline_GetInsertMode,
387     Timeline_IAMTimeline_SetInsertMode,
388     Timeline_IAMTimeline_EnableTransitions,
389     Timeline_IAMTimeline_TransitionsEnabled,
390     Timeline_IAMTimeline_EnableEffects,
391     Timeline_IAMTimeline_EffectsEnabled,
392     Timeline_IAMTimeline_SetInterestRange,
393     Timeline_IAMTimeline_GetDuration,
394     Timeline_IAMTimeline_GetDuration2,
395     Timeline_IAMTimeline_SetDefaultFPS,
396     Timeline_IAMTimeline_GetDefaultFPS,
397     Timeline_IAMTimeline_IsDirty,
398     Timeline_IAMTimeline_GetDirtyRange,
399     Timeline_IAMTimeline_GetCountOfType,
400     Timeline_IAMTimeline_ValidateSourceNames,
401     Timeline_IAMTimeline_SetDefaultTransition,
402     Timeline_IAMTimeline_GetDefaultTransition,
403     Timeline_IAMTimeline_SetDefaultEffect,
404     Timeline_IAMTimeline_GetDefaultEffect,
405     Timeline_IAMTimeline_SetDefaultTransitionB,
406     Timeline_IAMTimeline_GetDefaultTransitionB,
407     Timeline_IAMTimeline_SetDefaultEffectB,
408     Timeline_IAMTimeline_GetDefaultEffectB,
409 };
410 
411 HRESULT AMTimeline_create(IUnknown *pUnkOuter, LPVOID *ppv)
412 {
413     TimelineImpl* obj = NULL;
414 
415     TRACE("(%p,%p)\n", pUnkOuter, ppv);
416 
417     obj = CoTaskMemAlloc(sizeof(TimelineImpl));
418     if (NULL == obj) {
419         *ppv = NULL;
420         return E_OUTOFMEMORY;
421     }
422     ZeroMemory(obj, sizeof(TimelineImpl));
423 
424     obj->ref = 1;
425     obj->IUnknown_inner.lpVtbl = &timeline_vtbl;
426     obj->IAMTimeline_iface.lpVtbl = &IAMTimeline_VTable;
427 
428     if (pUnkOuter)
429         obj->outer_unk = pUnkOuter;
430     else
431         obj->outer_unk = &obj->IUnknown_inner;
432 
433     *ppv = &obj->IUnknown_inner;
434     return S_OK;
435 }
436 
437 /* IAMTimelineObj implementation */
438 
439 static HRESULT WINAPI TimelineObj_QueryInterface(IAMTimelineObj *iface, REFIID riid, void **ppv)
440 {
441     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
442 
443     TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
444 
445     if (!ppv)
446         return E_POINTER;
447 
448     *ppv = NULL;
449     if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IAMTimelineObj))
450         *ppv = &This->IAMTimelineObj_iface;
451     else if (IsEqualIID(riid, &IID_IAMTimelineGroup))
452         *ppv = &This->IAMTimelineGroup_iface;
453     else
454         WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppv);
455 
456     if (!*ppv)
457         return E_NOINTERFACE;
458 
459     IUnknown_AddRef((IUnknown*)*ppv);
460     return S_OK;
461 }
462 
463 static ULONG WINAPI TimelineObj_AddRef(IAMTimelineObj *iface)
464 {
465     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
466     ULONG ref = InterlockedIncrement(&This->ref);
467 
468     TRACE("(%p) new ref = %u\n", This, ref);
469 
470     return ref;
471 }
472 
473 static ULONG WINAPI TimelineObj_Release(IAMTimelineObj *iface)
474 {
475     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
476     ULONG ref = InterlockedDecrement(&This->ref);
477 
478     TRACE("(%p) new ref = %u\n", This, ref);
479 
480     if (!ref)
481         CoTaskMemFree(This);
482 
483     return ref;
484 }
485 
486 static HRESULT WINAPI TimelineObj_GetStartStop(IAMTimelineObj *iface, REFERENCE_TIME *start, REFERENCE_TIME *stop)
487 {
488     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
489     FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
490     return E_NOTIMPL;
491 }
492 
493 static HRESULT WINAPI TimelineObj_GetStartStop2(IAMTimelineObj *iface, REFTIME *start, REFTIME *stop)
494 {
495     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
496     FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
497     return E_NOTIMPL;
498 }
499 
500 static HRESULT WINAPI TimelineObj_FixTimes(IAMTimelineObj *iface, REFERENCE_TIME *start, REFERENCE_TIME *stop)
501 {
502     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
503     FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
504     return E_NOTIMPL;
505 }
506 
507 static HRESULT WINAPI TimelineObj_FixTimes2(IAMTimelineObj *iface, REFTIME *start, REFTIME *stop)
508 {
509     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
510     FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
511     return E_NOTIMPL;
512 }
513 
514 static HRESULT WINAPI TimelineObj_SetStartStop(IAMTimelineObj *iface, REFERENCE_TIME start, REFERENCE_TIME stop)
515 {
516     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
517     FIXME("(%p)->(%s,%s): not implemented!\n", This, wine_dbgstr_longlong(start), wine_dbgstr_longlong(stop));
518     return E_NOTIMPL;
519 }
520 
521 static HRESULT WINAPI TimelineObj_SetStartStop2(IAMTimelineObj *iface, REFTIME start, REFTIME stop)
522 {
523     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
524     FIXME("(%p)->(%f,%f): not implemented!\n", This, start, stop);
525     return E_NOTIMPL;
526 }
527 
528 static HRESULT WINAPI TimelineObj_GetPropertySetter(IAMTimelineObj *iface, IPropertySetter **setter)
529 {
530     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
531     FIXME("(%p)->(%p): not implemented!\n", This, setter);
532     return E_NOTIMPL;
533 }
534 
535 static HRESULT WINAPI TimelineObj_SetPropertySetter(IAMTimelineObj *iface, IPropertySetter *setter)
536 {
537     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
538     FIXME("(%p)->(%p): not implemented!\n", This, setter);
539     return E_NOTIMPL;
540 }
541 
542 static HRESULT WINAPI TimelineObj_GetSubObject(IAMTimelineObj *iface, IUnknown **obj)
543 {
544     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
545     FIXME("(%p)->(%p): not implemented!\n", This, obj);
546     return E_NOTIMPL;
547 }
548 
549 static HRESULT WINAPI TimelineObj_SetSubObject(IAMTimelineObj *iface, IUnknown *obj)
550 {
551     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
552     FIXME("(%p)->(%p): not implemented!\n", This, obj);
553     return E_NOTIMPL;
554 }
555 
556 static HRESULT WINAPI TimelineObj_SetSubObjectGUID(IAMTimelineObj *iface, GUID guid)
557 {
558     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
559     FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_guid(&guid));
560     return E_NOTIMPL;
561 }
562 
563 static HRESULT WINAPI TimelineObj_SetSubObjectGUIDB(IAMTimelineObj *iface, BSTR guidb)
564 {
565     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
566     FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_w(guidb));
567     return E_NOTIMPL;
568 }
569 
570 static HRESULT WINAPI TimelineObj_GetSubObjectGUID(IAMTimelineObj *iface, GUID *guid)
571 {
572     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
573     FIXME("(%p)->(%p): not implemented!\n", This, guid);
574     return E_NOTIMPL;
575 }
576 
577 static HRESULT WINAPI TimelineObj_GetSubObjectGUIDB(IAMTimelineObj *iface, BSTR *guidb)
578 {
579     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
580     FIXME("(%p)->(%p): not implemented!\n", This, guidb);
581     return E_NOTIMPL;
582 }
583 
584 static HRESULT WINAPI TimelineObj_GetSubObjectLoaded(IAMTimelineObj *iface, BOOL *loaded)
585 {
586     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
587     FIXME("(%p)->(%p): not implemented!\n", This, loaded);
588     return E_NOTIMPL;
589 }
590 
591 static HRESULT WINAPI TimelineObj_GetTimelineType(IAMTimelineObj *iface, TIMELINE_MAJOR_TYPE *type)
592 {
593     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
594     TRACE("(%p)->(%p)\n", This, type);
595     if (!type) return E_POINTER;
596     *type = This->timeline_type;
597     return S_OK;
598 }
599 
600 static HRESULT WINAPI TimelineObj_SetTimelineType(IAMTimelineObj *iface, TIMELINE_MAJOR_TYPE type)
601 {
602     /* MSDN says that this function is "not supported" */
603     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
604     TRACE("(%p)->(%d)\n", This, type);
605     if (type != This->timeline_type) return E_INVALIDARG;
606     return S_OK;
607 }
608 
609 static HRESULT WINAPI TimelineObj_GetUserID(IAMTimelineObj *iface, LONG *id)
610 {
611     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
612     FIXME("(%p)->(%p): not implemented!\n", This, id);
613     return E_NOTIMPL;
614 }
615 
616 static HRESULT WINAPI TimelineObj_SetUserID(IAMTimelineObj *iface, LONG id)
617 {
618     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
619     FIXME("(%p)->(%d): not implemented!\n", This, id);
620     return E_NOTIMPL;
621 }
622 
623 static HRESULT WINAPI TimelineObj_GetGenID(IAMTimelineObj *iface, LONG *id)
624 {
625     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
626     FIXME("(%p)->(%p): not implemented!\n", This, id);
627     return E_NOTIMPL;
628 }
629 
630 static HRESULT WINAPI TimelineObj_GetUserName(IAMTimelineObj *iface, BSTR *name)
631 {
632     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
633     FIXME("(%p)->(%p): not implemented!\n", This, name);
634     return E_NOTIMPL;
635 }
636 
637 static HRESULT WINAPI TimelineObj_SetUserName(IAMTimelineObj *iface, BSTR name)
638 {
639     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
640     FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_w(name));
641     return E_NOTIMPL;
642 }
643 
644 static HRESULT WINAPI TimelineObj_GetUserData(IAMTimelineObj *iface, BYTE *data, LONG *size)
645 {
646     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
647     FIXME("(%p)->(%p,%p): not implemented!\n", This, data, size);
648     return E_NOTIMPL;
649 }
650 
651 static HRESULT WINAPI TimelineObj_SetUserData(IAMTimelineObj *iface, BYTE *data, LONG size)
652 {
653     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
654     FIXME("(%p)->(%p,%d): not implemented!\n", This, data, size);
655     return E_NOTIMPL;
656 }
657 
658 static HRESULT WINAPI TimelineObj_GetMuted(IAMTimelineObj *iface, BOOL *muted)
659 {
660     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
661     FIXME("(%p)->(%p): not implemented!\n", This, muted);
662     return E_NOTIMPL;
663 }
664 
665 static HRESULT WINAPI TimelineObj_SetMuted(IAMTimelineObj *iface, BOOL muted)
666 {
667     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
668     FIXME("(%p)->(%d): not implemented!\n", This, muted);
669     return E_NOTIMPL;
670 }
671 
672 static HRESULT WINAPI TimelineObj_GetLocked(IAMTimelineObj *iface, BOOL *locked)
673 {
674     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
675     FIXME("(%p)->(%p): not implemented!\n", This, locked);
676     return E_NOTIMPL;
677 }
678 
679 static HRESULT WINAPI TimelineObj_SetLocked(IAMTimelineObj *iface, BOOL locked)
680 {
681     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
682     FIXME("(%p)->(%d): not implemented!\n", This, locked);
683     return E_NOTIMPL;
684 }
685 
686 static HRESULT WINAPI TimelineObj_GetDirtyRange(IAMTimelineObj *iface, REFERENCE_TIME *start, REFERENCE_TIME *stop)
687 {
688     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
689     FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
690     return E_NOTIMPL;
691 }
692 
693 static HRESULT WINAPI TimelineObj_GetDirtyRange2(IAMTimelineObj *iface, REFTIME *start, REFTIME *stop)
694 {
695     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
696     FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
697     return E_NOTIMPL;
698 }
699 
700 static HRESULT WINAPI TimelineObj_SetDirtyRange(IAMTimelineObj *iface, REFERENCE_TIME start, REFERENCE_TIME stop)
701 {
702     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
703     FIXME("(%p)->(%s,%s): not implemented!\n", This, wine_dbgstr_longlong(start), wine_dbgstr_longlong(stop));
704     return E_NOTIMPL;
705 }
706 
707 static HRESULT WINAPI TimelineObj_SetDirtyRange2(IAMTimelineObj *iface, REFTIME start, REFTIME stop)
708 {
709     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
710     FIXME("(%p)->(%f,%f): not implemented!\n", This, start, stop);
711     return E_NOTIMPL;
712 }
713 
714 static HRESULT WINAPI TimelineObj_ClearDirty(IAMTimelineObj *iface)
715 {
716     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
717     FIXME("(%p): not implemented!\n", This);
718     return E_NOTIMPL;
719 }
720 
721 static HRESULT WINAPI TimelineObj_Remove(IAMTimelineObj *iface)
722 {
723     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
724     FIXME("(%p): not implemented!\n", This);
725     return E_NOTIMPL;
726 }
727 
728 static HRESULT WINAPI TimelineObj_RemoveAll(IAMTimelineObj *iface)
729 {
730     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
731     FIXME("(%p): not implemented!\n", This);
732     return E_NOTIMPL;
733 }
734 
735 static HRESULT WINAPI TimelineObj_GetTimelineNoRef(IAMTimelineObj *iface, IAMTimeline **timeline)
736 {
737     /* MSDN says that this function is "not supported" */
738     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
739     TRACE("(%p)->(%p)\n", This, timeline);
740     if (!timeline) return E_POINTER;
741     *timeline = NULL;
742     return E_NOINTERFACE;
743 }
744 
745 static HRESULT WINAPI TimelineObj_GetGroupIBelongTo(IAMTimelineObj *iface, IAMTimelineGroup **group)
746 {
747     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
748     FIXME("(%p)->(%p): not implemented!\n", This, group);
749     return E_NOTIMPL;
750 }
751 
752 static HRESULT WINAPI TimelineObj_GetEmbedDepth(IAMTimelineObj *iface, LONG *depth)
753 {
754     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
755     FIXME("(%p)->(%p): not implemented!\n", This, depth);
756     return E_NOTIMPL;
757 }
758 
759 static const IAMTimelineObjVtbl IAMTimelineObj_VTable =
760 {
761     TimelineObj_QueryInterface,
762     TimelineObj_AddRef,
763     TimelineObj_Release,
764     TimelineObj_GetStartStop,
765     TimelineObj_GetStartStop2,
766     TimelineObj_FixTimes,
767     TimelineObj_FixTimes2,
768     TimelineObj_SetStartStop,
769     TimelineObj_SetStartStop2,
770     TimelineObj_GetPropertySetter,
771     TimelineObj_SetPropertySetter,
772     TimelineObj_GetSubObject,
773     TimelineObj_SetSubObject,
774     TimelineObj_SetSubObjectGUID,
775     TimelineObj_SetSubObjectGUIDB,
776     TimelineObj_GetSubObjectGUID,
777     TimelineObj_GetSubObjectGUIDB,
778     TimelineObj_GetSubObjectLoaded,
779     TimelineObj_GetTimelineType,
780     TimelineObj_SetTimelineType,
781     TimelineObj_GetUserID,
782     TimelineObj_SetUserID,
783     TimelineObj_GetGenID,
784     TimelineObj_GetUserName,
785     TimelineObj_SetUserName,
786     TimelineObj_GetUserData,
787     TimelineObj_SetUserData,
788     TimelineObj_GetMuted,
789     TimelineObj_SetMuted,
790     TimelineObj_GetLocked,
791     TimelineObj_SetLocked,
792     TimelineObj_GetDirtyRange,
793     TimelineObj_GetDirtyRange2,
794     TimelineObj_SetDirtyRange,
795     TimelineObj_SetDirtyRange2,
796     TimelineObj_ClearDirty,
797     TimelineObj_Remove,
798     TimelineObj_RemoveAll,
799     TimelineObj_GetTimelineNoRef,
800     TimelineObj_GetGroupIBelongTo,
801     TimelineObj_GetEmbedDepth,
802 };
803 
804 static HRESULT WINAPI timelinegrp_QueryInterface(IAMTimelineGroup *iface, REFIID riid, void **object)
805 {
806     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
807     return IAMTimelineObj_QueryInterface(&This->IAMTimelineObj_iface, riid, object);
808 }
809 
810 static ULONG WINAPI timelinegrp_AddRef(IAMTimelineGroup *iface)
811 {
812     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
813     return IAMTimelineObj_AddRef(&This->IAMTimelineObj_iface);
814 }
815 
816 static ULONG WINAPI timelinegrp_Release(IAMTimelineGroup *iface)
817 {
818     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
819     return IAMTimelineObj_Release(&This->IAMTimelineObj_iface);
820 }
821 
822 static HRESULT WINAPI timelinegrp_SetTimeline(IAMTimelineGroup *iface, IAMTimeline *timeline)
823 {
824     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
825     FIXME("(%p)->(%p)\n", This, timeline);
826     return E_NOTIMPL;
827 }
828 
829 static HRESULT WINAPI timelinegrp_GetTimeline(IAMTimelineGroup *iface, IAMTimeline **timeline)
830 {
831     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
832     FIXME("(%p)->(%p)\n", This, timeline);
833     return E_NOTIMPL;
834 }
835 
836 static HRESULT WINAPI timelinegrp_GetPriority(IAMTimelineGroup *iface, LONG *priority)
837 {
838     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
839     FIXME("(%p)->(%p)\n", This, priority);
840     return E_NOTIMPL;
841 }
842 
843 static HRESULT WINAPI timelinegrp_GetMediaType(IAMTimelineGroup *iface, AM_MEDIA_TYPE *mediatype)
844 {
845     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
846     FIXME("(%p)->(%p)\n", This, mediatype);
847     return E_NOTIMPL;
848 }
849 
850 static HRESULT WINAPI timelinegrp_SetMediaType(IAMTimelineGroup *iface, AM_MEDIA_TYPE *mediatype)
851 {
852     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
853     FIXME("(%p)->(%p)\n", This, mediatype);
854     return E_NOTIMPL;
855 }
856 
857 static HRESULT WINAPI timelinegrp_SetOutputFPS(IAMTimelineGroup *iface, double fps)
858 {
859     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
860     FIXME("(%p)->(%f)\n", This, fps);
861     return E_NOTIMPL;
862 }
863 
864 static HRESULT WINAPI timelinegrp_GetOutputFPS(IAMTimelineGroup *iface, double *fps)
865 {
866     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
867     FIXME("(%p)->(%p)\n", This, fps);
868     return E_NOTIMPL;
869 }
870 
871 static HRESULT WINAPI timelinegrp_SetGroupName(IAMTimelineGroup *iface, BSTR name)
872 {
873     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
874     FIXME("(%p)->(%s)\n", This, debugstr_w(name));
875     return E_NOTIMPL;
876 }
877 
878 static HRESULT WINAPI timelinegrp_GetGroupName(IAMTimelineGroup *iface, BSTR *name)
879 {
880     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
881     FIXME("(%p)->(%p)\n", This, name);
882     return E_NOTIMPL;
883 }
884 
885 static HRESULT WINAPI timelinegrp_SetPreviewMode(IAMTimelineGroup *iface, BOOL preview)
886 {
887     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
888     FIXME("(%p)->(%d)\n", This, preview);
889     return E_NOTIMPL;
890 }
891 
892 static HRESULT WINAPI timelinegrp_GetPreviewMode(IAMTimelineGroup *iface, BOOL *preview)
893 {
894     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
895     FIXME("(%p)->(%p)\n", This, preview);
896     return E_NOTIMPL;
897 }
898 
899 static HRESULT WINAPI timelinegrp_SetMediaTypeForVB(IAMTimelineGroup *iface, LONG type)
900 {
901     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
902     FIXME("(%p)->(%d)\n", This, type);
903     return E_NOTIMPL;
904 }
905 
906 static HRESULT WINAPI timelinegrp_GetOutputBuffering(IAMTimelineGroup *iface, int *buffer)
907 {
908     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
909     FIXME("(%p)->(%p)\n", This, buffer);
910     return E_NOTIMPL;
911 }
912 
913 static HRESULT WINAPI timelinegrp_SetOutputBuffering(IAMTimelineGroup *iface, int buffer)
914 {
915     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
916     FIXME("(%p)->(%d)\n", This, buffer);
917     return E_NOTIMPL;
918 }
919 
920 static HRESULT WINAPI timelinegrp_SetSmartRecompressFormat(IAMTimelineGroup *iface, LONG *format)
921 {
922     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
923     FIXME("(%p)->(%p)\n", This, format);
924     return E_NOTIMPL;
925 }
926 
927 static HRESULT WINAPI timelinegrp_GetSmartRecompressFormat(IAMTimelineGroup *iface, LONG **format)
928 {
929     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
930     FIXME("(%p)->(%p)\n", This, format);
931     return E_NOTIMPL;
932 }
933 
934 static HRESULT WINAPI timelinegrp_IsSmartRecompressFormatSet(IAMTimelineGroup *iface, BOOL *set)
935 {
936     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
937     FIXME("(%p)->(%p)\n", This, set);
938     return E_NOTIMPL;
939 }
940 
941 static HRESULT WINAPI timelinegrp_IsRecompressFormatDirty(IAMTimelineGroup *iface, BOOL *dirty)
942 {
943     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
944     FIXME("(%p)->(%p)\n", This, dirty);
945     return E_NOTIMPL;
946 }
947 
948 static HRESULT WINAPI timelinegrp_ClearRecompressFormatDirty(IAMTimelineGroup *iface)
949 {
950     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
951     FIXME("(%p)->()\n", This);
952     return E_NOTIMPL;
953 }
954 
955 static HRESULT WINAPI timelinegrp_SetRecompFormatFromSource(IAMTimelineGroup *iface, IAMTimelineSrc *source)
956 {
957     TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
958     FIXME("(%p)->(%p)\n", This, source);
959     return E_NOTIMPL;
960 }
961 
962 static const IAMTimelineGroupVtbl IAMTimelineGroup_VTable =
963 {
964     timelinegrp_QueryInterface,
965     timelinegrp_AddRef,
966     timelinegrp_Release,
967     timelinegrp_SetTimeline,
968     timelinegrp_GetTimeline,
969     timelinegrp_GetPriority,
970     timelinegrp_GetMediaType,
971     timelinegrp_SetMediaType,
972     timelinegrp_SetOutputFPS,
973     timelinegrp_GetOutputFPS,
974     timelinegrp_SetGroupName,
975     timelinegrp_GetGroupName,
976     timelinegrp_SetPreviewMode,
977     timelinegrp_GetPreviewMode,
978     timelinegrp_SetMediaTypeForVB,
979     timelinegrp_GetOutputBuffering,
980     timelinegrp_SetOutputBuffering,
981     timelinegrp_SetSmartRecompressFormat,
982     timelinegrp_GetSmartRecompressFormat,
983     timelinegrp_IsSmartRecompressFormatSet,
984     timelinegrp_IsRecompressFormatDirty,
985     timelinegrp_ClearRecompressFormatDirty,
986     timelinegrp_SetRecompFormatFromSource
987 };
988