/*** Autogenerated by WIDL 10.13 from include/windows.media.mediaproperties.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_mediaproperties_h__
#define __windows_media_mediaproperties_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties ABI::Windows::Media::MediaProperties::IAudioEncodingProperties
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IAudioEncodingProperties;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties ABI::Windows::Media::MediaProperties::IContainerEncodingProperties
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IContainerEncodingProperties;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile ABI::Windows::Media::MediaProperties::IMediaEncodingProfile
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IMediaEncodingProfile;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio ABI::Windows::Media::MediaProperties::IMediaRatio
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IMediaRatio;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties ABI::Windows::Media::MediaProperties::IVideoEncodingProperties
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IVideoEncodingProperties;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CAudioEncodingProperties_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CAudioEncodingProperties_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                class AudioEncodingProperties;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CMediaProperties_CAudioEncodingProperties __x_ABI_CWindows_CMedia_CMediaProperties_CAudioEncodingProperties;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CMediaProperties_CAudioEncodingProperties_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CContainerEncodingProperties_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CContainerEncodingProperties_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                class ContainerEncodingProperties;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CMediaProperties_CContainerEncodingProperties __x_ABI_CWindows_CMedia_CMediaProperties_CContainerEncodingProperties;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CMediaProperties_CContainerEncodingProperties_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CMediaEncodingProfile_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CMediaEncodingProfile_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                class MediaEncodingProfile;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CMediaProperties_CMediaEncodingProfile __x_ABI_CWindows_CMedia_CMediaProperties_CMediaEncodingProfile;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CMediaProperties_CMediaEncodingProfile_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CMediaRatio_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CMediaRatio_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                class MediaRatio;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CMediaProperties_CMediaRatio __x_ABI_CWindows_CMedia_CMediaProperties_CMediaRatio;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CMediaProperties_CMediaRatio_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CVideoEncodingProperties_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CVideoEncodingProperties_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                class VideoEncodingProperties;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CMediaProperties_CVideoEncodingProperties __x_ABI_CWindows_CMedia_CMediaProperties_CVideoEncodingProperties;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CMediaProperties_CVideoEncodingProperties_FWD_DEFINED__ */

/* 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.storage.h>
#include <windows.storage.streams.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties ABI::Windows::Media::MediaProperties::IAudioEncodingProperties
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IAudioEncodingProperties;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties2_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties2 __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties2 ABI::Windows::Media::MediaProperties::IAudioEncodingProperties2
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IAudioEncodingProperties2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties3_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties3 __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties3 ABI::Windows::Media::MediaProperties::IAudioEncodingProperties3
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IAudioEncodingProperties3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingPropertiesStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingPropertiesStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingPropertiesStatics __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingPropertiesStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingPropertiesStatics ABI::Windows::Media::MediaProperties::IAudioEncodingPropertiesStatics
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IAudioEncodingPropertiesStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingPropertiesStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingPropertiesStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingPropertiesStatics2 __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingPropertiesStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingPropertiesStatics2 ABI::Windows::Media::MediaProperties::IAudioEncodingPropertiesStatics2
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IAudioEncodingPropertiesStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingPropertiesWithFormatUserData_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingPropertiesWithFormatUserData_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingPropertiesWithFormatUserData __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingPropertiesWithFormatUserData;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingPropertiesWithFormatUserData ABI::Windows::Media::MediaProperties::IAudioEncodingPropertiesWithFormatUserData
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IAudioEncodingPropertiesWithFormatUserData;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties ABI::Windows::Media::MediaProperties::IContainerEncodingProperties
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IContainerEncodingProperties;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties2_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties2 __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties2 ABI::Windows::Media::MediaProperties::IContainerEncodingProperties2
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IContainerEncodingProperties2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile ABI::Windows::Media::MediaProperties::IMediaEncodingProfile
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IMediaEncodingProfile;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile2_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile2 __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile2 ABI::Windows::Media::MediaProperties::IMediaEncodingProfile2
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IMediaEncodingProfile2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile3_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile3 __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile3 ABI::Windows::Media::MediaProperties::IMediaEncodingProfile3
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IMediaEncodingProfile3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfileStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfileStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfileStatics __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfileStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfileStatics ABI::Windows::Media::MediaProperties::IMediaEncodingProfileStatics
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IMediaEncodingProfileStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfileStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfileStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfileStatics2 __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfileStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfileStatics2 ABI::Windows::Media::MediaProperties::IMediaEncodingProfileStatics2
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IMediaEncodingProfileStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfileStatics3_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfileStatics3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfileStatics3 __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfileStatics3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfileStatics3 ABI::Windows::Media::MediaProperties::IMediaEncodingProfileStatics3
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IMediaEncodingProfileStatics3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProperties_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProperties_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProperties __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProperties;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProperties ABI::Windows::Media::MediaProperties::IMediaEncodingProperties
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IMediaEncodingProperties;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio ABI::Windows::Media::MediaProperties::IMediaRatio
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IMediaRatio;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties ABI::Windows::Media::MediaProperties::IVideoEncodingProperties
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IVideoEncodingProperties;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties2_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties2 __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties2 ABI::Windows::Media::MediaProperties::IVideoEncodingProperties2
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IVideoEncodingProperties2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties3_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties3 __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties3 ABI::Windows::Media::MediaProperties::IVideoEncodingProperties3
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IVideoEncodingProperties3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties4_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties4 __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties4 ABI::Windows::Media::MediaProperties::IVideoEncodingProperties4
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IVideoEncodingProperties4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties5_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties5_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties5 __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties5;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties5 ABI::Windows::Media::MediaProperties::IVideoEncodingProperties5
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IVideoEncodingProperties5;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingPropertiesStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingPropertiesStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingPropertiesStatics __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingPropertiesStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingPropertiesStatics ABI::Windows::Media::MediaProperties::IVideoEncodingPropertiesStatics
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IVideoEncodingPropertiesStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingPropertiesStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingPropertiesStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingPropertiesStatics2 __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingPropertiesStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingPropertiesStatics2 ABI::Windows::Media::MediaProperties::IVideoEncodingPropertiesStatics2
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                interface IVideoEncodingPropertiesStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * IAudioEncodingProperties interface
 */
#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_CMediaProperties_CIAudioEncodingProperties_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties, 0x62bc7a16, 0x005c, 0x4b3b, 0x8a,0x0b, 0x0a,0x09,0x0e,0x96,0x87,0xf3);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                MIDL_INTERFACE("62bc7a16-005c-4b3b-8a0b-0a090e9687f3")
                IAudioEncodingProperties : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE put_Bitrate(
                        UINT32 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Bitrate(
                        UINT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ChannelCount(
                        UINT32 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ChannelCount(
                        UINT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_SampleRate(
                        UINT32 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SampleRate(
                        UINT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_BitsPerSample(
                        UINT32 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_BitsPerSample(
                        UINT32 *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties, 0x62bc7a16, 0x005c, 0x4b3b, 0x8a,0x0b, 0x0a,0x09,0x0e,0x96,0x87,0xf3)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingPropertiesVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAudioEncodingProperties methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Bitrate)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties *This,
        UINT32 value);

    HRESULT (STDMETHODCALLTYPE *get_Bitrate)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *put_ChannelCount)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties *This,
        UINT32 value);

    HRESULT (STDMETHODCALLTYPE *get_ChannelCount)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *put_SampleRate)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties *This,
        UINT32 value);

    HRESULT (STDMETHODCALLTYPE *get_SampleRate)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *put_BitsPerSample)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties *This,
        UINT32 value);

    HRESULT (STDMETHODCALLTYPE *get_BitsPerSample)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties *This,
        UINT32 *value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingPropertiesVtbl;

interface __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties {
    CONST_VTBL __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingPropertiesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAudioEncodingProperties methods ***/
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_put_Bitrate(This,value) (This)->lpVtbl->put_Bitrate(This,value)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_get_Bitrate(This,value) (This)->lpVtbl->get_Bitrate(This,value)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_put_ChannelCount(This,value) (This)->lpVtbl->put_ChannelCount(This,value)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_get_ChannelCount(This,value) (This)->lpVtbl->get_ChannelCount(This,value)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_put_SampleRate(This,value) (This)->lpVtbl->put_SampleRate(This,value)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_get_SampleRate(This,value) (This)->lpVtbl->get_SampleRate(This,value)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_put_BitsPerSample(This,value) (This)->lpVtbl->put_BitsPerSample(This,value)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_get_BitsPerSample(This,value) (This)->lpVtbl->get_BitsPerSample(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_QueryInterface(__x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_AddRef(__x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_Release(__x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_GetIids(__x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_GetTrustLevel(__x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAudioEncodingProperties methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_put_Bitrate(__x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties* This,UINT32 value) {
    return This->lpVtbl->put_Bitrate(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_get_Bitrate(__x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties* This,UINT32 *value) {
    return This->lpVtbl->get_Bitrate(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_put_ChannelCount(__x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties* This,UINT32 value) {
    return This->lpVtbl->put_ChannelCount(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_get_ChannelCount(__x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties* This,UINT32 *value) {
    return This->lpVtbl->get_ChannelCount(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_put_SampleRate(__x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties* This,UINT32 value) {
    return This->lpVtbl->put_SampleRate(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_get_SampleRate(__x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties* This,UINT32 *value) {
    return This->lpVtbl->get_SampleRate(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_put_BitsPerSample(__x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties* This,UINT32 value) {
    return This->lpVtbl->put_BitsPerSample(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_get_BitsPerSample(__x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties* This,UINT32 *value) {
    return This->lpVtbl->get_BitsPerSample(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_MediaProperties
#define IID_IAudioEncodingProperties IID___x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties
#define IAudioEncodingPropertiesVtbl __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingPropertiesVtbl
#define IAudioEncodingProperties __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties
#define IAudioEncodingProperties_QueryInterface __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_QueryInterface
#define IAudioEncodingProperties_AddRef __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_AddRef
#define IAudioEncodingProperties_Release __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_Release
#define IAudioEncodingProperties_GetIids __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_GetIids
#define IAudioEncodingProperties_GetRuntimeClassName __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_GetRuntimeClassName
#define IAudioEncodingProperties_GetTrustLevel __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_GetTrustLevel
#define IAudioEncodingProperties_put_Bitrate __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_put_Bitrate
#define IAudioEncodingProperties_get_Bitrate __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_get_Bitrate
#define IAudioEncodingProperties_put_ChannelCount __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_put_ChannelCount
#define IAudioEncodingProperties_get_ChannelCount __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_get_ChannelCount
#define IAudioEncodingProperties_put_SampleRate __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_put_SampleRate
#define IAudioEncodingProperties_get_SampleRate __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_get_SampleRate
#define IAudioEncodingProperties_put_BitsPerSample __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_put_BitsPerSample
#define IAudioEncodingProperties_get_BitsPerSample __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties_get_BitsPerSample
#endif /* WIDL_using_Windows_Media_MediaProperties */
#endif

#endif

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

/*****************************************************************************
 * IContainerEncodingProperties interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties, 0x59ac2a57, 0xb32a, 0x479e, 0x8a,0x61, 0x4b,0x7f,0x2e,0x9e,0x7e,0xa0);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                MIDL_INTERFACE("59ac2a57-b32a-479e-8a61-4b7f2e9e7ea0")
                IContainerEncodingProperties : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties, 0x59ac2a57, 0xb32a, 0x479e, 0x8a,0x61, 0x4b,0x7f,0x2e,0x9e,0x7e,0xa0)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingPropertiesVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingPropertiesVtbl;

interface __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties {
    CONST_VTBL __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingPropertiesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_QueryInterface(__x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_AddRef(__x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_Release(__x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_GetIids(__x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_GetTrustLevel(__x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_Media_MediaProperties
#define IID_IContainerEncodingProperties IID___x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties
#define IContainerEncodingPropertiesVtbl __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingPropertiesVtbl
#define IContainerEncodingProperties __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties
#define IContainerEncodingProperties_QueryInterface __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_QueryInterface
#define IContainerEncodingProperties_AddRef __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_AddRef
#define IContainerEncodingProperties_Release __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_Release
#define IContainerEncodingProperties_GetIids __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_GetIids
#define IContainerEncodingProperties_GetRuntimeClassName __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_GetRuntimeClassName
#define IContainerEncodingProperties_GetTrustLevel __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties_GetTrustLevel
#endif /* WIDL_using_Windows_Media_MediaProperties */
#endif

#endif

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

/*****************************************************************************
 * IMediaEncodingProfile interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile, 0xe7dbf5a8, 0x1db9, 0x4783, 0x87,0x6b, 0x3d,0xfe,0x12,0xac,0xfd,0xb3);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                MIDL_INTERFACE("e7dbf5a8-1db9-4783-876b-3dfe12acfdb3")
                IMediaEncodingProfile : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE put_Audio(
                        ABI::Windows::Media::MediaProperties::IAudioEncodingProperties *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Audio(
                        ABI::Windows::Media::MediaProperties::IAudioEncodingProperties **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Video(
                        ABI::Windows::Media::MediaProperties::IVideoEncodingProperties *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Video(
                        ABI::Windows::Media::MediaProperties::IVideoEncodingProperties **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Container(
                        ABI::Windows::Media::MediaProperties::IContainerEncodingProperties *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Container(
                        ABI::Windows::Media::MediaProperties::IContainerEncodingProperties **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile, 0xe7dbf5a8, 0x1db9, 0x4783, 0x87,0x6b, 0x3d,0xfe,0x12,0xac,0xfd,0xb3)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfileVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IMediaEncodingProfile methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Audio)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile *This,
        __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties *value);

    HRESULT (STDMETHODCALLTYPE *get_Audio)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile *This,
        __x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties **value);

    HRESULT (STDMETHODCALLTYPE *put_Video)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile *This,
        __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties *value);

    HRESULT (STDMETHODCALLTYPE *get_Video)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile *This,
        __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties **value);

    HRESULT (STDMETHODCALLTYPE *put_Container)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile *This,
        __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties *value);

    HRESULT (STDMETHODCALLTYPE *get_Container)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile *This,
        __x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties **value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfileVtbl;

interface __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile {
    CONST_VTBL __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfileVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMediaEncodingProfile methods ***/
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_put_Audio(This,value) (This)->lpVtbl->put_Audio(This,value)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_get_Audio(This,value) (This)->lpVtbl->get_Audio(This,value)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_put_Video(This,value) (This)->lpVtbl->put_Video(This,value)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_get_Video(This,value) (This)->lpVtbl->get_Video(This,value)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_put_Container(This,value) (This)->lpVtbl->put_Container(This,value)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_get_Container(This,value) (This)->lpVtbl->get_Container(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_QueryInterface(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_AddRef(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_Release(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_GetIids(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_GetTrustLevel(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMediaEncodingProfile methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_put_Audio(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile* This,__x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties *value) {
    return This->lpVtbl->put_Audio(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_get_Audio(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile* This,__x_ABI_CWindows_CMedia_CMediaProperties_CIAudioEncodingProperties **value) {
    return This->lpVtbl->get_Audio(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_put_Video(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile* This,__x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties *value) {
    return This->lpVtbl->put_Video(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_get_Video(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile* This,__x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties **value) {
    return This->lpVtbl->get_Video(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_put_Container(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile* This,__x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties *value) {
    return This->lpVtbl->put_Container(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_get_Container(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile* This,__x_ABI_CWindows_CMedia_CMediaProperties_CIContainerEncodingProperties **value) {
    return This->lpVtbl->get_Container(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_MediaProperties
#define IID_IMediaEncodingProfile IID___x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile
#define IMediaEncodingProfileVtbl __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfileVtbl
#define IMediaEncodingProfile __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile
#define IMediaEncodingProfile_QueryInterface __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_QueryInterface
#define IMediaEncodingProfile_AddRef __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_AddRef
#define IMediaEncodingProfile_Release __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_Release
#define IMediaEncodingProfile_GetIids __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_GetIids
#define IMediaEncodingProfile_GetRuntimeClassName __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_GetRuntimeClassName
#define IMediaEncodingProfile_GetTrustLevel __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_GetTrustLevel
#define IMediaEncodingProfile_put_Audio __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_put_Audio
#define IMediaEncodingProfile_get_Audio __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_get_Audio
#define IMediaEncodingProfile_put_Video __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_put_Video
#define IMediaEncodingProfile_get_Video __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_get_Video
#define IMediaEncodingProfile_put_Container __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_put_Container
#define IMediaEncodingProfile_get_Container __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaEncodingProfile_get_Container
#endif /* WIDL_using_Windows_Media_MediaProperties */
#endif

#endif

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

/*****************************************************************************
 * IMediaRatio interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio, 0xd2d0fee5, 0x8929, 0x401d, 0xac,0x78, 0x7d,0x35,0x7e,0x37,0x81,0x63);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                MIDL_INTERFACE("d2d0fee5-8929-401d-ac78-7d357e378163")
                IMediaRatio : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE put_Numerator(
                        UINT32 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Numerator(
                        UINT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Denominator(
                        UINT32 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Denominator(
                        UINT32 *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio, 0xd2d0fee5, 0x8929, 0x401d, 0xac,0x78, 0x7d,0x35,0x7e,0x37,0x81,0x63)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatioVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IMediaRatio methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Numerator)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio *This,
        UINT32 value);

    HRESULT (STDMETHODCALLTYPE *get_Numerator)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *put_Denominator)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio *This,
        UINT32 value);

    HRESULT (STDMETHODCALLTYPE *get_Denominator)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio *This,
        UINT32 *value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatioVtbl;

interface __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio {
    CONST_VTBL __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatioVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMediaRatio methods ***/
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_put_Numerator(This,value) (This)->lpVtbl->put_Numerator(This,value)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_get_Numerator(This,value) (This)->lpVtbl->get_Numerator(This,value)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_put_Denominator(This,value) (This)->lpVtbl->put_Denominator(This,value)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_get_Denominator(This,value) (This)->lpVtbl->get_Denominator(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_QueryInterface(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_AddRef(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_Release(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_GetIids(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_GetTrustLevel(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMediaRatio methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_put_Numerator(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio* This,UINT32 value) {
    return This->lpVtbl->put_Numerator(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_get_Numerator(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio* This,UINT32 *value) {
    return This->lpVtbl->get_Numerator(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_put_Denominator(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio* This,UINT32 value) {
    return This->lpVtbl->put_Denominator(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_get_Denominator(__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio* This,UINT32 *value) {
    return This->lpVtbl->get_Denominator(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_MediaProperties
#define IID_IMediaRatio IID___x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio
#define IMediaRatioVtbl __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatioVtbl
#define IMediaRatio __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio
#define IMediaRatio_QueryInterface __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_QueryInterface
#define IMediaRatio_AddRef __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_AddRef
#define IMediaRatio_Release __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_Release
#define IMediaRatio_GetIids __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_GetIids
#define IMediaRatio_GetRuntimeClassName __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_GetRuntimeClassName
#define IMediaRatio_GetTrustLevel __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_GetTrustLevel
#define IMediaRatio_put_Numerator __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_put_Numerator
#define IMediaRatio_get_Numerator __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_get_Numerator
#define IMediaRatio_put_Denominator __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_put_Denominator
#define IMediaRatio_get_Denominator __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio_get_Denominator
#endif /* WIDL_using_Windows_Media_MediaProperties */
#endif

#endif

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

/*****************************************************************************
 * IVideoEncodingProperties interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties, 0x76ee6c9a, 0x37c2, 0x4f2a, 0x88,0x0a, 0x12,0x82,0xbb,0xb4,0x37,0x3d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace MediaProperties {
                MIDL_INTERFACE("76ee6c9a-37c2-4f2a-880a-1282bbb4373d")
                IVideoEncodingProperties : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE put_Bitrate(
                        UINT32 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Bitrate(
                        UINT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Width(
                        UINT32 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Width(
                        UINT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Height(
                        UINT32 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Height(
                        UINT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_FrameRate(
                        ABI::Windows::Media::MediaProperties::IMediaRatio **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_PixelAspectRatio(
                        ABI::Windows::Media::MediaProperties::IMediaRatio **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties, 0x76ee6c9a, 0x37c2, 0x4f2a, 0x88,0x0a, 0x12,0x82,0xbb,0xb4,0x37,0x3d)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingPropertiesVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVideoEncodingProperties methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Bitrate)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties *This,
        UINT32 value);

    HRESULT (STDMETHODCALLTYPE *get_Bitrate)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *put_Width)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties *This,
        UINT32 value);

    HRESULT (STDMETHODCALLTYPE *get_Width)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *put_Height)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties *This,
        UINT32 value);

    HRESULT (STDMETHODCALLTYPE *get_Height)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *get_FrameRate)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties *This,
        __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio **value);

    HRESULT (STDMETHODCALLTYPE *get_PixelAspectRatio)(
        __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties *This,
        __x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio **value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingPropertiesVtbl;

interface __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties {
    CONST_VTBL __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingPropertiesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVideoEncodingProperties methods ***/
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_put_Bitrate(This,value) (This)->lpVtbl->put_Bitrate(This,value)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_get_Bitrate(This,value) (This)->lpVtbl->get_Bitrate(This,value)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_put_Width(This,value) (This)->lpVtbl->put_Width(This,value)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_get_Width(This,value) (This)->lpVtbl->get_Width(This,value)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_put_Height(This,value) (This)->lpVtbl->put_Height(This,value)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_get_Height(This,value) (This)->lpVtbl->get_Height(This,value)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_get_FrameRate(This,value) (This)->lpVtbl->get_FrameRate(This,value)
#define __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_get_PixelAspectRatio(This,value) (This)->lpVtbl->get_PixelAspectRatio(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_QueryInterface(__x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_AddRef(__x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_Release(__x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_GetIids(__x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_GetTrustLevel(__x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVideoEncodingProperties methods ***/
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_put_Bitrate(__x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties* This,UINT32 value) {
    return This->lpVtbl->put_Bitrate(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_get_Bitrate(__x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties* This,UINT32 *value) {
    return This->lpVtbl->get_Bitrate(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_put_Width(__x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties* This,UINT32 value) {
    return This->lpVtbl->put_Width(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_get_Width(__x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties* This,UINT32 *value) {
    return This->lpVtbl->get_Width(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_put_Height(__x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties* This,UINT32 value) {
    return This->lpVtbl->put_Height(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_get_Height(__x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties* This,UINT32 *value) {
    return This->lpVtbl->get_Height(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_get_FrameRate(__x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties* This,__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio **value) {
    return This->lpVtbl->get_FrameRate(This,value);
}
static inline HRESULT __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_get_PixelAspectRatio(__x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties* This,__x_ABI_CWindows_CMedia_CMediaProperties_CIMediaRatio **value) {
    return This->lpVtbl->get_PixelAspectRatio(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_MediaProperties
#define IID_IVideoEncodingProperties IID___x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties
#define IVideoEncodingPropertiesVtbl __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingPropertiesVtbl
#define IVideoEncodingProperties __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties
#define IVideoEncodingProperties_QueryInterface __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_QueryInterface
#define IVideoEncodingProperties_AddRef __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_AddRef
#define IVideoEncodingProperties_Release __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_Release
#define IVideoEncodingProperties_GetIids __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_GetIids
#define IVideoEncodingProperties_GetRuntimeClassName __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_GetRuntimeClassName
#define IVideoEncodingProperties_GetTrustLevel __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_GetTrustLevel
#define IVideoEncodingProperties_put_Bitrate __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_put_Bitrate
#define IVideoEncodingProperties_get_Bitrate __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_get_Bitrate
#define IVideoEncodingProperties_put_Width __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_put_Width
#define IVideoEncodingProperties_get_Width __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_get_Width
#define IVideoEncodingProperties_put_Height __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_put_Height
#define IVideoEncodingProperties_get_Height __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_get_Height
#define IVideoEncodingProperties_get_FrameRate __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_get_FrameRate
#define IVideoEncodingProperties_get_PixelAspectRatio __x_ABI_CWindows_CMedia_CMediaProperties_CIVideoEncodingProperties_get_PixelAspectRatio
#endif /* WIDL_using_Windows_Media_MediaProperties */
#endif

#endif

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

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

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

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

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

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

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_media_mediaproperties_h__ */
