/*              DirectShow Timeline object (QEDIT.DLL)
 *
 * Copyright 2016 Alex Henrie
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#include <assert.h>
#include <stdarg.h>

#define COBJMACROS

#include "windef.h"
#include "winbase.h"
#include "winuser.h"
#include "ole2.h"

#include "qedit_private.h"
#include "wine/debug.h"

WINE_DEFAULT_DEBUG_CHANNEL(qedit);

typedef struct {
    IUnknown IUnknown_inner;
    IAMTimeline IAMTimeline_iface;
    IUnknown *outer_unk;
    LONG ref;
} TimelineImpl;

static inline TimelineImpl *impl_from_IUnknown(IUnknown *iface)
{
    return CONTAINING_RECORD(iface, TimelineImpl, IUnknown_inner);
}

static inline TimelineImpl *impl_from_IAMTimeline(IAMTimeline *iface)
{
    return CONTAINING_RECORD(iface, TimelineImpl, IAMTimeline_iface);
}

typedef struct {
    IAMTimelineObj IAMTimelineObj_iface;
    IAMTimelineGroup IAMTimelineGroup_iface;
    LONG ref;
    TIMELINE_MAJOR_TYPE timeline_type;
} TimelineObjImpl;

static inline TimelineObjImpl *impl_from_IAMTimelineObj(IAMTimelineObj *iface)
{
    return CONTAINING_RECORD(iface, TimelineObjImpl, IAMTimelineObj_iface);
}

static inline TimelineObjImpl *impl_from_IAMTimelineGroup(IAMTimelineGroup *iface)
{
    return CONTAINING_RECORD(iface, TimelineObjImpl, IAMTimelineGroup_iface);
}

static const IAMTimelineObjVtbl IAMTimelineObj_VTable;
static const IAMTimelineGroupVtbl IAMTimelineGroup_VTable;

/* Timeline inner IUnknown */

static HRESULT WINAPI Timeline_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
{
    TimelineImpl *This = impl_from_IUnknown(iface);

    TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);

    if (!ppv)
        return E_POINTER;

    *ppv = NULL;
    if (IsEqualIID(riid, &IID_IUnknown))
        *ppv = &This->IUnknown_inner;
    else if (IsEqualIID(riid, &IID_IAMTimeline))
        *ppv = &This->IAMTimeline_iface;
    else
        WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppv);

    if (!*ppv)
        return E_NOINTERFACE;

    IUnknown_AddRef((IUnknown*)*ppv);
    return S_OK;
}

static ULONG WINAPI Timeline_AddRef(IUnknown *iface)
{
    TimelineImpl *This = impl_from_IUnknown(iface);
    ULONG ref = InterlockedIncrement(&This->ref);

    TRACE("(%p) new ref = %u\n", This, ref);

    return ref;
}

static ULONG WINAPI Timeline_Release(IUnknown *iface)
{
    TimelineImpl *This = impl_from_IUnknown(iface);
    ULONG ref = InterlockedDecrement(&This->ref);

    TRACE("(%p) new ref = %u\n", This, ref);

    if (ref == 0)
        CoTaskMemFree(This);

    return ref;
}

static const IUnknownVtbl timeline_vtbl =
{
    Timeline_QueryInterface,
    Timeline_AddRef,
    Timeline_Release,
};

/* IAMTimeline implementation */

static HRESULT WINAPI Timeline_IAMTimeline_QueryInterface(IAMTimeline *iface, REFIID riid, void **ppv)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
}

static ULONG WINAPI Timeline_IAMTimeline_AddRef(IAMTimeline *iface)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    return IUnknown_AddRef(This->outer_unk);
}

static ULONG WINAPI Timeline_IAMTimeline_Release(IAMTimeline *iface)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    return IUnknown_Release(This->outer_unk);
}

static HRESULT WINAPI Timeline_IAMTimeline_CreateEmptyNode(IAMTimeline *iface, IAMTimelineObj **obj,
                                                           TIMELINE_MAJOR_TYPE type)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    TimelineObjImpl* obj_impl;

    TRACE("(%p)->(%p,%d)\n", This, obj, type);

    if (!obj)
        return E_POINTER;

    switch (type)
    {
        case TIMELINE_MAJOR_TYPE_COMPOSITE:
        case TIMELINE_MAJOR_TYPE_TRACK:
        case TIMELINE_MAJOR_TYPE_SOURCE:
        case TIMELINE_MAJOR_TYPE_TRANSITION:
        case TIMELINE_MAJOR_TYPE_EFFECT:
        case TIMELINE_MAJOR_TYPE_GROUP:
            break;
        default:
            return E_INVALIDARG;
    }

    obj_impl = CoTaskMemAlloc(sizeof(TimelineObjImpl));
    if (!obj_impl) {
        *obj = NULL;
        return E_OUTOFMEMORY;
    }

    obj_impl->ref = 1;
    obj_impl->IAMTimelineObj_iface.lpVtbl = &IAMTimelineObj_VTable;
    obj_impl->IAMTimelineGroup_iface.lpVtbl = &IAMTimelineGroup_VTable;
    obj_impl->timeline_type = type;

    *obj = &obj_impl->IAMTimelineObj_iface;
    return S_OK;
}

static HRESULT WINAPI Timeline_IAMTimeline_AddGroup(IAMTimeline *iface, IAMTimelineObj *group)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, group);
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_RemGroupFromList(IAMTimeline *iface, IAMTimelineObj *group)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, group);
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_GetGroup(IAMTimeline *iface, IAMTimelineObj **group, LONG index)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%p,%d): not implemented!\n", This, group, index);
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_GetGroupCount(IAMTimeline *iface, LONG *count)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, count);
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_ClearAllGroups(IAMTimeline *iface)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p): not implemented!\n", This);
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_GetInsertMode(IAMTimeline *iface, LONG *mode)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, mode);
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_SetInsertMode(IAMTimeline *iface, LONG mode)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%d): not implemented!\n", This, mode);
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_EnableTransitions(IAMTimeline *iface, BOOL enabled)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%d): not implemented!\n", This, enabled);
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_TransitionsEnabled(IAMTimeline *iface, BOOL *enabled)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, enabled);
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_EnableEffects(IAMTimeline *iface, BOOL enabled)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%d): not implemented!\n", This, enabled);
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_EffectsEnabled(IAMTimeline *iface, BOOL *enabled)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, enabled);
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_SetInterestRange(IAMTimeline *iface, REFERENCE_TIME start,
                                                            REFERENCE_TIME stop)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%s,%s): not implemented!\n", This, wine_dbgstr_longlong(start),
          wine_dbgstr_longlong(stop));
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_GetDuration(IAMTimeline *iface, REFERENCE_TIME *duration)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, duration);
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_GetDuration2(IAMTimeline *iface, double *duration)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, duration);
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_SetDefaultFPS(IAMTimeline *iface, double fps)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%f): not implemented!\n", This, fps);
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_GetDefaultFPS(IAMTimeline *iface, double *fps)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, fps);
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_IsDirty(IAMTimeline *iface, BOOL *dirty)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, dirty);
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_GetDirtyRange(IAMTimeline *iface, REFERENCE_TIME *start,
                                                         REFERENCE_TIME *stop)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_GetCountOfType(IAMTimeline *iface, LONG group, LONG *value,
                                                          LONG *value_with_comps, TIMELINE_MAJOR_TYPE type)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%d,%p,%p,%04x): not implemented!\n", This, group, value, value_with_comps, type);
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_ValidateSourceNames(IAMTimeline *iface, LONG flags, IMediaLocator *override,
                                                               LONG_PTR notify_event)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%d,%p,%lx): not implemented!\n", This, flags, override, notify_event);
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_SetDefaultTransition(IAMTimeline *iface, GUID *guid)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_guid(guid));
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_GetDefaultTransition(IAMTimeline *iface, GUID *guid)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_guid(guid));
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_SetDefaultEffect(IAMTimeline *iface, GUID *guid)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_guid(guid));
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_GetDefaultEffect(IAMTimeline *iface, GUID *guid)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_guid(guid));
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_SetDefaultTransitionB(IAMTimeline *iface, BSTR guidb)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, guidb);
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_GetDefaultTransitionB(IAMTimeline *iface, BSTR *guidb)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, guidb);
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_SetDefaultEffectB(IAMTimeline *iface, BSTR guidb)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, guidb);
    return E_NOTIMPL;
}

static HRESULT WINAPI Timeline_IAMTimeline_GetDefaultEffectB(IAMTimeline *iface, BSTR *guidb)
{
    TimelineImpl *This = impl_from_IAMTimeline(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, guidb);
    return E_NOTIMPL;
}

static const IAMTimelineVtbl IAMTimeline_VTable =
{
    Timeline_IAMTimeline_QueryInterface,
    Timeline_IAMTimeline_AddRef,
    Timeline_IAMTimeline_Release,
    Timeline_IAMTimeline_CreateEmptyNode,
    Timeline_IAMTimeline_AddGroup,
    Timeline_IAMTimeline_RemGroupFromList,
    Timeline_IAMTimeline_GetGroup,
    Timeline_IAMTimeline_GetGroupCount,
    Timeline_IAMTimeline_ClearAllGroups,
    Timeline_IAMTimeline_GetInsertMode,
    Timeline_IAMTimeline_SetInsertMode,
    Timeline_IAMTimeline_EnableTransitions,
    Timeline_IAMTimeline_TransitionsEnabled,
    Timeline_IAMTimeline_EnableEffects,
    Timeline_IAMTimeline_EffectsEnabled,
    Timeline_IAMTimeline_SetInterestRange,
    Timeline_IAMTimeline_GetDuration,
    Timeline_IAMTimeline_GetDuration2,
    Timeline_IAMTimeline_SetDefaultFPS,
    Timeline_IAMTimeline_GetDefaultFPS,
    Timeline_IAMTimeline_IsDirty,
    Timeline_IAMTimeline_GetDirtyRange,
    Timeline_IAMTimeline_GetCountOfType,
    Timeline_IAMTimeline_ValidateSourceNames,
    Timeline_IAMTimeline_SetDefaultTransition,
    Timeline_IAMTimeline_GetDefaultTransition,
    Timeline_IAMTimeline_SetDefaultEffect,
    Timeline_IAMTimeline_GetDefaultEffect,
    Timeline_IAMTimeline_SetDefaultTransitionB,
    Timeline_IAMTimeline_GetDefaultTransitionB,
    Timeline_IAMTimeline_SetDefaultEffectB,
    Timeline_IAMTimeline_GetDefaultEffectB,
};

HRESULT AMTimeline_create(IUnknown *pUnkOuter, LPVOID *ppv)
{
    TimelineImpl* obj = NULL;

    TRACE("(%p,%p)\n", pUnkOuter, ppv);

    obj = CoTaskMemAlloc(sizeof(TimelineImpl));
    if (NULL == obj) {
        *ppv = NULL;
        return E_OUTOFMEMORY;
    }
    ZeroMemory(obj, sizeof(TimelineImpl));

    obj->ref = 1;
    obj->IUnknown_inner.lpVtbl = &timeline_vtbl;
    obj->IAMTimeline_iface.lpVtbl = &IAMTimeline_VTable;

    if (pUnkOuter)
        obj->outer_unk = pUnkOuter;
    else
        obj->outer_unk = &obj->IUnknown_inner;

    *ppv = &obj->IUnknown_inner;
    return S_OK;
}

/* IAMTimelineObj implementation */

static HRESULT WINAPI TimelineObj_QueryInterface(IAMTimelineObj *iface, REFIID riid, void **ppv)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);

    TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);

    if (!ppv)
        return E_POINTER;

    *ppv = NULL;
    if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IAMTimelineObj))
        *ppv = &This->IAMTimelineObj_iface;
    else if (IsEqualIID(riid, &IID_IAMTimelineGroup))
        *ppv = &This->IAMTimelineGroup_iface;
    else
        WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppv);

    if (!*ppv)
        return E_NOINTERFACE;

    IUnknown_AddRef((IUnknown*)*ppv);
    return S_OK;
}

static ULONG WINAPI TimelineObj_AddRef(IAMTimelineObj *iface)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    ULONG ref = InterlockedIncrement(&This->ref);

    TRACE("(%p) new ref = %u\n", This, ref);

    return ref;
}

static ULONG WINAPI TimelineObj_Release(IAMTimelineObj *iface)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    ULONG ref = InterlockedDecrement(&This->ref);

    TRACE("(%p) new ref = %u\n", This, ref);

    if (!ref)
        CoTaskMemFree(This);

    return ref;
}

static HRESULT WINAPI TimelineObj_GetStartStop(IAMTimelineObj *iface, REFERENCE_TIME *start, REFERENCE_TIME *stop)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_GetStartStop2(IAMTimelineObj *iface, REFTIME *start, REFTIME *stop)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_FixTimes(IAMTimelineObj *iface, REFERENCE_TIME *start, REFERENCE_TIME *stop)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_FixTimes2(IAMTimelineObj *iface, REFTIME *start, REFTIME *stop)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_SetStartStop(IAMTimelineObj *iface, REFERENCE_TIME start, REFERENCE_TIME stop)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%s,%s): not implemented!\n", This, wine_dbgstr_longlong(start), wine_dbgstr_longlong(stop));
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_SetStartStop2(IAMTimelineObj *iface, REFTIME start, REFTIME stop)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%f,%f): not implemented!\n", This, start, stop);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_GetPropertySetter(IAMTimelineObj *iface, IPropertySetter **setter)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, setter);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_SetPropertySetter(IAMTimelineObj *iface, IPropertySetter *setter)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, setter);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_GetSubObject(IAMTimelineObj *iface, IUnknown **obj)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, obj);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_SetSubObject(IAMTimelineObj *iface, IUnknown *obj)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, obj);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_SetSubObjectGUID(IAMTimelineObj *iface, GUID guid)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_guid(&guid));
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_SetSubObjectGUIDB(IAMTimelineObj *iface, BSTR guidb)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_w(guidb));
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_GetSubObjectGUID(IAMTimelineObj *iface, GUID *guid)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, guid);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_GetSubObjectGUIDB(IAMTimelineObj *iface, BSTR *guidb)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, guidb);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_GetSubObjectLoaded(IAMTimelineObj *iface, BOOL *loaded)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, loaded);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_GetTimelineType(IAMTimelineObj *iface, TIMELINE_MAJOR_TYPE *type)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    TRACE("(%p)->(%p)\n", This, type);
    if (!type) return E_POINTER;
    *type = This->timeline_type;
    return S_OK;
}

static HRESULT WINAPI TimelineObj_SetTimelineType(IAMTimelineObj *iface, TIMELINE_MAJOR_TYPE type)
{
    /* MSDN says that this function is "not supported" */
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    TRACE("(%p)->(%d)\n", This, type);
    if (type != This->timeline_type) return E_INVALIDARG;
    return S_OK;
}

static HRESULT WINAPI TimelineObj_GetUserID(IAMTimelineObj *iface, LONG *id)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, id);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_SetUserID(IAMTimelineObj *iface, LONG id)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%d): not implemented!\n", This, id);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_GetGenID(IAMTimelineObj *iface, LONG *id)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, id);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_GetUserName(IAMTimelineObj *iface, BSTR *name)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, name);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_SetUserName(IAMTimelineObj *iface, BSTR name)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%s): not implemented!\n", This, wine_dbgstr_w(name));
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_GetUserData(IAMTimelineObj *iface, BYTE *data, LONG *size)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%p,%p): not implemented!\n", This, data, size);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_SetUserData(IAMTimelineObj *iface, BYTE *data, LONG size)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%p,%d): not implemented!\n", This, data, size);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_GetMuted(IAMTimelineObj *iface, BOOL *muted)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, muted);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_SetMuted(IAMTimelineObj *iface, BOOL muted)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%d): not implemented!\n", This, muted);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_GetLocked(IAMTimelineObj *iface, BOOL *locked)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, locked);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_SetLocked(IAMTimelineObj *iface, BOOL locked)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%d): not implemented!\n", This, locked);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_GetDirtyRange(IAMTimelineObj *iface, REFERENCE_TIME *start, REFERENCE_TIME *stop)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_GetDirtyRange2(IAMTimelineObj *iface, REFTIME *start, REFTIME *stop)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%p,%p): not implemented!\n", This, start, stop);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_SetDirtyRange(IAMTimelineObj *iface, REFERENCE_TIME start, REFERENCE_TIME stop)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%s,%s): not implemented!\n", This, wine_dbgstr_longlong(start), wine_dbgstr_longlong(stop));
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_SetDirtyRange2(IAMTimelineObj *iface, REFTIME start, REFTIME stop)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%f,%f): not implemented!\n", This, start, stop);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_ClearDirty(IAMTimelineObj *iface)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p): not implemented!\n", This);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_Remove(IAMTimelineObj *iface)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p): not implemented!\n", This);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_RemoveAll(IAMTimelineObj *iface)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p): not implemented!\n", This);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_GetTimelineNoRef(IAMTimelineObj *iface, IAMTimeline **timeline)
{
    /* MSDN says that this function is "not supported" */
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    TRACE("(%p)->(%p)\n", This, timeline);
    if (!timeline) return E_POINTER;
    *timeline = NULL;
    return E_NOINTERFACE;
}

static HRESULT WINAPI TimelineObj_GetGroupIBelongTo(IAMTimelineObj *iface, IAMTimelineGroup **group)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, group);
    return E_NOTIMPL;
}

static HRESULT WINAPI TimelineObj_GetEmbedDepth(IAMTimelineObj *iface, LONG *depth)
{
    TimelineObjImpl *This = impl_from_IAMTimelineObj(iface);
    FIXME("(%p)->(%p): not implemented!\n", This, depth);
    return E_NOTIMPL;
}

static const IAMTimelineObjVtbl IAMTimelineObj_VTable =
{
    TimelineObj_QueryInterface,
    TimelineObj_AddRef,
    TimelineObj_Release,
    TimelineObj_GetStartStop,
    TimelineObj_GetStartStop2,
    TimelineObj_FixTimes,
    TimelineObj_FixTimes2,
    TimelineObj_SetStartStop,
    TimelineObj_SetStartStop2,
    TimelineObj_GetPropertySetter,
    TimelineObj_SetPropertySetter,
    TimelineObj_GetSubObject,
    TimelineObj_SetSubObject,
    TimelineObj_SetSubObjectGUID,
    TimelineObj_SetSubObjectGUIDB,
    TimelineObj_GetSubObjectGUID,
    TimelineObj_GetSubObjectGUIDB,
    TimelineObj_GetSubObjectLoaded,
    TimelineObj_GetTimelineType,
    TimelineObj_SetTimelineType,
    TimelineObj_GetUserID,
    TimelineObj_SetUserID,
    TimelineObj_GetGenID,
    TimelineObj_GetUserName,
    TimelineObj_SetUserName,
    TimelineObj_GetUserData,
    TimelineObj_SetUserData,
    TimelineObj_GetMuted,
    TimelineObj_SetMuted,
    TimelineObj_GetLocked,
    TimelineObj_SetLocked,
    TimelineObj_GetDirtyRange,
    TimelineObj_GetDirtyRange2,
    TimelineObj_SetDirtyRange,
    TimelineObj_SetDirtyRange2,
    TimelineObj_ClearDirty,
    TimelineObj_Remove,
    TimelineObj_RemoveAll,
    TimelineObj_GetTimelineNoRef,
    TimelineObj_GetGroupIBelongTo,
    TimelineObj_GetEmbedDepth,
};

static HRESULT WINAPI timelinegrp_QueryInterface(IAMTimelineGroup *iface, REFIID riid, void **object)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    return IAMTimelineObj_QueryInterface(&This->IAMTimelineObj_iface, riid, object);
}

static ULONG WINAPI timelinegrp_AddRef(IAMTimelineGroup *iface)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    return IAMTimelineObj_AddRef(&This->IAMTimelineObj_iface);
}

static ULONG WINAPI timelinegrp_Release(IAMTimelineGroup *iface)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    return IAMTimelineObj_Release(&This->IAMTimelineObj_iface);
}

static HRESULT WINAPI timelinegrp_SetTimeline(IAMTimelineGroup *iface, IAMTimeline *timeline)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    FIXME("(%p)->(%p)\n", This, timeline);
    return E_NOTIMPL;
}

static HRESULT WINAPI timelinegrp_GetTimeline(IAMTimelineGroup *iface, IAMTimeline **timeline)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    FIXME("(%p)->(%p)\n", This, timeline);
    return E_NOTIMPL;
}

static HRESULT WINAPI timelinegrp_GetPriority(IAMTimelineGroup *iface, LONG *priority)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    FIXME("(%p)->(%p)\n", This, priority);
    return E_NOTIMPL;
}

static HRESULT WINAPI timelinegrp_GetMediaType(IAMTimelineGroup *iface, AM_MEDIA_TYPE *mediatype)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    FIXME("(%p)->(%p)\n", This, mediatype);
    return E_NOTIMPL;
}

static HRESULT WINAPI timelinegrp_SetMediaType(IAMTimelineGroup *iface, AM_MEDIA_TYPE *mediatype)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    FIXME("(%p)->(%p)\n", This, mediatype);
    return E_NOTIMPL;
}

static HRESULT WINAPI timelinegrp_SetOutputFPS(IAMTimelineGroup *iface, double fps)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    FIXME("(%p)->(%f)\n", This, fps);
    return E_NOTIMPL;
}

static HRESULT WINAPI timelinegrp_GetOutputFPS(IAMTimelineGroup *iface, double *fps)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    FIXME("(%p)->(%p)\n", This, fps);
    return E_NOTIMPL;
}

static HRESULT WINAPI timelinegrp_SetGroupName(IAMTimelineGroup *iface, BSTR name)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    FIXME("(%p)->(%s)\n", This, debugstr_w(name));
    return E_NOTIMPL;
}

static HRESULT WINAPI timelinegrp_GetGroupName(IAMTimelineGroup *iface, BSTR *name)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    FIXME("(%p)->(%p)\n", This, name);
    return E_NOTIMPL;
}

static HRESULT WINAPI timelinegrp_SetPreviewMode(IAMTimelineGroup *iface, BOOL preview)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    FIXME("(%p)->(%d)\n", This, preview);
    return E_NOTIMPL;
}

static HRESULT WINAPI timelinegrp_GetPreviewMode(IAMTimelineGroup *iface, BOOL *preview)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    FIXME("(%p)->(%p)\n", This, preview);
    return E_NOTIMPL;
}

static HRESULT WINAPI timelinegrp_SetMediaTypeForVB(IAMTimelineGroup *iface, LONG type)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    FIXME("(%p)->(%d)\n", This, type);
    return E_NOTIMPL;
}

static HRESULT WINAPI timelinegrp_GetOutputBuffering(IAMTimelineGroup *iface, int *buffer)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    FIXME("(%p)->(%p)\n", This, buffer);
    return E_NOTIMPL;
}

static HRESULT WINAPI timelinegrp_SetOutputBuffering(IAMTimelineGroup *iface, int buffer)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    FIXME("(%p)->(%d)\n", This, buffer);
    return E_NOTIMPL;
}

static HRESULT WINAPI timelinegrp_SetSmartRecompressFormat(IAMTimelineGroup *iface, LONG *format)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    FIXME("(%p)->(%p)\n", This, format);
    return E_NOTIMPL;
}

static HRESULT WINAPI timelinegrp_GetSmartRecompressFormat(IAMTimelineGroup *iface, LONG **format)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    FIXME("(%p)->(%p)\n", This, format);
    return E_NOTIMPL;
}

static HRESULT WINAPI timelinegrp_IsSmartRecompressFormatSet(IAMTimelineGroup *iface, BOOL *set)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    FIXME("(%p)->(%p)\n", This, set);
    return E_NOTIMPL;
}

static HRESULT WINAPI timelinegrp_IsRecompressFormatDirty(IAMTimelineGroup *iface, BOOL *dirty)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    FIXME("(%p)->(%p)\n", This, dirty);
    return E_NOTIMPL;
}

static HRESULT WINAPI timelinegrp_ClearRecompressFormatDirty(IAMTimelineGroup *iface)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    FIXME("(%p)->()\n", This);
    return E_NOTIMPL;
}

static HRESULT WINAPI timelinegrp_SetRecompFormatFromSource(IAMTimelineGroup *iface, IAMTimelineSrc *source)
{
    TimelineObjImpl *This = impl_from_IAMTimelineGroup(iface);
    FIXME("(%p)->(%p)\n", This, source);
    return E_NOTIMPL;
}

static const IAMTimelineGroupVtbl IAMTimelineGroup_VTable =
{
    timelinegrp_QueryInterface,
    timelinegrp_AddRef,
    timelinegrp_Release,
    timelinegrp_SetTimeline,
    timelinegrp_GetTimeline,
    timelinegrp_GetPriority,
    timelinegrp_GetMediaType,
    timelinegrp_SetMediaType,
    timelinegrp_SetOutputFPS,
    timelinegrp_GetOutputFPS,
    timelinegrp_SetGroupName,
    timelinegrp_GetGroupName,
    timelinegrp_SetPreviewMode,
    timelinegrp_GetPreviewMode,
    timelinegrp_SetMediaTypeForVB,
    timelinegrp_GetOutputBuffering,
    timelinegrp_SetOutputBuffering,
    timelinegrp_SetSmartRecompressFormat,
    timelinegrp_GetSmartRecompressFormat,
    timelinegrp_IsSmartRecompressFormatSet,
    timelinegrp_IsRecompressFormatDirty,
    timelinegrp_ClearRecompressFormatDirty,
    timelinegrp_SetRecompFormatFromSource
};
