/*** Autogenerated by WIDL 11.0-rc1 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__ */
