xref: /reactos/dll/directx/wine/qedit/timeline.c (revision c2c66aff)
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     LONG ref;
42     TIMELINE_MAJOR_TYPE timeline_type;
43 } TimelineObjImpl;
44 
45 static inline TimelineObjImpl *impl_from_IAMTimelineObj(IAMTimelineObj *iface)
46 {
47     return CONTAINING_RECORD(iface, TimelineObjImpl, IAMTimelineObj_iface);
48 }
49 
50 static const IAMTimelineObjVtbl IAMTimelineObj_VTable;
51 
52 /* Timeline inner IUnknown */
53 
54 static HRESULT WINAPI Timeline_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
55 {
56     TimelineImpl *This = impl_from_IUnknown(iface);
57 
58     TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
59 
60     if (!ppv)
61         return E_POINTER;
62 
63     *ppv = NULL;
64     if (IsEqualIID(riid, &IID_IUnknown))
65         *ppv = &This->IUnknown_inner;
66     else if (IsEqualIID(riid, &IID_IAMTimeline))
67         *ppv = &This->IAMTimeline_iface;
68     else
69         WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppv);
70 
71     if (!*ppv)
72         return E_NOINTERFACE;
73 
74     IUnknown_AddRef((IUnknown*)*ppv);
75     return S_OK;
76 }
77 
78 static ULONG WINAPI Timeline_AddRef(IUnknown *iface)
79 {
80     TimelineImpl *This = impl_from_IUnknown(iface);
81     ULONG ref = InterlockedIncrement(&This->ref);
82 
83     TRACE("(%p) new ref = %u\n", This, ref);
84 
85     return ref;
86 }
87 
88 static ULONG WINAPI Timeline_Release(IUnknown *iface)
89 {
90     TimelineImpl *This = impl_from_IUnknown(iface);
91     ULONG ref = InterlockedDecrement(&This->ref);
92 
93     TRACE("(%p) new ref = %u\n", This, ref);
94 
95     if (ref == 0)
96         CoTaskMemFree(This);
97 
98     return ref;
99 }
100 
101 static const IUnknownVtbl timeline_vtbl =
102 {
103     Timeline_QueryInterface,
104     Timeline_AddRef,
105     Timeline_Release,
106 };
107 
108 /* IAMTimeline implementation */
109 
110 static HRESULT WINAPI Timeline_IAMTimeline_QueryInterface(IAMTimeline *iface, REFIID riid, void **ppv)
111 {
112     TimelineImpl *This = impl_from_IAMTimeline(iface);
113     return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
114 }
115 
116 static ULONG WINAPI Timeline_IAMTimeline_AddRef(IAMTimeline *iface)
117 {
118     TimelineImpl *This = impl_from_IAMTimeline(iface);
119     return IUnknown_AddRef(This->outer_unk);
120 }
121 
122 static ULONG WINAPI Timeline_IAMTimeline_Release(IAMTimeline *iface)
123 {
124     TimelineImpl *This = impl_from_IAMTimeline(iface);
125     return IUnknown_Release(This->outer_unk);
126 }
127 
128 static HRESULT WINAPI Timeline_IAMTimeline_CreateEmptyNode(IAMTimeline *iface, IAMTimelineObj **obj,
129                                                            TIMELINE_MAJOR_TYPE type)
130 {
131     TimelineImpl *This = impl_from_IAMTimeline(iface);
132     TimelineObjImpl* obj_impl;
133 
134     TRACE("(%p)->(%p,%d)\n", This, obj, type);
135 
136     if (!obj)
137         return E_POINTER;
138 
139     switch (type)
140     {
141         case TIMELINE_MAJOR_TYPE_COMPOSITE:
142         case TIMELINE_MAJOR_TYPE_TRACK:
143         case TIMELINE_MAJOR_TYPE_SOURCE:
144         case TIMELINE_MAJOR_TYPE_TRANSITION:
145         case TIMELINE_MAJOR_TYPE_EFFECT:
146         case TIMELINE_MAJOR_TYPE_GROUP:
147             break;
148         default:
149             return E_INVALIDARG;
150     }
151 
152     obj_impl = CoTaskMemAlloc(sizeof(TimelineObjImpl));
153     if (!obj_impl) {
154         *obj = NULL;
155         return E_OUTOFMEMORY;
156     }
157 
158     obj_impl->ref = 1;
159     obj_impl->IAMTimelineObj_iface.lpVtbl = &IAMTimelineObj_VTable;
160     obj_impl->timeline_type = type;
161 
162     *obj = &obj_impl->IAMTimelineObj_iface;
163     return S_OK;
164 }
165 
166 static HRESULT WINAPI Timeline_IAMTimeline_AddGroup(IAMTimeline *iface, IAMTimelineObj *group)
167 {
168     TimelineImpl *This = impl_from_IAMTimeline(iface);
169     FIXME("(%p)->(%p): not implemented!\n", This, group);
170     return E_NOTIMPL;
171 }
172 
173 static HRESULT WINAPI Timeline_IAMTimeline_RemGroupFromList(IAMTimeline *iface, IAMTimelineObj *group)
174 {
175     TimelineImpl *This = impl_from_IAMTimeline(iface);
176     FIXME("(%p)->(%p): not implemented!\n", This, group);
177     return E_NOTIMPL;
178 }
179 
180 static HRESULT WINAPI Timeline_IAMTimeline_GetGroup(IAMTimeline *iface, IAMTimelineObj **group, LONG index)
181 {
182     TimelineImpl *This = impl_from_IAMTimeline(iface);
183     FIXME("(%p)->(%p,%d): not implemented!\n", This, group, index);
184     return E_NOTIMPL;
185 }
186 
187 static HRESULT WINAPI Timeline_IAMTimeline_GetGroupCount(IAMTimeline *iface, LONG *count)
188 {
189     TimelineImpl *This = impl_from_IAMTimeline(iface);
190     FIXME("(%p)->(%p): not implemented!\n", This, count);
191     return E_NOTIMPL;
192 }
193 
194 static HRESULT WINAPI Timeline_IAMTimeline_ClearAllGroups(IAMTimeline *iface)
195 {
196     TimelineImpl *This = impl_from_IAMTimeline(iface);
197     FIXME("(%p): not implemented!\n", This);
198     return E_NOTIMPL;
199 }
200 
201 static HRESULT WINAPI Timeline_IAMTimeline_GetInsertMode(IAMTimeline *iface, LONG *mode)
202 {
203     TimelineImpl *This = impl_from_IAMTimeline(iface);
204     FIXME("(%p)->(%p): not implemented!\n", This, mode);
205     return E_NOTIMPL;
206 }
207 
208 static HRESULT WINAPI Timeline_IAMTimeline_SetInsertMode(IAMTimeline *iface, LONG mode)
209 {
210     TimelineImpl *This = impl_from_IAMTimeline(iface);
211     FIXME("(%p)->(%d): not implemented!\n", This, mode);
212     return E_NOTIMPL;
213 }
214 
215 static HRESULT WINAPI Timeline_IAMTimeline_EnableTransitions(IAMTimeline *iface, BOOL enabled)
216 {
217     TimelineImpl *This = impl_from_IAMTimeline(iface);
218     FIXME("(%p)->(%d): not implemented!\n", This, enabled);
219     return E_NOTIMPL;
220 }
221 
222 static HRESULT WINAPI Timeline_IAMTimeline_TransitionsEnabled(IAMTimeline *iface, BOOL *enabled)
223 {
224     TimelineImpl *This = impl_from_IAMTimeline(iface);
225     FIXME("(%p)->(%p): not implemented!\n", This, enabled);
226     return E_NOTIMPL;
227 }
228 
229 static HRESULT WINAPI Timeline_IAMTimeline_EnableEffects(IAMTimeline *iface, BOOL enabled)
230 {
231     TimelineImpl *This = impl_from_IAMTimeline(iface);
232     FIXME("(%p)->(%d): not implemented!\n", This, enabled);
233     return E_NOTIMPL;
234 }
235 
236 static HRESULT WINAPI Timeline_IAMTimeline_EffectsEnabled(IAMTimeline *iface, BOOL *enabled)
237 {
238     TimelineImpl *This = impl_from_IAMTimeline(iface);
239     FIXME("(%p)->(%p): not implemented!\n", This, enabled);
240     return E_NOTIMPL;
241 }
242 
243 static HRESULT WINAPI Timeline_IAMTimeline_SetInterestRange(IAMTimeline *iface, REFERENCE_TIME start,
244                                                             REFERENCE_TIME stop)
245 {
246     TimelineImpl *This = impl_from_IAMTimeline(iface);
247     FIXME("(%p)->(%s,%s): not implemented!\n", This, wine_dbgstr_longlong(start),
248           wine_dbgstr_longlong(stop));
249     return E_NOTIMPL;
250 }
251 
252 static HRESULT WINAPI Timeline_IAMTimeline_GetDuration(IAMTimeline *iface, REFERENCE_TIME *duration)
253 {
254     TimelineImpl *This = impl_from_IAMTimeline(iface);
255     FIXME("(%p)->(%p): not implemented!\n", This, duration);
256     return E_NOTIMPL;
257 }
258 
259 static HRESULT WINAPI Timeline_IAMTimeline_GetDuration2(IAMTimeline *iface, double *duration)
260 {
261     TimelineImpl *This = impl_from_IAMTimeline(iface);
262     FIXME("(%p)->(%p): not implemented!\n", This, duration);
263     return E_NOTIMPL;
264 }
265 
266 static HRESULT WINAPI Timeline_IAMTimeline_SetDefaultFPS(IAMTimeline *iface, double fps)
267 {
268     TimelineImpl *This = impl_from_IAMTimeline(iface);
269     FIXME("(%p)->(%f): not implemented!\n", This, fps);
270     return E_NOTIMPL;
271 }
272 
273 static HRESULT WINAPI Timeline_IAMTimeline_GetDefaultFPS(IAMTimeline *iface, double *fps)
274 {
275     TimelineImpl *This = impl_from_IAMTimeline(iface);
276     FIXME("(%p)->(%p): not implemented!\n", This, fps);
277     return E_NOTIMPL;
278 }
279 
280 static HRESULT WINAPI Timeline_IAMTimeline_IsDirty(IAMTimeline *iface, BOOL *dirty)
281 {
282     TimelineImpl *This = impl_from_IAMTimeline(iface);
283     FIXME("(%p)->(%p): not implemented!\n", This, dirty);
284     return E_NOTIMPL;
285 }
286 
287 static HRESULT WINAPI Timeline_IAMTimeline_GetDirtyRange(IAMTimeline *iface, REFERENCE_TIME *start,
288                                                          REFERENCE_TIME *stop)
289 {
290     TimelineImpl *This = impl_from_IAMTimeline(iface);
291     FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
292     return E_NOTIMPL;
293 }
294 
295 static HRESULT WINAPI Timeline_IAMTimeline_GetCountOfType(IAMTimeline *iface, LONG group, LONG *value,
296                                                           LONG *value_with_comps, TIMELINE_MAJOR_TYPE type)
297 {
298     TimelineImpl *This = impl_from_IAMTimeline(iface);
299     FIXME("(%p)->(%d,%p,%p,%04x): not implemented!\n", This, group, value, value_with_comps, type);
300     return E_NOTIMPL;
301 }
302 
303 static HRESULT WINAPI Timeline_IAMTimeline_ValidateSourceNames(IAMTimeline *iface, LONG flags, IMediaLocator *override,
304                                                                LONG_PTR notify_event)
305 {
306     TimelineImpl *This = impl_from_IAMTimeline(iface);
307     FIXME("(%p)->(%d,%p,%lx): not implemented!\n", This, flags, override, notify_event);
308     return E_NOTIMPL;
309 }
310 
311 static HRESULT WINAPI Timeline_IAMTimeline_SetDefaultTransition(IAMTimeline *iface, GUID *guid)
312 {
313     TimelineImpl *This = impl_from_IAMTimeline(iface);
314     FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_guid(guid));
315     return E_NOTIMPL;
316 }
317 
318 static HRESULT WINAPI Timeline_IAMTimeline_GetDefaultTransition(IAMTimeline *iface, GUID *guid)
319 {
320     TimelineImpl *This = impl_from_IAMTimeline(iface);
321     FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_guid(guid));
322     return E_NOTIMPL;
323 }
324 
325 static HRESULT WINAPI Timeline_IAMTimeline_SetDefaultEffect(IAMTimeline *iface, GUID *guid)
326 {
327     TimelineImpl *This = impl_from_IAMTimeline(iface);
328     FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_guid(guid));
329     return E_NOTIMPL;
330 }
331 
332 static HRESULT WINAPI Timeline_IAMTimeline_GetDefaultEffect(IAMTimeline *iface, GUID *guid)
333 {
334     TimelineImpl *This = impl_from_IAMTimeline(iface);
335     FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_guid(guid));
336     return E_NOTIMPL;
337 }
338 
339 static HRESULT WINAPI Timeline_IAMTimeline_SetDefaultTransitionB(IAMTimeline *iface, BSTR guidb)
340 {
341     TimelineImpl *This = impl_from_IAMTimeline(iface);
342     FIXME("(%p)->(%p): not implemented!\n", This, guidb);
343     return E_NOTIMPL;
344 }
345 
346 static HRESULT WINAPI Timeline_IAMTimeline_GetDefaultTransitionB(IAMTimeline *iface, BSTR *guidb)
347 {
348     TimelineImpl *This = impl_from_IAMTimeline(iface);
349     FIXME("(%p)->(%p): not implemented!\n", This, guidb);
350     return E_NOTIMPL;
351 }
352 
353 static HRESULT WINAPI Timeline_IAMTimeline_SetDefaultEffectB(IAMTimeline *iface, BSTR guidb)
354 {
355     TimelineImpl *This = impl_from_IAMTimeline(iface);
356     FIXME("(%p)->(%p): not implemented!\n", This, guidb);
357     return E_NOTIMPL;
358 }
359 
360 static HRESULT WINAPI Timeline_IAMTimeline_GetDefaultEffectB(IAMTimeline *iface, BSTR *guidb)
361 {
362     TimelineImpl *This = impl_from_IAMTimeline(iface);
363     FIXME("(%p)->(%p): not implemented!\n", This, guidb);
364     return E_NOTIMPL;
365 }
366 
367 static const IAMTimelineVtbl IAMTimeline_VTable =
368 {
369     Timeline_IAMTimeline_QueryInterface,
370     Timeline_IAMTimeline_AddRef,
371     Timeline_IAMTimeline_Release,
372     Timeline_IAMTimeline_CreateEmptyNode,
373     Timeline_IAMTimeline_AddGroup,
374     Timeline_IAMTimeline_RemGroupFromList,
375     Timeline_IAMTimeline_GetGroup,
376     Timeline_IAMTimeline_GetGroupCount,
377     Timeline_IAMTimeline_ClearAllGroups,
378     Timeline_IAMTimeline_GetInsertMode,
379     Timeline_IAMTimeline_SetInsertMode,
380     Timeline_IAMTimeline_EnableTransitions,
381     Timeline_IAMTimeline_TransitionsEnabled,
382     Timeline_IAMTimeline_EnableEffects,
383     Timeline_IAMTimeline_EffectsEnabled,
384     Timeline_IAMTimeline_SetInterestRange,
385     Timeline_IAMTimeline_GetDuration,
386     Timeline_IAMTimeline_GetDuration2,
387     Timeline_IAMTimeline_SetDefaultFPS,
388     Timeline_IAMTimeline_GetDefaultFPS,
389     Timeline_IAMTimeline_IsDirty,
390     Timeline_IAMTimeline_GetDirtyRange,
391     Timeline_IAMTimeline_GetCountOfType,
392     Timeline_IAMTimeline_ValidateSourceNames,
393     Timeline_IAMTimeline_SetDefaultTransition,
394     Timeline_IAMTimeline_GetDefaultTransition,
395     Timeline_IAMTimeline_SetDefaultEffect,
396     Timeline_IAMTimeline_GetDefaultEffect,
397     Timeline_IAMTimeline_SetDefaultTransitionB,
398     Timeline_IAMTimeline_GetDefaultTransitionB,
399     Timeline_IAMTimeline_SetDefaultEffectB,
400     Timeline_IAMTimeline_GetDefaultEffectB,
401 };
402 
403 HRESULT AMTimeline_create(IUnknown *pUnkOuter, LPVOID *ppv)
404 {
405     TimelineImpl* obj = NULL;
406 
407     TRACE("(%p,%p)\n", pUnkOuter, ppv);
408 
409     obj = CoTaskMemAlloc(sizeof(TimelineImpl));
410     if (NULL == obj) {
411         *ppv = NULL;
412         return E_OUTOFMEMORY;
413     }
414     ZeroMemory(obj, sizeof(TimelineImpl));
415 
416     obj->ref = 1;
417     obj->IUnknown_inner.lpVtbl = &timeline_vtbl;
418     obj->IAMTimeline_iface.lpVtbl = &IAMTimeline_VTable;
419 
420     if (pUnkOuter)
421         obj->outer_unk = pUnkOuter;
422     else
423         obj->outer_unk = &obj->IUnknown_inner;
424 
425     *ppv = &obj->IUnknown_inner;
426     return S_OK;
427 }
428 
429 /* IAMTimelineObj implementation */
430 
431 static HRESULT WINAPI TimelineObj_QueryInterface(IAMTimelineObj *iface, REFIID riid, void **ppv)
432 {
433     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
434 
435     TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
436 
437     if (!ppv)
438         return E_POINTER;
439 
440     *ppv = NULL;
441     if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IAMTimelineObj))
442         *ppv = &This->IAMTimelineObj_iface;
443     else
444         WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppv);
445 
446     if (!*ppv)
447         return E_NOINTERFACE;
448 
449     IUnknown_AddRef((IUnknown*)*ppv);
450     return S_OK;
451 }
452 
453 static ULONG WINAPI TimelineObj_AddRef(IAMTimelineObj *iface)
454 {
455     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
456     ULONG ref = InterlockedIncrement(&This->ref);
457 
458     TRACE("(%p) new ref = %u\n", This, ref);
459 
460     return ref;
461 }
462 
463 static ULONG WINAPI TimelineObj_Release(IAMTimelineObj *iface)
464 {
465     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
466     ULONG ref = InterlockedDecrement(&This->ref);
467 
468     TRACE("(%p) new ref = %u\n", This, ref);
469 
470     if (!ref)
471         CoTaskMemFree(This);
472 
473     return ref;
474 }
475 
476 static HRESULT WINAPI TimelineObj_GetStartStop(IAMTimelineObj *iface, REFERENCE_TIME *start, REFERENCE_TIME *stop)
477 {
478     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
479     FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
480     return E_NOTIMPL;
481 }
482 
483 static HRESULT WINAPI TimelineObj_GetStartStop2(IAMTimelineObj *iface, REFTIME *start, REFTIME *stop)
484 {
485     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
486     FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
487     return E_NOTIMPL;
488 }
489 
490 static HRESULT WINAPI TimelineObj_FixTimes(IAMTimelineObj *iface, REFERENCE_TIME *start, REFERENCE_TIME *stop)
491 {
492     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
493     FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
494     return E_NOTIMPL;
495 }
496 
497 static HRESULT WINAPI TimelineObj_FixTimes2(IAMTimelineObj *iface, REFTIME *start, REFTIME *stop)
498 {
499     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
500     FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
501     return E_NOTIMPL;
502 }
503 
504 static HRESULT WINAPI TimelineObj_SetStartStop(IAMTimelineObj *iface, REFERENCE_TIME start, REFERENCE_TIME stop)
505 {
506     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
507     FIXME("(%p)->(%s,%s): not implemented!\n", This, wine_dbgstr_longlong(start), wine_dbgstr_longlong(stop));
508     return E_NOTIMPL;
509 }
510 
511 static HRESULT WINAPI TimelineObj_SetStartStop2(IAMTimelineObj *iface, REFTIME start, REFTIME stop)
512 {
513     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
514     FIXME("(%p)->(%f,%f): not implemented!\n", This, start, stop);
515     return E_NOTIMPL;
516 }
517 
518 static HRESULT WINAPI TimelineObj_GetPropertySetter(IAMTimelineObj *iface, IPropertySetter **setter)
519 {
520     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
521     FIXME("(%p)->(%p): not implemented!\n", This, setter);
522     return E_NOTIMPL;
523 }
524 
525 static HRESULT WINAPI TimelineObj_SetPropertySetter(IAMTimelineObj *iface, IPropertySetter *setter)
526 {
527     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
528     FIXME("(%p)->(%p): not implemented!\n", This, setter);
529     return E_NOTIMPL;
530 }
531 
532 static HRESULT WINAPI TimelineObj_GetSubObject(IAMTimelineObj *iface, IUnknown **obj)
533 {
534     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
535     FIXME("(%p)->(%p): not implemented!\n", This, obj);
536     return E_NOTIMPL;
537 }
538 
539 static HRESULT WINAPI TimelineObj_SetSubObject(IAMTimelineObj *iface, IUnknown *obj)
540 {
541     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
542     FIXME("(%p)->(%p): not implemented!\n", This, obj);
543     return E_NOTIMPL;
544 }
545 
546 static HRESULT WINAPI TimelineObj_SetSubObjectGUID(IAMTimelineObj *iface, GUID guid)
547 {
548     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
549     FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_guid(&guid));
550     return E_NOTIMPL;
551 }
552 
553 static HRESULT WINAPI TimelineObj_SetSubObjectGUIDB(IAMTimelineObj *iface, BSTR guidb)
554 {
555     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
556     FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_w(guidb));
557     return E_NOTIMPL;
558 }
559 
560 static HRESULT WINAPI TimelineObj_GetSubObjectGUID(IAMTimelineObj *iface, GUID *guid)
561 {
562     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
563     FIXME("(%p)->(%p): not implemented!\n", This, guid);
564     return E_NOTIMPL;
565 }
566 
567 static HRESULT WINAPI TimelineObj_GetSubObjectGUIDB(IAMTimelineObj *iface, BSTR *guidb)
568 {
569     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
570     FIXME("(%p)->(%p): not implemented!\n", This, guidb);
571     return E_NOTIMPL;
572 }
573 
574 static HRESULT WINAPI TimelineObj_GetSubObjectLoaded(IAMTimelineObj *iface, BOOL *loaded)
575 {
576     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
577     FIXME("(%p)->(%p): not implemented!\n", This, loaded);
578     return E_NOTIMPL;
579 }
580 
581 static HRESULT WINAPI TimelineObj_GetTimelineType(IAMTimelineObj *iface, TIMELINE_MAJOR_TYPE *type)
582 {
583     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
584     TRACE("(%p)->(%p)\n", This, type);
585     if (!type) return E_POINTER;
586     *type = This->timeline_type;
587     return S_OK;
588 }
589 
590 static HRESULT WINAPI TimelineObj_SetTimelineType(IAMTimelineObj *iface, TIMELINE_MAJOR_TYPE type)
591 {
592     /* MSDN says that this function is "not supported" */
593     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
594     TRACE("(%p)->(%d)\n", This, type);
595     if (type != This->timeline_type) return E_INVALIDARG;
596     return S_OK;
597 }
598 
599 static HRESULT WINAPI TimelineObj_GetUserID(IAMTimelineObj *iface, LONG *id)
600 {
601     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
602     FIXME("(%p)->(%p): not implemented!\n", This, id);
603     return E_NOTIMPL;
604 }
605 
606 static HRESULT WINAPI TimelineObj_SetUserID(IAMTimelineObj *iface, LONG id)
607 {
608     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
609     FIXME("(%p)->(%d): not implemented!\n", This, id);
610     return E_NOTIMPL;
611 }
612 
613 static HRESULT WINAPI TimelineObj_GetGenID(IAMTimelineObj *iface, LONG *id)
614 {
615     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
616     FIXME("(%p)->(%p): not implemented!\n", This, id);
617     return E_NOTIMPL;
618 }
619 
620 static HRESULT WINAPI TimelineObj_GetUserName(IAMTimelineObj *iface, BSTR *name)
621 {
622     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
623     FIXME("(%p)->(%p): not implemented!\n", This, name);
624     return E_NOTIMPL;
625 }
626 
627 static HRESULT WINAPI TimelineObj_SetUserName(IAMTimelineObj *iface, BSTR name)
628 {
629     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
630     FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_w(name));
631     return E_NOTIMPL;
632 }
633 
634 static HRESULT WINAPI TimelineObj_GetUserData(IAMTimelineObj *iface, BYTE *data, LONG *size)
635 {
636     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
637     FIXME("(%p)->(%p,%p): not implemented!\n", This, data, size);
638     return E_NOTIMPL;
639 }
640 
641 static HRESULT WINAPI TimelineObj_SetUserData(IAMTimelineObj *iface, BYTE *data, LONG size)
642 {
643     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
644     FIXME("(%p)->(%p,%d): not implemented!\n", This, data, size);
645     return E_NOTIMPL;
646 }
647 
648 static HRESULT WINAPI TimelineObj_GetMuted(IAMTimelineObj *iface, BOOL *muted)
649 {
650     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
651     FIXME("(%p)->(%p): not implemented!\n", This, muted);
652     return E_NOTIMPL;
653 }
654 
655 static HRESULT WINAPI TimelineObj_SetMuted(IAMTimelineObj *iface, BOOL muted)
656 {
657     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
658     FIXME("(%p)->(%d): not implemented!\n", This, muted);
659     return E_NOTIMPL;
660 }
661 
662 static HRESULT WINAPI TimelineObj_GetLocked(IAMTimelineObj *iface, BOOL *locked)
663 {
664     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
665     FIXME("(%p)->(%p): not implemented!\n", This, locked);
666     return E_NOTIMPL;
667 }
668 
669 static HRESULT WINAPI TimelineObj_SetLocked(IAMTimelineObj *iface, BOOL locked)
670 {
671     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
672     FIXME("(%p)->(%d): not implemented!\n", This, locked);
673     return E_NOTIMPL;
674 }
675 
676 static HRESULT WINAPI TimelineObj_GetDirtyRange(IAMTimelineObj *iface, REFERENCE_TIME *start, REFERENCE_TIME *stop)
677 {
678     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
679     FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
680     return E_NOTIMPL;
681 }
682 
683 static HRESULT WINAPI TimelineObj_GetDirtyRange2(IAMTimelineObj *iface, REFTIME *start, REFTIME *stop)
684 {
685     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
686     FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
687     return E_NOTIMPL;
688 }
689 
690 static HRESULT WINAPI TimelineObj_SetDirtyRange(IAMTimelineObj *iface, REFERENCE_TIME start, REFERENCE_TIME stop)
691 {
692     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
693     FIXME("(%p)->(%s,%s): not implemented!\n", This, wine_dbgstr_longlong(start), wine_dbgstr_longlong(stop));
694     return E_NOTIMPL;
695 }
696 
697 static HRESULT WINAPI TimelineObj_SetDirtyRange2(IAMTimelineObj *iface, REFTIME start, REFTIME stop)
698 {
699     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
700     FIXME("(%p)->(%f,%f): not implemented!\n", This, start, stop);
701     return E_NOTIMPL;
702 }
703 
704 static HRESULT WINAPI TimelineObj_ClearDirty(IAMTimelineObj *iface)
705 {
706     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
707     FIXME("(%p): not implemented!\n", This);
708     return E_NOTIMPL;
709 }
710 
711 static HRESULT WINAPI TimelineObj_Remove(IAMTimelineObj *iface)
712 {
713     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
714     FIXME("(%p): not implemented!\n", This);
715     return E_NOTIMPL;
716 }
717 
718 static HRESULT WINAPI TimelineObj_RemoveAll(IAMTimelineObj *iface)
719 {
720     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
721     FIXME("(%p): not implemented!\n", This);
722     return E_NOTIMPL;
723 }
724 
725 static HRESULT WINAPI TimelineObj_GetTimelineNoRef(IAMTimelineObj *iface, IAMTimeline **timeline)
726 {
727     /* MSDN says that this function is "not supported" */
728     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
729     TRACE("(%p)->(%p)\n", This, timeline);
730     if (!timeline) return E_POINTER;
731     *timeline = NULL;
732     return E_NOINTERFACE;
733 }
734 
735 static HRESULT WINAPI TimelineObj_GetGroupIBelongTo(IAMTimelineObj *iface, IAMTimelineGroup **group)
736 {
737     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
738     FIXME("(%p)->(%p): not implemented!\n", This, group);
739     return E_NOTIMPL;
740 }
741 
742 static HRESULT WINAPI TimelineObj_GetEmbedDepth(IAMTimelineObj *iface, LONG *depth)
743 {
744     TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
745     FIXME("(%p)->(%p): not implemented!\n", This, depth);
746     return E_NOTIMPL;
747 }
748 
749 static const IAMTimelineObjVtbl IAMTimelineObj_VTable =
750 {
751     TimelineObj_QueryInterface,
752     TimelineObj_AddRef,
753     TimelineObj_Release,
754     TimelineObj_GetStartStop,
755     TimelineObj_GetStartStop2,
756     TimelineObj_FixTimes,
757     TimelineObj_FixTimes2,
758     TimelineObj_SetStartStop,
759     TimelineObj_SetStartStop2,
760     TimelineObj_GetPropertySetter,
761     TimelineObj_SetPropertySetter,
762     TimelineObj_GetSubObject,
763     TimelineObj_SetSubObject,
764     TimelineObj_SetSubObjectGUID,
765     TimelineObj_SetSubObjectGUIDB,
766     TimelineObj_GetSubObjectGUID,
767     TimelineObj_GetSubObjectGUIDB,
768     TimelineObj_GetSubObjectLoaded,
769     TimelineObj_GetTimelineType,
770     TimelineObj_SetTimelineType,
771     TimelineObj_GetUserID,
772     TimelineObj_SetUserID,
773     TimelineObj_GetGenID,
774     TimelineObj_GetUserName,
775     TimelineObj_SetUserName,
776     TimelineObj_GetUserData,
777     TimelineObj_SetUserData,
778     TimelineObj_GetMuted,
779     TimelineObj_SetMuted,
780     TimelineObj_GetLocked,
781     TimelineObj_SetLocked,
782     TimelineObj_GetDirtyRange,
783     TimelineObj_GetDirtyRange2,
784     TimelineObj_SetDirtyRange,
785     TimelineObj_SetDirtyRange2,
786     TimelineObj_ClearDirty,
787     TimelineObj_Remove,
788     TimelineObj_RemoveAll,
789     TimelineObj_GetTimelineNoRef,
790     TimelineObj_GetGroupIBelongTo,
791     TimelineObj_GetEmbedDepth,
792 };
793