/*** Autogenerated by WIDL 11.6 from include/windows.media.transcoding.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __windows_media_transcoding_h__
#define __windows_media_transcoding_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder ABI::Windows::Media::Transcoding::IMediaTranscoder
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Transcoding {
                interface IMediaTranscoder;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2 __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2 ABI::Windows::Media::Transcoding::IMediaTranscoder2
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Transcoding {
                interface IMediaTranscoder2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult ABI::Windows::Media::Transcoding::IPrepareTranscodeResult
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Transcoding {
                interface IPrepareTranscodeResult;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CTranscoding_CMediaTranscoder_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CTranscoding_CMediaTranscoder_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Transcoding {
                class MediaTranscoder;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CTranscoding_CMediaTranscoder __x_ABI_CWindows_CMedia_CTranscoding_CMediaTranscoder;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CTranscoding_CMediaTranscoder_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CTranscoding_CPrepareTranscodeResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CTranscoding_CPrepareTranscodeResult_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Transcoding {
                class PrepareTranscodeResult;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CTranscoding_CPrepareTranscodeResult __x_ABI_CWindows_CMedia_CTranscoding_CPrepareTranscodeResult;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CTranscoding_CPrepareTranscodeResult_FWD_DEFINED__ */

#ifndef ____FIAsyncActionWithProgress_1_DOUBLE_FWD_DEFINED__
#define ____FIAsyncActionWithProgress_1_DOUBLE_FWD_DEFINED__
typedef interface __FIAsyncActionWithProgress_1_DOUBLE __FIAsyncActionWithProgress_1_DOUBLE;
#ifdef __cplusplus
#define __FIAsyncActionWithProgress_1_DOUBLE ABI::Windows::Foundation::IAsyncActionWithProgress<DOUBLE >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncActionProgressHandler_1_DOUBLE_FWD_DEFINED__
#define ____FIAsyncActionProgressHandler_1_DOUBLE_FWD_DEFINED__
typedef interface __FIAsyncActionProgressHandler_1_DOUBLE __FIAsyncActionProgressHandler_1_DOUBLE;
#ifdef __cplusplus
#define __FIAsyncActionProgressHandler_1_DOUBLE ABI::Windows::Foundation::IAsyncActionProgressHandler<DOUBLE >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncActionWithProgressCompletedHandler_1_DOUBLE_FWD_DEFINED__
#define ____FIAsyncActionWithProgressCompletedHandler_1_DOUBLE_FWD_DEFINED__
typedef interface __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE;
#ifdef __cplusplus
#define __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE ABI::Windows::Foundation::IAsyncActionWithProgressCompletedHandler<DOUBLE >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Media::Transcoding::PrepareTranscodeResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_TranscodeFailureReason_FWD_DEFINED__
#define ____FIAsyncOperation_1_TranscodeFailureReason_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_TranscodeFailureReason __FIAsyncOperation_1_TranscodeFailureReason;
#ifdef __cplusplus
#define __FIAsyncOperation_1_TranscodeFailureReason ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Media::Transcoding::TranscodeFailureReason >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_FWD_DEFINED__
#define ____FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_FWD_DEFINED__
typedef interface __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE;
#ifdef __cplusplus
#define __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE ABI::Windows::Foundation::IAsyncOperationWithProgress<ABI::Windows::Media::Transcoding::TranscodeFailureReason,DOUBLE >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Media::Transcoding::PrepareTranscodeResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_TranscodeFailureReason_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_TranscodeFailureReason_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Media::Transcoding::TranscodeFailureReason >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE_FWD_DEFINED__
#define ____FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE_FWD_DEFINED__
typedef interface __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE;
#ifdef __cplusplus
#define __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE ABI::Windows::Foundation::IAsyncOperationWithProgressCompletedHandler<ABI::Windows::Media::Transcoding::TranscodeFailureReason,DOUBLE >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE_FWD_DEFINED__
#define ____FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE_FWD_DEFINED__
typedef interface __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE;
#ifdef __cplusplus
#define __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE ABI::Windows::Foundation::IAsyncOperationProgressHandler<ABI::Windows::Media::Transcoding::TranscodeFailureReason,DOUBLE >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <inspectable.h>
#include <asyncinfo.h>
#include <eventtoken.h>
#include <windowscontracts.h>
#include <windows.foundation.h>
#include <windows.media.core.h>
#include <windows.media.mediaproperties.h>
#include <windows.storage.h>
#include <windows.storage.streams.h>

#ifdef __cplusplus
extern "C" {
#endif

#if !defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)
#define WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION 0xe0000
#endif // defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CTranscoding_CMediaVideoProcessingAlgorithm_ENUM_DEFINED__
#define ____x_ABI_CWindows_CMedia_CTranscoding_CMediaVideoProcessingAlgorithm_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Transcoding {
                enum MediaVideoProcessingAlgorithm {
                    MediaVideoProcessingAlgorithm_Default = 0,
                    MediaVideoProcessingAlgorithm_MrfCrf444 = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CMedia_CTranscoding_CMediaVideoProcessingAlgorithm {
    MediaVideoProcessingAlgorithm_Default = 0,
    MediaVideoProcessingAlgorithm_MrfCrf444 = 1
};
#ifdef WIDL_using_Windows_Media_Transcoding
#define MediaVideoProcessingAlgorithm __x_ABI_CWindows_CMedia_CTranscoding_CMediaVideoProcessingAlgorithm
#endif /* WIDL_using_Windows_Media_Transcoding */
#endif

#endif /* ____x_ABI_CWindows_CMedia_CTranscoding_CMediaVideoProcessingAlgorithm_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CMedia_CTranscoding_CMediaVideoProcessingAlgorithm __x_ABI_CWindows_CMedia_CTranscoding_CMediaVideoProcessingAlgorithm;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CTranscoding_CTranscodeFailureReason_ENUM_DEFINED__
#define ____x_ABI_CWindows_CMedia_CTranscoding_CTranscodeFailureReason_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Transcoding {
                enum TranscodeFailureReason {
                    TranscodeFailureReason_None = 0,
                    TranscodeFailureReason_Unknown = 1,
                    TranscodeFailureReason_InvalidProfile = 2,
                    TranscodeFailureReason_CodecNotFound = 3
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CMedia_CTranscoding_CTranscodeFailureReason {
    TranscodeFailureReason_None = 0,
    TranscodeFailureReason_Unknown = 1,
    TranscodeFailureReason_InvalidProfile = 2,
    TranscodeFailureReason_CodecNotFound = 3
};
#ifdef WIDL_using_Windows_Media_Transcoding
#define TranscodeFailureReason __x_ABI_CWindows_CMedia_CTranscoding_CTranscodeFailureReason
#endif /* WIDL_using_Windows_Media_Transcoding */
#endif

#endif /* ____x_ABI_CWindows_CMedia_CTranscoding_CTranscodeFailureReason_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CMedia_CTranscoding_CTranscodeFailureReason __x_ABI_CWindows_CMedia_CTranscoding_CTranscodeFailureReason;
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder ABI::Windows::Media::Transcoding::IMediaTranscoder
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Transcoding {
                interface IMediaTranscoder;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2 __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2 ABI::Windows::Media::Transcoding::IMediaTranscoder2
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Transcoding {
                interface IMediaTranscoder2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult ABI::Windows::Media::Transcoding::IPrepareTranscodeResult
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Transcoding {
                interface IPrepareTranscodeResult;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncActionWithProgress_1_DOUBLE_FWD_DEFINED__
#define ____FIAsyncActionWithProgress_1_DOUBLE_FWD_DEFINED__
typedef interface __FIAsyncActionWithProgress_1_DOUBLE __FIAsyncActionWithProgress_1_DOUBLE;
#ifdef __cplusplus
#define __FIAsyncActionWithProgress_1_DOUBLE ABI::Windows::Foundation::IAsyncActionWithProgress<DOUBLE >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Media::Transcoding::PrepareTranscodeResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_TranscodeFailureReason_FWD_DEFINED__
#define ____FIAsyncOperation_1_TranscodeFailureReason_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_TranscodeFailureReason __FIAsyncOperation_1_TranscodeFailureReason;
#ifdef __cplusplus
#define __FIAsyncOperation_1_TranscodeFailureReason ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Media::Transcoding::TranscodeFailureReason >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_FWD_DEFINED__
#define ____FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_FWD_DEFINED__
typedef interface __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE;
#ifdef __cplusplus
#define __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE ABI::Windows::Foundation::IAsyncOperationWithProgress<ABI::Windows::Media::Transcoding::TranscodeFailureReason,DOUBLE >
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * IMediaTranscoder interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder, 0x190c99d2, 0xa0aa, 0x4d34, 0x86,0xbc, 0xee,0xd1,0xb1,0x2c,0x2f,0x5b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Transcoding {
                MIDL_INTERFACE("190c99d2-a0aa-4d34-86bc-eed1b12c2f5b")
                IMediaTranscoder : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE put_TrimStartTime(
                        ABI::Windows::Foundation::TimeSpan value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_TrimStartTime(
                        ABI::Windows::Foundation::TimeSpan *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_TrimStopTime(
                        ABI::Windows::Foundation::TimeSpan value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_TrimStopTime(
                        ABI::Windows::Foundation::TimeSpan *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_AlwaysReencode(
                        boolean value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_AlwaysReencode(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_HardwareAccelerationEnabled(
                        boolean value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_HardwareAccelerationEnabled(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE AddAudioEffect(
                        HSTRING activatable_class_id) = 0;

                    virtual HRESULT STDMETHODCALLTYPE AddAudioEffectWithSettings(
                        HSTRING activatable_class_id,
                        boolean effect_required,
                        ABI::Windows::Foundation::Collections::IPropertySet *configuration) = 0;

                    virtual HRESULT STDMETHODCALLTYPE AddVideoEffect(
                        HSTRING activatable_class_id) = 0;

                    virtual HRESULT STDMETHODCALLTYPE AddVideoEffectWithSettings(
                        HSTRING activatable_class_id,
                        boolean effect_required,
                        ABI::Windows::Foundation::Collections::IPropertySet *configuration) = 0;

                    virtual HRESULT STDMETHODCALLTYPE ClearEffects(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE PrepareFileTranscodeAsync(
                        ABI::Windows::Storage::IStorageFile *source,
                        ABI::Windows::Storage::IStorageFile *destination,
                        ABI::Windows::Media::MediaProperties::IMediaEncodingProfile *profile,
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Media::Transcoding::PrepareTranscodeResult* > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE PrepareStreamTranscodeAsync(
                        ABI::Windows::Storage::Streams::IRandomAccessStream *source,
                        ABI::Windows::Storage::Streams::IRandomAccessStream *destination,
                        ABI::Windows::Media::MediaProperties::IMediaEncodingProfile *profile,
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Media::Transcoding::PrepareTranscodeResult* > **operation) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder, 0x190c99d2, 0xa0aa, 0x4d34, 0x86,0xbc, 0xee,0xd1,0xb1,0x2c,0x2f,0x5b)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoderVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder *This,
        TrustLevel *trustLevel);

    /*** IMediaTranscoder methods ***/
    HRESULT (STDMETHODCALLTYPE *put_TrimStartTime)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan value);

    HRESULT (STDMETHODCALLTYPE *get_TrimStartTime)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan *value);

    HRESULT (STDMETHODCALLTYPE *put_TrimStopTime)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan value);

    HRESULT (STDMETHODCALLTYPE *get_TrimStopTime)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan *value);

    HRESULT (STDMETHODCALLTYPE *put_AlwaysReencode)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_AlwaysReencode)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_HardwareAccelerationEnabled)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_HardwareAccelerationEnabled)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *AddAudioEffect)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder *This,
        HSTRING activatable_class_id);

    HRESULT (STDMETHODCALLTYPE *AddAudioEffectWithSettings)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder *This,
        HSTRING activatable_class_id,
        boolean effect_required,
        __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet *configuration);

    HRESULT (STDMETHODCALLTYPE *AddVideoEffect)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder *This,
        HSTRING activatable_class_id);

    HRESULT (STDMETHODCALLTYPE *AddVideoEffectWithSettings)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder *This,
        HSTRING activatable_class_id,
        boolean effect_required,
        __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet *configuration);

    HRESULT (STDMETHODCALLTYPE *ClearEffects)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder *This);

    HRESULT (STDMETHODCALLTYPE *PrepareFileTranscodeAsync)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder *This,
        __x_ABI_CWindows_CStorage_CIStorageFile *source,
        __x_ABI_CWindows_CStorage_CIStorageFile *destination,
        __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile *profile,
        __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult **operation);

    HRESULT (STDMETHODCALLTYPE *PrepareStreamTranscodeAsync)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder *This,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *source,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *destination,
        __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile *profile,
        __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult **operation);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoderVtbl;

interface __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder {
    CONST_VTBL __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMediaTranscoder methods ***/
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_put_TrimStartTime(This,value) (This)->lpVtbl->put_TrimStartTime(This,value)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_get_TrimStartTime(This,value) (This)->lpVtbl->get_TrimStartTime(This,value)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_put_TrimStopTime(This,value) (This)->lpVtbl->put_TrimStopTime(This,value)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_get_TrimStopTime(This,value) (This)->lpVtbl->get_TrimStopTime(This,value)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_put_AlwaysReencode(This,value) (This)->lpVtbl->put_AlwaysReencode(This,value)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_get_AlwaysReencode(This,value) (This)->lpVtbl->get_AlwaysReencode(This,value)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_put_HardwareAccelerationEnabled(This,value) (This)->lpVtbl->put_HardwareAccelerationEnabled(This,value)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_get_HardwareAccelerationEnabled(This,value) (This)->lpVtbl->get_HardwareAccelerationEnabled(This,value)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_AddAudioEffect(This,activatable_class_id) (This)->lpVtbl->AddAudioEffect(This,activatable_class_id)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_AddAudioEffectWithSettings(This,activatable_class_id,effect_required,configuration) (This)->lpVtbl->AddAudioEffectWithSettings(This,activatable_class_id,effect_required,configuration)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_AddVideoEffect(This,activatable_class_id) (This)->lpVtbl->AddVideoEffect(This,activatable_class_id)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_AddVideoEffectWithSettings(This,activatable_class_id,effect_required,configuration) (This)->lpVtbl->AddVideoEffectWithSettings(This,activatable_class_id,effect_required,configuration)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_ClearEffects(This) (This)->lpVtbl->ClearEffects(This)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_PrepareFileTranscodeAsync(This,source,destination,profile,operation) (This)->lpVtbl->PrepareFileTranscodeAsync(This,source,destination,profile,operation)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_PrepareStreamTranscodeAsync(This,source,destination,profile,operation) (This)->lpVtbl->PrepareStreamTranscodeAsync(This,source,destination,profile,operation)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_QueryInterface(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_AddRef(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_Release(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_GetIids(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_GetTrustLevel(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMediaTranscoder methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_put_TrimStartTime(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder* This,__x_ABI_CWindows_CFoundation_CTimeSpan value) {
    return This->lpVtbl->put_TrimStartTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_get_TrimStartTime(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder* This,__x_ABI_CWindows_CFoundation_CTimeSpan *value) {
    return This->lpVtbl->get_TrimStartTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_put_TrimStopTime(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder* This,__x_ABI_CWindows_CFoundation_CTimeSpan value) {
    return This->lpVtbl->put_TrimStopTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_get_TrimStopTime(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder* This,__x_ABI_CWindows_CFoundation_CTimeSpan *value) {
    return This->lpVtbl->get_TrimStopTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_put_AlwaysReencode(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder* This,boolean value) {
    return This->lpVtbl->put_AlwaysReencode(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_get_AlwaysReencode(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder* This,boolean *value) {
    return This->lpVtbl->get_AlwaysReencode(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_put_HardwareAccelerationEnabled(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder* This,boolean value) {
    return This->lpVtbl->put_HardwareAccelerationEnabled(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_get_HardwareAccelerationEnabled(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder* This,boolean *value) {
    return This->lpVtbl->get_HardwareAccelerationEnabled(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_AddAudioEffect(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder* This,HSTRING activatable_class_id) {
    return This->lpVtbl->AddAudioEffect(This,activatable_class_id);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_AddAudioEffectWithSettings(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder* This,HSTRING activatable_class_id,boolean effect_required,__x_ABI_CWindows_CFoundation_CCollections_CIPropertySet *configuration) {
    return This->lpVtbl->AddAudioEffectWithSettings(This,activatable_class_id,effect_required,configuration);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_AddVideoEffect(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder* This,HSTRING activatable_class_id) {
    return This->lpVtbl->AddVideoEffect(This,activatable_class_id);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_AddVideoEffectWithSettings(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder* This,HSTRING activatable_class_id,boolean effect_required,__x_ABI_CWindows_CFoundation_CCollections_CIPropertySet *configuration) {
    return This->lpVtbl->AddVideoEffectWithSettings(This,activatable_class_id,effect_required,configuration);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_ClearEffects(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder* This) {
    return This->lpVtbl->ClearEffects(This);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_PrepareFileTranscodeAsync(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder* This,__x_ABI_CWindows_CStorage_CIStorageFile *source,__x_ABI_CWindows_CStorage_CIStorageFile *destination,__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile *profile,__FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult **operation) {
    return This->lpVtbl->PrepareFileTranscodeAsync(This,source,destination,profile,operation);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_PrepareStreamTranscodeAsync(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder* This,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *source,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *destination,__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile *profile,__FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult **operation) {
    return This->lpVtbl->PrepareStreamTranscodeAsync(This,source,destination,profile,operation);
}
#endif
#ifdef WIDL_using_Windows_Media_Transcoding
#define IID_IMediaTranscoder IID___x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder
#define IMediaTranscoderVtbl __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoderVtbl
#define IMediaTranscoder __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder
#define IMediaTranscoder_QueryInterface __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_QueryInterface
#define IMediaTranscoder_AddRef __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_AddRef
#define IMediaTranscoder_Release __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_Release
#define IMediaTranscoder_GetIids __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_GetIids
#define IMediaTranscoder_GetRuntimeClassName __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_GetRuntimeClassName
#define IMediaTranscoder_GetTrustLevel __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_GetTrustLevel
#define IMediaTranscoder_put_TrimStartTime __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_put_TrimStartTime
#define IMediaTranscoder_get_TrimStartTime __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_get_TrimStartTime
#define IMediaTranscoder_put_TrimStopTime __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_put_TrimStopTime
#define IMediaTranscoder_get_TrimStopTime __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_get_TrimStopTime
#define IMediaTranscoder_put_AlwaysReencode __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_put_AlwaysReencode
#define IMediaTranscoder_get_AlwaysReencode __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_get_AlwaysReencode
#define IMediaTranscoder_put_HardwareAccelerationEnabled __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_put_HardwareAccelerationEnabled
#define IMediaTranscoder_get_HardwareAccelerationEnabled __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_get_HardwareAccelerationEnabled
#define IMediaTranscoder_AddAudioEffect __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_AddAudioEffect
#define IMediaTranscoder_AddAudioEffectWithSettings __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_AddAudioEffectWithSettings
#define IMediaTranscoder_AddVideoEffect __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_AddVideoEffect
#define IMediaTranscoder_AddVideoEffectWithSettings __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_AddVideoEffectWithSettings
#define IMediaTranscoder_ClearEffects __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_ClearEffects
#define IMediaTranscoder_PrepareFileTranscodeAsync __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_PrepareFileTranscodeAsync
#define IMediaTranscoder_PrepareStreamTranscodeAsync __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_PrepareStreamTranscodeAsync
#endif /* WIDL_using_Windows_Media_Transcoding */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IMediaTranscoder2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2, 0x40531d74, 0x35e0, 0x4f04, 0x85,0x74, 0xca,0x8b,0xc4,0xe5,0xa0,0x82);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Transcoding {
                MIDL_INTERFACE("40531d74-35e0-4f04-8574-ca8bc4e5a082")
                IMediaTranscoder2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE PrepareMediaStreamSourceTranscodeAsync(
                        ABI::Windows::Media::Core::IMediaSource *source,
                        ABI::Windows::Storage::Streams::IRandomAccessStream *destination,
                        ABI::Windows::Media::MediaProperties::IMediaEncodingProfile *profile,
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Media::Transcoding::PrepareTranscodeResult* > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_VideoProcessingAlgorithm(
                        ABI::Windows::Media::Transcoding::MediaVideoProcessingAlgorithm value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_VideoProcessingAlgorithm(
                        ABI::Windows::Media::Transcoding::MediaVideoProcessingAlgorithm *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2, 0x40531d74, 0x35e0, 0x4f04, 0x85,0x74, 0xca,0x8b,0xc4,0xe5,0xa0,0x82)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2 *This,
        TrustLevel *trustLevel);

    /*** IMediaTranscoder2 methods ***/
    HRESULT (STDMETHODCALLTYPE *PrepareMediaStreamSourceTranscodeAsync)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2 *This,
        __x_ABI_CWindows_CMedia_CCore_CIMediaSource *source,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *destination,
        __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile *profile,
        __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult **operation);

    HRESULT (STDMETHODCALLTYPE *put_VideoProcessingAlgorithm)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2 *This,
        __x_ABI_CWindows_CMedia_CTranscoding_CMediaVideoProcessingAlgorithm value);

    HRESULT (STDMETHODCALLTYPE *get_VideoProcessingAlgorithm)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2 *This,
        __x_ABI_CWindows_CMedia_CTranscoding_CMediaVideoProcessingAlgorithm *value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2Vtbl;

interface __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2 {
    CONST_VTBL __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMediaTranscoder2 methods ***/
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_PrepareMediaStreamSourceTranscodeAsync(This,source,destination,profile,operation) (This)->lpVtbl->PrepareMediaStreamSourceTranscodeAsync(This,source,destination,profile,operation)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_put_VideoProcessingAlgorithm(This,value) (This)->lpVtbl->put_VideoProcessingAlgorithm(This,value)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_get_VideoProcessingAlgorithm(This,value) (This)->lpVtbl->get_VideoProcessingAlgorithm(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_QueryInterface(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_AddRef(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_Release(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_GetIids(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_GetTrustLevel(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMediaTranscoder2 methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_PrepareMediaStreamSourceTranscodeAsync(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2* This,__x_ABI_CWindows_CMedia_CCore_CIMediaSource *source,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *destination,__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile *profile,__FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult **operation) {
    return This->lpVtbl->PrepareMediaStreamSourceTranscodeAsync(This,source,destination,profile,operation);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_put_VideoProcessingAlgorithm(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2* This,__x_ABI_CWindows_CMedia_CTranscoding_CMediaVideoProcessingAlgorithm value) {
    return This->lpVtbl->put_VideoProcessingAlgorithm(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_get_VideoProcessingAlgorithm(__x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2* This,__x_ABI_CWindows_CMedia_CTranscoding_CMediaVideoProcessingAlgorithm *value) {
    return This->lpVtbl->get_VideoProcessingAlgorithm(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_Transcoding
#define IID_IMediaTranscoder2 IID___x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2
#define IMediaTranscoder2Vtbl __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2Vtbl
#define IMediaTranscoder2 __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2
#define IMediaTranscoder2_QueryInterface __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_QueryInterface
#define IMediaTranscoder2_AddRef __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_AddRef
#define IMediaTranscoder2_Release __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_Release
#define IMediaTranscoder2_GetIids __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_GetIids
#define IMediaTranscoder2_GetRuntimeClassName __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_GetRuntimeClassName
#define IMediaTranscoder2_GetTrustLevel __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_GetTrustLevel
#define IMediaTranscoder2_PrepareMediaStreamSourceTranscodeAsync __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_PrepareMediaStreamSourceTranscodeAsync
#define IMediaTranscoder2_put_VideoProcessingAlgorithm __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_put_VideoProcessingAlgorithm
#define IMediaTranscoder2_get_VideoProcessingAlgorithm __x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_get_VideoProcessingAlgorithm
#endif /* WIDL_using_Windows_Media_Transcoding */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CMedia_CTranscoding_CIMediaTranscoder2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IPrepareTranscodeResult interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult, 0x05f25dce, 0x994f, 0x4a34, 0x9d,0x68, 0x97,0xcc,0xce,0x17,0x30,0xd6);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace Transcoding {
                MIDL_INTERFACE("05f25dce-994f-4a34-9d68-97ccce1730d6")
                IPrepareTranscodeResult : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_CanTranscode(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_FailureReason(
                        ABI::Windows::Media::Transcoding::TranscodeFailureReason *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TranscodeAsync(
                        ABI::Windows::Foundation::IAsyncActionWithProgress<DOUBLE > **operation) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult, 0x05f25dce, 0x994f, 0x4a34, 0x9d,0x68, 0x97,0xcc,0xce,0x17,0x30,0xd6)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResultVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult *This,
        TrustLevel *trustLevel);

    /*** IPrepareTranscodeResult methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CanTranscode)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_FailureReason)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult *This,
        __x_ABI_CWindows_CMedia_CTranscoding_CTranscodeFailureReason *value);

    HRESULT (STDMETHODCALLTYPE *TranscodeAsync)(
        __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult *This,
        __FIAsyncActionWithProgress_1_DOUBLE **operation);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResultVtbl;

interface __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult {
    CONST_VTBL __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPrepareTranscodeResult methods ***/
#define __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_get_CanTranscode(This,value) (This)->lpVtbl->get_CanTranscode(This,value)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_get_FailureReason(This,value) (This)->lpVtbl->get_FailureReason(This,value)
#define __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_TranscodeAsync(This,operation) (This)->lpVtbl->TranscodeAsync(This,operation)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_QueryInterface(__x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_AddRef(__x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_Release(__x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_GetIids(__x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_GetTrustLevel(__x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPrepareTranscodeResult methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_get_CanTranscode(__x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult* This,boolean *value) {
    return This->lpVtbl->get_CanTranscode(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_get_FailureReason(__x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult* This,__x_ABI_CWindows_CMedia_CTranscoding_CTranscodeFailureReason *value) {
    return This->lpVtbl->get_FailureReason(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_TranscodeAsync(__x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult* This,__FIAsyncActionWithProgress_1_DOUBLE **operation) {
    return This->lpVtbl->TranscodeAsync(This,operation);
}
#endif
#ifdef WIDL_using_Windows_Media_Transcoding
#define IID_IPrepareTranscodeResult IID___x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult
#define IPrepareTranscodeResultVtbl __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResultVtbl
#define IPrepareTranscodeResult __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult
#define IPrepareTranscodeResult_QueryInterface __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_QueryInterface
#define IPrepareTranscodeResult_AddRef __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_AddRef
#define IPrepareTranscodeResult_Release __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_Release
#define IPrepareTranscodeResult_GetIids __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_GetIids
#define IPrepareTranscodeResult_GetRuntimeClassName __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_GetRuntimeClassName
#define IPrepareTranscodeResult_GetTrustLevel __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_GetTrustLevel
#define IPrepareTranscodeResult_get_CanTranscode __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_get_CanTranscode
#define IPrepareTranscodeResult_get_FailureReason __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_get_FailureReason
#define IPrepareTranscodeResult_TranscodeAsync __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_TranscodeAsync
#endif /* WIDL_using_Windows_Media_Transcoding */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.Transcoding.MediaTranscoder
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_Transcoding_MediaTranscoder_DEFINED
#define RUNTIMECLASS_Windows_Media_Transcoding_MediaTranscoder_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_Transcoding_MediaTranscoder[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','T','r','a','n','s','c','o','d','i','n','g','.','M','e','d','i','a','T','r','a','n','s','c','o','d','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_Transcoding_MediaTranscoder[] = L"Windows.Media.Transcoding.MediaTranscoder";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_Transcoding_MediaTranscoder[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','T','r','a','n','s','c','o','d','i','n','g','.','M','e','d','i','a','T','r','a','n','s','c','o','d','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_Transcoding_MediaTranscoder_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.Transcoding.PrepareTranscodeResult
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_Transcoding_PrepareTranscodeResult_DEFINED
#define RUNTIMECLASS_Windows_Media_Transcoding_PrepareTranscodeResult_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_Transcoding_PrepareTranscodeResult[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','T','r','a','n','s','c','o','d','i','n','g','.','P','r','e','p','a','r','e','T','r','a','n','s','c','o','d','e','R','e','s','u','l','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_Transcoding_PrepareTranscodeResult[] = L"Windows.Media.Transcoding.PrepareTranscodeResult";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_Transcoding_PrepareTranscodeResult[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','T','r','a','n','s','c','o','d','i','n','g','.','P','r','e','p','a','r','e','T','r','a','n','s','c','o','d','e','R','e','s','u','l','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_Transcoding_PrepareTranscodeResult_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IAsyncActionWithProgress<DOUBLE > interface
 */
#ifndef ____FIAsyncActionWithProgress_1_DOUBLE_INTERFACE_DEFINED__
#define ____FIAsyncActionWithProgress_1_DOUBLE_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncActionWithProgress_1_DOUBLE, 0x4f1430a6, 0xa825, 0x56ca, 0xb0,0x47, 0x1a,0x9b,0xad,0x52,0xba,0x67);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("4f1430a6-a825-56ca-b047-1a9bad52ba67")
            IAsyncActionWithProgress<DOUBLE > : IAsyncActionWithProgress_impl<DOUBLE >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncActionWithProgress_1_DOUBLE, 0x4f1430a6, 0xa825, 0x56ca, 0xb0,0x47, 0x1a,0x9b,0xad,0x52,0xba,0x67)
#endif
#else
typedef struct __FIAsyncActionWithProgress_1_DOUBLEVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncActionWithProgress_1_DOUBLE *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncActionWithProgress_1_DOUBLE *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncActionWithProgress_1_DOUBLE *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncActionWithProgress_1_DOUBLE *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncActionWithProgress_1_DOUBLE *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncActionWithProgress_1_DOUBLE *This,
        TrustLevel *trustLevel);

    /*** IAsyncActionWithProgress<DOUBLE > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Progress)(
        __FIAsyncActionWithProgress_1_DOUBLE *This,
        __FIAsyncActionProgressHandler_1_DOUBLE *handler);

    HRESULT (STDMETHODCALLTYPE *get_Progress)(
        __FIAsyncActionWithProgress_1_DOUBLE *This,
        __FIAsyncActionProgressHandler_1_DOUBLE **handler);

    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncActionWithProgress_1_DOUBLE *This,
        __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncActionWithProgress_1_DOUBLE *This,
        __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncActionWithProgress_1_DOUBLE *This);

    END_INTERFACE
} __FIAsyncActionWithProgress_1_DOUBLEVtbl;

interface __FIAsyncActionWithProgress_1_DOUBLE {
    CONST_VTBL __FIAsyncActionWithProgress_1_DOUBLEVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncActionWithProgress_1_DOUBLE_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncActionWithProgress_1_DOUBLE_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncActionWithProgress_1_DOUBLE_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncActionWithProgress_1_DOUBLE_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncActionWithProgress_1_DOUBLE_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncActionWithProgress_1_DOUBLE_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncActionWithProgress<DOUBLE > methods ***/
#define __FIAsyncActionWithProgress_1_DOUBLE_put_Progress(This,handler) (This)->lpVtbl->put_Progress(This,handler)
#define __FIAsyncActionWithProgress_1_DOUBLE_get_Progress(This,handler) (This)->lpVtbl->get_Progress(This,handler)
#define __FIAsyncActionWithProgress_1_DOUBLE_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncActionWithProgress_1_DOUBLE_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncActionWithProgress_1_DOUBLE_GetResults(This) (This)->lpVtbl->GetResults(This)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncActionWithProgress_1_DOUBLE_QueryInterface(__FIAsyncActionWithProgress_1_DOUBLE* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncActionWithProgress_1_DOUBLE_AddRef(__FIAsyncActionWithProgress_1_DOUBLE* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncActionWithProgress_1_DOUBLE_Release(__FIAsyncActionWithProgress_1_DOUBLE* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncActionWithProgress_1_DOUBLE_GetIids(__FIAsyncActionWithProgress_1_DOUBLE* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncActionWithProgress_1_DOUBLE_GetRuntimeClassName(__FIAsyncActionWithProgress_1_DOUBLE* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncActionWithProgress_1_DOUBLE_GetTrustLevel(__FIAsyncActionWithProgress_1_DOUBLE* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncActionWithProgress<DOUBLE > methods ***/
static inline HRESULT __FIAsyncActionWithProgress_1_DOUBLE_put_Progress(__FIAsyncActionWithProgress_1_DOUBLE* This,__FIAsyncActionProgressHandler_1_DOUBLE *handler) {
    return This->lpVtbl->put_Progress(This,handler);
}
static inline HRESULT __FIAsyncActionWithProgress_1_DOUBLE_get_Progress(__FIAsyncActionWithProgress_1_DOUBLE* This,__FIAsyncActionProgressHandler_1_DOUBLE **handler) {
    return This->lpVtbl->get_Progress(This,handler);
}
static inline HRESULT __FIAsyncActionWithProgress_1_DOUBLE_put_Completed(__FIAsyncActionWithProgress_1_DOUBLE* This,__FIAsyncActionWithProgressCompletedHandler_1_DOUBLE *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncActionWithProgress_1_DOUBLE_get_Completed(__FIAsyncActionWithProgress_1_DOUBLE* This,__FIAsyncActionWithProgressCompletedHandler_1_DOUBLE **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncActionWithProgress_1_DOUBLE_GetResults(__FIAsyncActionWithProgress_1_DOUBLE* This) {
    return This->lpVtbl->GetResults(This);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncActionWithProgress_DOUBLE IID___FIAsyncActionWithProgress_1_DOUBLE
#define IAsyncActionWithProgress_DOUBLEVtbl __FIAsyncActionWithProgress_1_DOUBLEVtbl
#define IAsyncActionWithProgress_DOUBLE __FIAsyncActionWithProgress_1_DOUBLE
#define IAsyncActionWithProgress_DOUBLE_QueryInterface __FIAsyncActionWithProgress_1_DOUBLE_QueryInterface
#define IAsyncActionWithProgress_DOUBLE_AddRef __FIAsyncActionWithProgress_1_DOUBLE_AddRef
#define IAsyncActionWithProgress_DOUBLE_Release __FIAsyncActionWithProgress_1_DOUBLE_Release
#define IAsyncActionWithProgress_DOUBLE_GetIids __FIAsyncActionWithProgress_1_DOUBLE_GetIids
#define IAsyncActionWithProgress_DOUBLE_GetRuntimeClassName __FIAsyncActionWithProgress_1_DOUBLE_GetRuntimeClassName
#define IAsyncActionWithProgress_DOUBLE_GetTrustLevel __FIAsyncActionWithProgress_1_DOUBLE_GetTrustLevel
#define IAsyncActionWithProgress_DOUBLE_put_Progress __FIAsyncActionWithProgress_1_DOUBLE_put_Progress
#define IAsyncActionWithProgress_DOUBLE_get_Progress __FIAsyncActionWithProgress_1_DOUBLE_get_Progress
#define IAsyncActionWithProgress_DOUBLE_put_Completed __FIAsyncActionWithProgress_1_DOUBLE_put_Completed
#define IAsyncActionWithProgress_DOUBLE_get_Completed __FIAsyncActionWithProgress_1_DOUBLE_get_Completed
#define IAsyncActionWithProgress_DOUBLE_GetResults __FIAsyncActionWithProgress_1_DOUBLE_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncActionWithProgress_1_DOUBLE_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncActionProgressHandler<DOUBLE > interface
 */
#ifndef ____FIAsyncActionProgressHandler_1_DOUBLE_INTERFACE_DEFINED__
#define ____FIAsyncActionProgressHandler_1_DOUBLE_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncActionProgressHandler_1_DOUBLE, 0x44825c7c, 0x0da9, 0x5691, 0xb2,0xb4, 0x91,0x4f,0x23,0x1e,0xec,0xed);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("44825c7c-0da9-5691-b2b4-914f231eeced")
            IAsyncActionProgressHandler<DOUBLE > : IAsyncActionProgressHandler_impl<DOUBLE >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncActionProgressHandler_1_DOUBLE, 0x44825c7c, 0x0da9, 0x5691, 0xb2,0xb4, 0x91,0x4f,0x23,0x1e,0xec,0xed)
#endif
#else
typedef struct __FIAsyncActionProgressHandler_1_DOUBLEVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncActionProgressHandler_1_DOUBLE *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncActionProgressHandler_1_DOUBLE *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncActionProgressHandler_1_DOUBLE *This);

    /*** IAsyncActionProgressHandler<DOUBLE > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncActionProgressHandler_1_DOUBLE *This,
        __FIAsyncActionWithProgress_1_DOUBLE *info,
        DOUBLE progress);

    END_INTERFACE
} __FIAsyncActionProgressHandler_1_DOUBLEVtbl;

interface __FIAsyncActionProgressHandler_1_DOUBLE {
    CONST_VTBL __FIAsyncActionProgressHandler_1_DOUBLEVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncActionProgressHandler_1_DOUBLE_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncActionProgressHandler_1_DOUBLE_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncActionProgressHandler_1_DOUBLE_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncActionProgressHandler<DOUBLE > methods ***/
#define __FIAsyncActionProgressHandler_1_DOUBLE_Invoke(This,info,progress) (This)->lpVtbl->Invoke(This,info,progress)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncActionProgressHandler_1_DOUBLE_QueryInterface(__FIAsyncActionProgressHandler_1_DOUBLE* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncActionProgressHandler_1_DOUBLE_AddRef(__FIAsyncActionProgressHandler_1_DOUBLE* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncActionProgressHandler_1_DOUBLE_Release(__FIAsyncActionProgressHandler_1_DOUBLE* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncActionProgressHandler<DOUBLE > methods ***/
static inline HRESULT __FIAsyncActionProgressHandler_1_DOUBLE_Invoke(__FIAsyncActionProgressHandler_1_DOUBLE* This,__FIAsyncActionWithProgress_1_DOUBLE *info,DOUBLE progress) {
    return This->lpVtbl->Invoke(This,info,progress);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncActionProgressHandler_DOUBLE IID___FIAsyncActionProgressHandler_1_DOUBLE
#define IAsyncActionProgressHandler_DOUBLEVtbl __FIAsyncActionProgressHandler_1_DOUBLEVtbl
#define IAsyncActionProgressHandler_DOUBLE __FIAsyncActionProgressHandler_1_DOUBLE
#define IAsyncActionProgressHandler_DOUBLE_QueryInterface __FIAsyncActionProgressHandler_1_DOUBLE_QueryInterface
#define IAsyncActionProgressHandler_DOUBLE_AddRef __FIAsyncActionProgressHandler_1_DOUBLE_AddRef
#define IAsyncActionProgressHandler_DOUBLE_Release __FIAsyncActionProgressHandler_1_DOUBLE_Release
#define IAsyncActionProgressHandler_DOUBLE_Invoke __FIAsyncActionProgressHandler_1_DOUBLE_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncActionProgressHandler_1_DOUBLE_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncActionWithProgressCompletedHandler<DOUBLE > interface
 */
#ifndef ____FIAsyncActionWithProgressCompletedHandler_1_DOUBLE_INTERFACE_DEFINED__
#define ____FIAsyncActionWithProgressCompletedHandler_1_DOUBLE_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncActionWithProgressCompletedHandler_1_DOUBLE, 0x94d64ac6, 0x4491, 0x53ef, 0x8b,0xe8, 0x36,0x48,0x1f,0x3f,0xf1,0xe8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("94d64ac6-4491-53ef-8be8-36481f3ff1e8")
            IAsyncActionWithProgressCompletedHandler<DOUBLE > : IAsyncActionWithProgressCompletedHandler_impl<DOUBLE >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncActionWithProgressCompletedHandler_1_DOUBLE, 0x94d64ac6, 0x4491, 0x53ef, 0x8b,0xe8, 0x36,0x48,0x1f,0x3f,0xf1,0xe8)
#endif
#else
typedef struct __FIAsyncActionWithProgressCompletedHandler_1_DOUBLEVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE *This);

    /*** IAsyncActionWithProgressCompletedHandler<DOUBLE > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE *This,
        __FIAsyncActionWithProgress_1_DOUBLE *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncActionWithProgressCompletedHandler_1_DOUBLEVtbl;

interface __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE {
    CONST_VTBL __FIAsyncActionWithProgressCompletedHandler_1_DOUBLEVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncActionWithProgressCompletedHandler<DOUBLE > methods ***/
#define __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE_QueryInterface(__FIAsyncActionWithProgressCompletedHandler_1_DOUBLE* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE_AddRef(__FIAsyncActionWithProgressCompletedHandler_1_DOUBLE* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE_Release(__FIAsyncActionWithProgressCompletedHandler_1_DOUBLE* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncActionWithProgressCompletedHandler<DOUBLE > methods ***/
static inline HRESULT __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE_Invoke(__FIAsyncActionWithProgressCompletedHandler_1_DOUBLE* This,__FIAsyncActionWithProgress_1_DOUBLE *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncActionWithProgressCompletedHandler_DOUBLE IID___FIAsyncActionWithProgressCompletedHandler_1_DOUBLE
#define IAsyncActionWithProgressCompletedHandler_DOUBLEVtbl __FIAsyncActionWithProgressCompletedHandler_1_DOUBLEVtbl
#define IAsyncActionWithProgressCompletedHandler_DOUBLE __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE
#define IAsyncActionWithProgressCompletedHandler_DOUBLE_QueryInterface __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE_QueryInterface
#define IAsyncActionWithProgressCompletedHandler_DOUBLE_AddRef __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE_AddRef
#define IAsyncActionWithProgressCompletedHandler_DOUBLE_Release __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE_Release
#define IAsyncActionWithProgressCompletedHandler_DOUBLE_Invoke __FIAsyncActionWithProgressCompletedHandler_1_DOUBLE_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncActionWithProgressCompletedHandler_1_DOUBLE_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Media::Transcoding::PrepareTranscodeResult* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult, 0xf5f07c13, 0x3047, 0x5bab, 0x8e,0xb7, 0x6e,0x5d,0x7d,0x14,0xaf,0xae);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("f5f07c13-3047-5bab-8eb7-6e5d7d14afae")
            IAsyncOperation<ABI::Windows::Media::Transcoding::PrepareTranscodeResult* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::Transcoding::PrepareTranscodeResult*, ABI::Windows::Media::Transcoding::IPrepareTranscodeResult* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult, 0xf5f07c13, 0x3047, 0x5bab, 0x8e,0xb7, 0x6e,0x5d,0x7d,0x14,0xaf,0xae)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResultVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperation<ABI::Windows::Media::Transcoding::PrepareTranscodeResult* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult *This,
        __x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResultVtbl;

interface __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult {
    CONST_VTBL __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Media::Transcoding::PrepareTranscodeResult* > methods ***/
#define __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_QueryInterface(__FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_AddRef(__FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_Release(__FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_GetIids(__FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_GetTrustLevel(__FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Media::Transcoding::PrepareTranscodeResult* > methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_put_Completed(__FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult* This,__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_get_Completed(__FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult* This,__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_GetResults(__FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult* This,__x_ABI_CWindows_CMedia_CTranscoding_CIPrepareTranscodeResult **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_PrepareTranscodeResult IID___FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult
#define IAsyncOperation_PrepareTranscodeResultVtbl __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResultVtbl
#define IAsyncOperation_PrepareTranscodeResult __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult
#define IAsyncOperation_PrepareTranscodeResult_QueryInterface __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_QueryInterface
#define IAsyncOperation_PrepareTranscodeResult_AddRef __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_AddRef
#define IAsyncOperation_PrepareTranscodeResult_Release __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_Release
#define IAsyncOperation_PrepareTranscodeResult_GetIids __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_GetIids
#define IAsyncOperation_PrepareTranscodeResult_GetRuntimeClassName __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_GetRuntimeClassName
#define IAsyncOperation_PrepareTranscodeResult_GetTrustLevel __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_GetTrustLevel
#define IAsyncOperation_PrepareTranscodeResult_put_Completed __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_put_Completed
#define IAsyncOperation_PrepareTranscodeResult_get_Completed __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_get_Completed
#define IAsyncOperation_PrepareTranscodeResult_GetResults __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Media::Transcoding::TranscodeFailureReason > interface
 */
#ifndef ____FIAsyncOperation_1_TranscodeFailureReason_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_TranscodeFailureReason_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_TranscodeFailureReason, 0x02132510, 0x3899, 0x5257, 0xbe,0xd9, 0xa4,0x3e,0x51,0x49,0xd2,0x8c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("02132510-3899-5257-bed9-a43e5149d28c")
            IAsyncOperation<ABI::Windows::Media::Transcoding::TranscodeFailureReason > : IAsyncOperation_impl<ABI::Windows::Media::Transcoding::TranscodeFailureReason >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_TranscodeFailureReason, 0x02132510, 0x3899, 0x5257, 0xbe,0xd9, 0xa4,0x3e,0x51,0x49,0xd2,0x8c)
#endif
#else
typedef struct __FIAsyncOperation_1_TranscodeFailureReasonVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperation_1_TranscodeFailureReason *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperation_1_TranscodeFailureReason *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperation_1_TranscodeFailureReason *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperation_1_TranscodeFailureReason *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperation_1_TranscodeFailureReason *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperation_1_TranscodeFailureReason *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperation<ABI::Windows::Media::Transcoding::TranscodeFailureReason > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_TranscodeFailureReason *This,
        __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_TranscodeFailureReason *This,
        __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_TranscodeFailureReason *This,
        __x_ABI_CWindows_CMedia_CTranscoding_CTranscodeFailureReason *results);

    END_INTERFACE
} __FIAsyncOperation_1_TranscodeFailureReasonVtbl;

interface __FIAsyncOperation_1_TranscodeFailureReason {
    CONST_VTBL __FIAsyncOperation_1_TranscodeFailureReasonVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_TranscodeFailureReason_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_TranscodeFailureReason_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_TranscodeFailureReason_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_TranscodeFailureReason_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_TranscodeFailureReason_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_TranscodeFailureReason_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Media::Transcoding::TranscodeFailureReason > methods ***/
#define __FIAsyncOperation_1_TranscodeFailureReason_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_TranscodeFailureReason_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_TranscodeFailureReason_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_TranscodeFailureReason_QueryInterface(__FIAsyncOperation_1_TranscodeFailureReason* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_TranscodeFailureReason_AddRef(__FIAsyncOperation_1_TranscodeFailureReason* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_TranscodeFailureReason_Release(__FIAsyncOperation_1_TranscodeFailureReason* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_TranscodeFailureReason_GetIids(__FIAsyncOperation_1_TranscodeFailureReason* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_TranscodeFailureReason_GetRuntimeClassName(__FIAsyncOperation_1_TranscodeFailureReason* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_TranscodeFailureReason_GetTrustLevel(__FIAsyncOperation_1_TranscodeFailureReason* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Media::Transcoding::TranscodeFailureReason > methods ***/
static inline HRESULT __FIAsyncOperation_1_TranscodeFailureReason_put_Completed(__FIAsyncOperation_1_TranscodeFailureReason* This,__FIAsyncOperationCompletedHandler_1_TranscodeFailureReason *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_TranscodeFailureReason_get_Completed(__FIAsyncOperation_1_TranscodeFailureReason* This,__FIAsyncOperationCompletedHandler_1_TranscodeFailureReason **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_TranscodeFailureReason_GetResults(__FIAsyncOperation_1_TranscodeFailureReason* This,__x_ABI_CWindows_CMedia_CTranscoding_CTranscodeFailureReason *results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_TranscodeFailureReason IID___FIAsyncOperation_1_TranscodeFailureReason
#define IAsyncOperation_TranscodeFailureReasonVtbl __FIAsyncOperation_1_TranscodeFailureReasonVtbl
#define IAsyncOperation_TranscodeFailureReason __FIAsyncOperation_1_TranscodeFailureReason
#define IAsyncOperation_TranscodeFailureReason_QueryInterface __FIAsyncOperation_1_TranscodeFailureReason_QueryInterface
#define IAsyncOperation_TranscodeFailureReason_AddRef __FIAsyncOperation_1_TranscodeFailureReason_AddRef
#define IAsyncOperation_TranscodeFailureReason_Release __FIAsyncOperation_1_TranscodeFailureReason_Release
#define IAsyncOperation_TranscodeFailureReason_GetIids __FIAsyncOperation_1_TranscodeFailureReason_GetIids
#define IAsyncOperation_TranscodeFailureReason_GetRuntimeClassName __FIAsyncOperation_1_TranscodeFailureReason_GetRuntimeClassName
#define IAsyncOperation_TranscodeFailureReason_GetTrustLevel __FIAsyncOperation_1_TranscodeFailureReason_GetTrustLevel
#define IAsyncOperation_TranscodeFailureReason_put_Completed __FIAsyncOperation_1_TranscodeFailureReason_put_Completed
#define IAsyncOperation_TranscodeFailureReason_get_Completed __FIAsyncOperation_1_TranscodeFailureReason_get_Completed
#define IAsyncOperation_TranscodeFailureReason_GetResults __FIAsyncOperation_1_TranscodeFailureReason_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_TranscodeFailureReason_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationWithProgress<ABI::Windows::Media::Transcoding::TranscodeFailureReason,DOUBLE > interface
 */
#ifndef ____FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_INTERFACE_DEFINED__
#define ____FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE, 0x272eec20, 0x4b64, 0x5d53, 0xa6,0x44, 0xf9,0x91,0x7b,0x3d,0x19,0xd8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("272eec20-4b64-5d53-a644-f9917b3d19d8")
            IAsyncOperationWithProgress<ABI::Windows::Media::Transcoding::TranscodeFailureReason,DOUBLE > : IAsyncOperationWithProgress_impl<ABI::Windows::Media::Transcoding::TranscodeFailureReason, DOUBLE >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE, 0x272eec20, 0x4b64, 0x5d53, 0xa6,0x44, 0xf9,0x91,0x7b,0x3d,0x19,0xd8)
#endif
#else
typedef struct __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLEVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperationWithProgress<ABI::Windows::Media::Transcoding::TranscodeFailureReason,DOUBLE > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Progress)(
        __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE *This,
        __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE *handler);

    HRESULT (STDMETHODCALLTYPE *get_Progress)(
        __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE *This,
        __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE **handler);

    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE *This,
        __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE *This,
        __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE *This,
        __x_ABI_CWindows_CMedia_CTranscoding_CTranscodeFailureReason *results);

    END_INTERFACE
} __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLEVtbl;

interface __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE {
    CONST_VTBL __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLEVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperationWithProgress<ABI::Windows::Media::Transcoding::TranscodeFailureReason,DOUBLE > methods ***/
#define __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_put_Progress(This,handler) (This)->lpVtbl->put_Progress(This,handler)
#define __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_get_Progress(This,handler) (This)->lpVtbl->get_Progress(This,handler)
#define __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_QueryInterface(__FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_AddRef(__FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_Release(__FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_GetIids(__FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_GetRuntimeClassName(__FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_GetTrustLevel(__FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperationWithProgress<ABI::Windows::Media::Transcoding::TranscodeFailureReason,DOUBLE > methods ***/
static inline HRESULT __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_put_Progress(__FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE* This,__FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE *handler) {
    return This->lpVtbl->put_Progress(This,handler);
}
static inline HRESULT __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_get_Progress(__FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE* This,__FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE **handler) {
    return This->lpVtbl->get_Progress(This,handler);
}
static inline HRESULT __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_put_Completed(__FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE* This,__FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_get_Completed(__FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE* This,__FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_GetResults(__FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE* This,__x_ABI_CWindows_CMedia_CTranscoding_CTranscodeFailureReason *results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationWithProgress_TranscodeFailureReason_DOUBLE IID___FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE
#define IAsyncOperationWithProgress_TranscodeFailureReason_DOUBLEVtbl __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLEVtbl
#define IAsyncOperationWithProgress_TranscodeFailureReason_DOUBLE __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE
#define IAsyncOperationWithProgress_TranscodeFailureReason_DOUBLE_QueryInterface __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_QueryInterface
#define IAsyncOperationWithProgress_TranscodeFailureReason_DOUBLE_AddRef __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_AddRef
#define IAsyncOperationWithProgress_TranscodeFailureReason_DOUBLE_Release __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_Release
#define IAsyncOperationWithProgress_TranscodeFailureReason_DOUBLE_GetIids __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_GetIids
#define IAsyncOperationWithProgress_TranscodeFailureReason_DOUBLE_GetRuntimeClassName __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_GetRuntimeClassName
#define IAsyncOperationWithProgress_TranscodeFailureReason_DOUBLE_GetTrustLevel __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_GetTrustLevel
#define IAsyncOperationWithProgress_TranscodeFailureReason_DOUBLE_put_Progress __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_put_Progress
#define IAsyncOperationWithProgress_TranscodeFailureReason_DOUBLE_get_Progress __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_get_Progress
#define IAsyncOperationWithProgress_TranscodeFailureReason_DOUBLE_put_Completed __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_put_Completed
#define IAsyncOperationWithProgress_TranscodeFailureReason_DOUBLE_get_Completed __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_get_Completed
#define IAsyncOperationWithProgress_TranscodeFailureReason_DOUBLE_GetResults __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Media::Transcoding::PrepareTranscodeResult* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult, 0xa44d7d07, 0x8f74, 0x52ee, 0x9f,0x02, 0xc2,0xb2,0x44,0xb4,0xff,0x2a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("a44d7d07-8f74-52ee-9f02-c2b244b4ff2a")
            IAsyncOperationCompletedHandler<ABI::Windows::Media::Transcoding::PrepareTranscodeResult* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::Transcoding::PrepareTranscodeResult*, ABI::Windows::Media::Transcoding::IPrepareTranscodeResult* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult, 0xa44d7d07, 0x8f74, 0x52ee, 0x9f,0x02, 0xc2,0xb2,0x44,0xb4,0xff,0x2a)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResultVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult *This);

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Media::Transcoding::PrepareTranscodeResult* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult *This,
        __FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResultVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Media::Transcoding::PrepareTranscodeResult* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_Release(__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Media::Transcoding::PrepareTranscodeResult* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult* This,__FIAsyncOperation_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_PrepareTranscodeResult IID___FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult
#define IAsyncOperationCompletedHandler_PrepareTranscodeResultVtbl __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResultVtbl
#define IAsyncOperationCompletedHandler_PrepareTranscodeResult __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult
#define IAsyncOperationCompletedHandler_PrepareTranscodeResult_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_QueryInterface
#define IAsyncOperationCompletedHandler_PrepareTranscodeResult_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_AddRef
#define IAsyncOperationCompletedHandler_PrepareTranscodeResult_Release __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_Release
#define IAsyncOperationCompletedHandler_PrepareTranscodeResult_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CMedia__CTranscoding__CPrepareTranscodeResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Media::Transcoding::TranscodeFailureReason > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_TranscodeFailureReason_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_TranscodeFailureReason_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_TranscodeFailureReason, 0xc42ae2bf, 0xe194, 0x5179, 0xb8,0xad, 0x03,0xb5,0x1c,0x04,0xe1,0xda);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("c42ae2bf-e194-5179-b8ad-03b51c04e1da")
            IAsyncOperationCompletedHandler<ABI::Windows::Media::Transcoding::TranscodeFailureReason > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Media::Transcoding::TranscodeFailureReason >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_TranscodeFailureReason, 0xc42ae2bf, 0xe194, 0x5179, 0xb8,0xad, 0x03,0xb5,0x1c,0x04,0xe1,0xda)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_TranscodeFailureReasonVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason *This);

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Media::Transcoding::TranscodeFailureReason > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason *This,
        __FIAsyncOperation_1_TranscodeFailureReason *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_TranscodeFailureReasonVtbl;

interface __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_TranscodeFailureReasonVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Media::Transcoding::TranscodeFailureReason > methods ***/
#define __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason_QueryInterface(__FIAsyncOperationCompletedHandler_1_TranscodeFailureReason* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason_AddRef(__FIAsyncOperationCompletedHandler_1_TranscodeFailureReason* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason_Release(__FIAsyncOperationCompletedHandler_1_TranscodeFailureReason* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Media::Transcoding::TranscodeFailureReason > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason_Invoke(__FIAsyncOperationCompletedHandler_1_TranscodeFailureReason* This,__FIAsyncOperation_1_TranscodeFailureReason *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_TranscodeFailureReason IID___FIAsyncOperationCompletedHandler_1_TranscodeFailureReason
#define IAsyncOperationCompletedHandler_TranscodeFailureReasonVtbl __FIAsyncOperationCompletedHandler_1_TranscodeFailureReasonVtbl
#define IAsyncOperationCompletedHandler_TranscodeFailureReason __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason
#define IAsyncOperationCompletedHandler_TranscodeFailureReason_QueryInterface __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason_QueryInterface
#define IAsyncOperationCompletedHandler_TranscodeFailureReason_AddRef __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason_AddRef
#define IAsyncOperationCompletedHandler_TranscodeFailureReason_Release __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason_Release
#define IAsyncOperationCompletedHandler_TranscodeFailureReason_Invoke __FIAsyncOperationCompletedHandler_1_TranscodeFailureReason_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_TranscodeFailureReason_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationWithProgressCompletedHandler<ABI::Windows::Media::Transcoding::TranscodeFailureReason,DOUBLE > interface
 */
#ifndef ____FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE_INTERFACE_DEFINED__
#define ____FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE, 0x080f1890, 0x4fca, 0x5165, 0xa9,0x89, 0x4b,0x07,0xda,0x8e,0x0b,0x53);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("080f1890-4fca-5165-a989-4b07da8e0b53")
            IAsyncOperationWithProgressCompletedHandler<ABI::Windows::Media::Transcoding::TranscodeFailureReason,DOUBLE > : IAsyncOperationWithProgressCompletedHandler_impl<ABI::Windows::Media::Transcoding::TranscodeFailureReason, DOUBLE >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE, 0x080f1890, 0x4fca, 0x5165, 0xa9,0x89, 0x4b,0x07,0xda,0x8e,0x0b,0x53)
#endif
#else
typedef struct __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLEVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE *This);

    /*** IAsyncOperationWithProgressCompletedHandler<ABI::Windows::Media::Transcoding::TranscodeFailureReason,DOUBLE > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE *This,
        __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLEVtbl;

interface __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE {
    CONST_VTBL __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLEVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationWithProgressCompletedHandler<ABI::Windows::Media::Transcoding::TranscodeFailureReason,DOUBLE > methods ***/
#define __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE_QueryInterface(__FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE_AddRef(__FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE_Release(__FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationWithProgressCompletedHandler<ABI::Windows::Media::Transcoding::TranscodeFailureReason,DOUBLE > methods ***/
static inline HRESULT __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE_Invoke(__FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE* This,__FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationWithProgressCompletedHandler_TranscodeFailureReason_DOUBLE IID___FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE
#define IAsyncOperationWithProgressCompletedHandler_TranscodeFailureReason_DOUBLEVtbl __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLEVtbl
#define IAsyncOperationWithProgressCompletedHandler_TranscodeFailureReason_DOUBLE __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE
#define IAsyncOperationWithProgressCompletedHandler_TranscodeFailureReason_DOUBLE_QueryInterface __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE_QueryInterface
#define IAsyncOperationWithProgressCompletedHandler_TranscodeFailureReason_DOUBLE_AddRef __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE_AddRef
#define IAsyncOperationWithProgressCompletedHandler_TranscodeFailureReason_DOUBLE_Release __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE_Release
#define IAsyncOperationWithProgressCompletedHandler_TranscodeFailureReason_DOUBLE_Invoke __FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationWithProgressCompletedHandler_2_TranscodeFailureReason_DOUBLE_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationProgressHandler<ABI::Windows::Media::Transcoding::TranscodeFailureReason,DOUBLE > interface
 */
#ifndef ____FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE_INTERFACE_DEFINED__
#define ____FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE, 0x009c6245, 0x0e59, 0x53b0, 0x9f,0xd2, 0xd2,0x50,0xe4,0x5a,0x00,0xa3);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("009c6245-0e59-53b0-9fd2-d250e45a00a3")
            IAsyncOperationProgressHandler<ABI::Windows::Media::Transcoding::TranscodeFailureReason,DOUBLE > : IAsyncOperationProgressHandler_impl<ABI::Windows::Media::Transcoding::TranscodeFailureReason, DOUBLE >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE, 0x009c6245, 0x0e59, 0x53b0, 0x9f,0xd2, 0xd2,0x50,0xe4,0x5a,0x00,0xa3)
#endif
#else
typedef struct __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLEVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE *This);

    /*** IAsyncOperationProgressHandler<ABI::Windows::Media::Transcoding::TranscodeFailureReason,DOUBLE > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE *This,
        __FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE *info,
        DOUBLE progress);

    END_INTERFACE
} __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLEVtbl;

interface __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE {
    CONST_VTBL __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLEVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationProgressHandler<ABI::Windows::Media::Transcoding::TranscodeFailureReason,DOUBLE > methods ***/
#define __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE_Invoke(This,info,progress) (This)->lpVtbl->Invoke(This,info,progress)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE_QueryInterface(__FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE_AddRef(__FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE_Release(__FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationProgressHandler<ABI::Windows::Media::Transcoding::TranscodeFailureReason,DOUBLE > methods ***/
static inline HRESULT __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE_Invoke(__FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE* This,__FIAsyncOperationWithProgress_2_TranscodeFailureReason_DOUBLE *info,DOUBLE progress) {
    return This->lpVtbl->Invoke(This,info,progress);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationProgressHandler_TranscodeFailureReason_DOUBLE IID___FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE
#define IAsyncOperationProgressHandler_TranscodeFailureReason_DOUBLEVtbl __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLEVtbl
#define IAsyncOperationProgressHandler_TranscodeFailureReason_DOUBLE __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE
#define IAsyncOperationProgressHandler_TranscodeFailureReason_DOUBLE_QueryInterface __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE_QueryInterface
#define IAsyncOperationProgressHandler_TranscodeFailureReason_DOUBLE_AddRef __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE_AddRef
#define IAsyncOperationProgressHandler_TranscodeFailureReason_DOUBLE_Release __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE_Release
#define IAsyncOperationProgressHandler_TranscodeFailureReason_DOUBLE_Invoke __FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationProgressHandler_2_TranscodeFailureReason_DOUBLE_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER HSTRING_UserSize     (ULONG *, ULONG, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserMarshal  (ULONG *, unsigned char *, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
void            __RPC_USER HSTRING_UserFree     (ULONG *, HSTRING *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_media_transcoding_h__ */
