Commit 1bf388e3 authored by Martin Finkel's avatar Martin Finkel

Implemented UWP platform

parent cc6cfcc8
......@@ -23,4 +23,7 @@
<PropertyGroup Condition="$(TargetFramework.StartsWith('MonoAndroid'))">
<DefineConstants>$(DefineConstants);MONO;ANDROID</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="$(TargetFramework.StartsWith('uap'))">
<DefineConstants>$(DefineConstants);UWP;NET</DefineConstants>
</PropertyGroup>
</Project>
\ No newline at end of file
This diff is collapsed.
......@@ -19,6 +19,7 @@
</Description>
<TargetFrameworks>netstandard2.0;netstandard1.1;net40;net471</TargetFrameworks>
<TargetFrameworks Condition="!$([MSBuild]::IsOsPlatform('Linux'))">$(TargetFrameworks);MonoAndroid81;Xamarin.iOS10;Xamarin.Mac20;Xamarin.TVOS10</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOsPlatform('Windows'))">$(TargetFrameworks);uap10.0</TargetFrameworks>
<TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);IncludeAWindow</TargetsForTfmSpecificBuildOutput>
<RootNamespace>LibVLCSharp</RootNamespace>
<NeutralLanguage>en</NeutralLanguage>
......@@ -62,9 +63,14 @@
<Compile Include="Platforms\tvOS\**\*.cs" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net40' ">
<PackageReference Include="System.ValueTuple" Version="4.5.0"/>
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
<PackageReference Include="Microsoft.Bcl.Async" Version="1.0.168" />
</ItemGroup>
<ItemGroup Condition="$(TargetFramework.StartsWith('uap'))">
<Compile Include="Platforms\UWP\**\*.cs" />
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
<PackageReference Include="SharpDX.Direct3D11" Version="4.2.0" />
</ItemGroup>
<Target Name="IncludeAWindow" Condition="$(TargetFramework.StartsWith('MonoAndroid'))">
<ItemGroup>
<BuildOutputInPackage Include="$(OutputPath)LibVLCSharp.Android.AWindow.dll" />
......
namespace LibVLCSharp.Platforms.UWP
{
using LibVLCSharp.Shared;
using SharpDX;
using SharpDX.Direct3D11;
using SharpDX.DXGI;
using SharpDX.Mathematics.Interop;
using System;
using System.Runtime.InteropServices;
using Windows.UI.Xaml.Controls;
using Device3 = SharpDX.DXGI.Device3;
/// <summary>
/// The VideoView implementation for UWP applications
/// </summary>
public class VideoView : UserControl, IVideoView
{
SwapChainPanel _panel;
SharpDX.Direct3D11.Device _d3d11Device;
SharpDX.DXGI.Device1 _device;
Device3 _device3;
SwapChain2 _swapchain2;
SwapChain1 _swapChain;
bool _loaded;
/// <summary>
/// The constructor
/// </summary>
public VideoView()
{
this._panel = new SwapChainPanel();
this.Content = this._panel;
this.Loaded += (s, e) => this.OnLoad();
this.Unloaded += (s, e) => this.OnUnload();
_panel.SizeChanged += (s, eventArgs) =>
{
if (_loaded)
{
UpdateSize();
}
};
_panel.CompositionScaleChanged += (s, eventArgs) =>
{
if (_loaded)
{
UpdateScale();
}
};
}
/// <summary>
/// Gets the swapchain parameters to pass to the <see cref="LibVLC"/> constructor.
///
/// If you don't pass them to the <see cref="LibVLC"/> constructor, the video won't
/// be displayed in your application.
/// </summary>
/// <returns>The list of arguments to be given to the <see cref="LibVLC"/> constructor.</returns>
public string[] GetSwapChainOptions()
{
if (!_loaded)
{
throw new InvalidOperationException("You must wait for the VideoView to be loaded before calling GetSwapChainOptions()");
}
return new string[]
{
$"--winrt-d3dcontext=0x{_d3d11Device.ImmediateContext.NativePointer.ToString("x")}",
$"--winrt-swapchain=0x{_swapChain.NativePointer.ToString("x")}"
};
}
void OnLoad()
{
SharpDX.DXGI.Factory2 dxgiFactory;
DeviceCreationFlags deviceCreationFlags = DeviceCreationFlags.BgraSupport | DeviceCreationFlags.VideoSupport;
#if DEBUG
deviceCreationFlags |= DeviceCreationFlags.Debug;
try
{
dxgiFactory = new SharpDX.DXGI.Factory2(true);
}
catch (SharpDXException e)
{
dxgiFactory = new SharpDX.DXGI.Factory2(false);
}
#else
dxgiFactory = new SharpDX.DXGI.Factory2(false);
#endif
_d3d11Device = null;
foreach (var adapter in dxgiFactory.Adapters)
{
try
{
_d3d11Device = new SharpDX.Direct3D11.Device(adapter, deviceCreationFlags);
break;
}
catch (SharpDXException e)
{
}
}
if (_d3d11Device is null)
{
throw new Exception("Could not D3D11CreateDevice");
}
_device = _d3d11Device.QueryInterface<SharpDX.DXGI.Device1>();
//Create the swapchain
var swapChainDescription = new SharpDX.DXGI.SwapChainDescription1
{
Width = (int)(this._panel.ActualWidth * this._panel.CompositionScaleX),
Height = (int)(this._panel.ActualHeight * this._panel.CompositionScaleY),
Format = SharpDX.DXGI.Format.B8G8R8A8_UNorm,
Stereo = false,
SampleDescription =
{
Count = 1,
Quality = 0
},
Usage = Usage.RenderTargetOutput,
BufferCount = 2,
SwapEffect = SwapEffect.FlipSequential,
Flags = SwapChainFlags.None,
AlphaMode = AlphaMode.Unspecified
};
_swapChain = new SharpDX.DXGI.SwapChain1(dxgiFactory, _d3d11Device, ref swapChainDescription);
_device.MaximumFrameLatency = 1;
//TODO: perform the next 2 calls on the UI thread
var panelNative = ComObject.As<ISwapChainPanelNative>(this._panel);
panelNative.SwapChain = _swapChain;
// This is necessary so we can call Trim() on suspend
this._device3 = _device.QueryInterface<SharpDX.DXGI.Device3>();
if (_device3 == null)
throw new Exception();
this._swapchain2 = _swapChain.QueryInterface<SharpDX.DXGI.SwapChain2>();
if (_swapchain2 == null)
throw new Exception();
UpdateScale();
UpdateSize();
this._loaded = true;
}
void OnUnload()
{
this._swapchain2?.Dispose();
this._swapchain2 = null;
this._device3?.Dispose();
this._device3 = null;
this._swapChain?.Dispose();
this._swapChain = null;
this._device?.Dispose();
this._device = null;
this._d3d11Device?.Dispose();
this._d3d11Device = null;
}
readonly Guid SWAPCHAIN_WIDTH = new Guid(0xf1b59347, 0x1643, 0x411a, 0xad, 0x6b, 0xc7, 0x80, 0x17, 0x7a, 0x6, 0xb6);
readonly Guid SWAPCHAIN_HEIGHT = new Guid(0x6ea976a0, 0x9d60, 0x4bb7, 0xa5, 0xa9, 0x7d, 0xd1, 0x18, 0x7f, 0xc9, 0xbd);
void UpdateSize()
{
IntPtr width = Marshal.AllocHGlobal(sizeof(int));
IntPtr height = Marshal.AllocHGlobal(sizeof(int));
var w = (int)(this._panel.ActualWidth * this._panel.CompositionScaleX);
var h = (int)(this._panel.ActualHeight * this._panel.CompositionScaleY);
Marshal.WriteInt32(width, w);
Marshal.WriteInt32(height, h);
_swapChain.SetPrivateData(SWAPCHAIN_WIDTH, sizeof(int), width);
_swapChain.SetPrivateData(SWAPCHAIN_HEIGHT, sizeof(int), height);
Marshal.FreeHGlobal(width);
Marshal.FreeHGlobal(height);
}
void UpdateScale()
{
_swapchain2.MatrixTransform = new RawMatrix3x2 { M11 = 1.0f / this._panel.CompositionScaleX, M22 = 1.0f / this._panel.CompositionScaleY };
}
void Trim()
{
_device3?.Trim();
}
void Attach()
{
}
void Detach()
{
}
MediaPlayer _mediaPlayer;
/// <summary>
/// The MediaPlayer object attached to this VideoView. Use this to manage playback and more
/// </summary>
public MediaPlayer MediaPlayer
{
get => _mediaPlayer;
set
{
if (_mediaPlayer != value)
{
Detach();
_mediaPlayer = value;
if (_mediaPlayer != null)
{
Attach();
}
}
}
}
}
}
......@@ -15,10 +15,10 @@ namespace LibVLCSharp.Shared
{
struct Native
{
#if NET || NETSTANDARD
[DllImport(Constants.Kernel32, SetLastError = true)]
internal static extern IntPtr LoadPackagedLibrary(string dllToLoad);
#if UWP
[DllImport(Constants.Kernel32, CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern IntPtr LoadPackagedLibrary(string dllToLoad, uint reserved = 0);
#elif NET || NETSTANDARD
[DllImport(Constants.Kernel32, SetLastError = true)]
internal static extern IntPtr LoadLibrary(string dllToLoad);
......@@ -56,6 +56,8 @@ namespace LibVLCSharp.Shared
{
#if ANDROID
InitializeAndroid();
#elif UWP
InitializeUWP();
#elif NET || NETSTANDARD
InitializeDesktop(libvlcDirectoryPath);
#endif
......@@ -69,6 +71,16 @@ namespace LibVLCSharp.Shared
throw new VLCException("failed to initialize libvlc with JniOnLoad " +
$"{nameof(JniRuntime.CurrentRuntime.InvocationPointer)}: {JniRuntime.CurrentRuntime.InvocationPointer}");
}
#elif UWP
static void InitializeUWP()
{
_libvlcHandle = Native.LoadPackagedLibrary(Constants.LibraryName);
if (_libvlcHandle == IntPtr.Zero)
{
throw new VLCException($"Failed to load {Constants.LibraryName}{Constants.WindowsLibraryExtension}, error {Marshal.GetLastWin32Error()}. Please make sure that this library, {Constants.CoreLibraryName}{Constants.WindowsLibraryExtension} and the plugins are copied to the `AppX` folder. For that, you can reference the `VideoLAN.LibVLC.WindowsRT` NuGet package.");
}
}
#elif NET || NETSTANDARD
static void InitializeDesktop(string libvlcDirectoryPath = null)
{
......@@ -144,7 +156,7 @@ namespace LibVLCSharp.Shared
else
{
arch = PlatformHelper.IsX64BitProcess ? ArchitectureNames.Win64 : ArchitectureNames.Win86;
}
}
var libvlcDirPath1 = Path.Combine(Path.GetDirectoryName(typeof(LibVLC).Assembly.Location),
Constants.LibrariesRepositoryFolderName, arch);
......@@ -158,7 +170,7 @@ namespace LibVLCSharp.Shared
paths.Add((libvlccorePath1, libvlcPath1));
var assemblyLocation = Assembly.GetEntryAssembly()?.Location ?? Assembly.GetExecutingAssembly()?.Location;
var libvlcDirPath2 = Path.Combine(Path.GetDirectoryName(assemblyLocation),
Constants.LibrariesRepositoryFolderName, arch);
......@@ -174,11 +186,9 @@ namespace LibVLCSharp.Shared
var libvlcPath3 = LibVLCPath(Path.GetDirectoryName(typeof(LibVLC).Assembly.Location));
paths.Add((string.Empty, libvlcPath3));
return paths;
}
#endif
static string LibVLCCorePath(string dir) => Path.Combine(dir, $"{Constants.CoreLibraryName}{LibraryExtension}");
static string LibVLCPath(string dir) => Path.Combine(dir, $"{Constants.LibraryName}{LibraryExtension}");
......@@ -259,7 +269,8 @@ namespace LibVLCSharp.Shared
internal const string Win86 = "win-x86";
internal const string Winrt64 = "winrt-x64";
internal const string Winrt86 = "winrt-x86";
internal const string WinrtArm = "winrt-arm";
internal const string Lin64 = "linux-x64";
internal const string LinArm = "linux-arm";
......
......@@ -381,15 +381,15 @@ namespace LibVLCSharp.Shared.Helpers
return Native._wfopen_s(out fileHandle, filename) == 0;
}
#else
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
if (PlatformHelper.IsWindows)
{
if(Native._wfopen_s(out fileHandle, filename) != 0) return false;
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
else if (PlatformHelper.IsLinux)
{
fileHandle = Native.fopenLinux(filename);
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
else if (PlatformHelper.IsMac)
{
fileHandle = Native.fopenMac(filename);
}
......@@ -415,11 +415,11 @@ namespace LibVLCSharp.Shared.Helpers
return Native.fcloseWindows(fileHandle) == 0;
}
#else
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
if (PlatformHelper.IsMac)
{
return Native.fcloseMac(fileHandle) == 0;
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
else if (PlatformHelper.IsLinux)
{
return Native.fcloseLinux(fileHandle) == 0;
}
......
......@@ -9,6 +9,8 @@ namespace LibVLCSharp.Shared
{
#if NET40
get => Environment.OSVersion.Platform == PlatformID.Win32NT;
#elif UWP
get => true;
#else
get => RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
#endif
......@@ -18,6 +20,8 @@ namespace LibVLCSharp.Shared
{
#if NET40
get => Environment.OSVersion.Platform == PlatformID.Unix;
#elif UWP
get => false;
#else
get => RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
#endif
......@@ -25,7 +29,7 @@ namespace LibVLCSharp.Shared
public static bool IsMac
{
#if NET40
#if NET40 || UWP
get => false; // no easy way to detect Mac platform host at runtime under net471
#else
get => RuntimeInformation.IsOSPlatform(OSPlatform.OSX);
......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
......@@ -210,10 +211,24 @@ namespace LibVLCSharp.Shared
/// <param name="options">list of arguments (should be NULL)</param>
/// <returns>the libvlc instance or NULL in case of error</returns>
public LibVLC(params string[] options)
: base(() => MarshalUtils.CreateWithOptions(options, Native.LibVLCNew), Native.LibVLCRelease)
: base(() => MarshalUtils.CreateWithOptions(PatchOptions(options), Native.LibVLCNew), Native.LibVLCRelease)
{
}
/// <summary>
/// Make dirty hacks to include necessary defaults on some platforms.
/// </summary>
/// <param name="options">The options given by the user</param>
/// <returns>The patched options</returns>
static string[] PatchOptions(string[] options)
{
#if UWP
return options.Concat(new[] {"--aout=winstore"}).ToArray();
#else
return options;
#endif
}
protected override void Dispose(bool disposing)
{
if (IsDisposed || NativeReference == IntPtr.Zero)
......
<Application
x:Class="LibVLCSharp.UWP.Sample.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:LibVLCSharp.UWP.Sample">
</Application>
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using LibVLCSharp.Shared;
namespace LibVLCSharp.UWP.Sample
{
/// <summary>
/// Provides application-specific behavior to supplement the default Application class.
/// </summary>
sealed partial class App : Application
{
/// <summary>
/// Initializes the singleton application object. This is the first line of authored code
/// executed, and as such is the logical equivalent of main() or WinMain().
/// </summary>
public App()
{
Core.Initialize(); // LibVLCSharp initialization
this.InitializeComponent();
this.Suspending += OnSuspending;
}
/// <summary>
/// Invoked when the application is launched normally by the end user. Other entry points
/// will be used such as when the application is launched to open a specific file.
/// </summary>
/// <param name="e">Details about the launch request and process.</param>
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
Frame rootFrame = Window.Current.Content as Frame;
// Do not repeat app initialization when the Window already has content,
// just ensure that the window is active
if (rootFrame == null)
{
// Create a Frame to act as the navigation context and navigate to the first page
rootFrame = new Frame();
rootFrame.NavigationFailed += OnNavigationFailed;
if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
//TODO: Load state from previously suspended application
}
// Place the frame in the current Window
Window.Current.Content = rootFrame;
}
if (e.PrelaunchActivated == false)
{
if (rootFrame.Content == null)
{
// When the navigation stack isn't restored navigate to the first page,
// configuring the new page by passing required information as a navigation
// parameter
rootFrame.Navigate(typeof(MainPage), e.Arguments);
}
// Ensure the current window is active
Window.Current.Activate();
}
}
/// <summary>
/// Invoked when Navigation to a certain page fails
/// </summary>
/// <param name="sender">The Frame which failed navigation</param>
/// <param name="e">Details about the navigation failure</param>
void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
{
throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
}
/// <summary>
/// Invoked when application execution is being suspended. Application state is saved
/// without knowing whether the application will be terminated or resumed with the contents
/// of memory still intact.
/// </summary>
/// <param name="sender">The source of the suspend request.</param>
/// <param name="e">Details about the suspend request.</param>
private void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
//TODO: Save application state and stop any background activity
deferral.Complete();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProjectGuid>{B0796D95-FA72-4154-9668-1F939BF03816}</ProjectGuid>
<OutputType>AppContainerExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>LibVLCSharp.UWP.Sample</RootNamespace>
<AssemblyName>LibVLCSharp.UWP.Sample</AssemblyName>
<DefaultLanguage>en-US</DefaultLanguage>
<TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>
<TargetPlatformVersion Condition=" '$(TargetPlatformVersion)' == '' ">10.0.17763.0</TargetPlatformVersion>
<TargetPlatformMinVersion>10.0.15063.0</TargetPlatformMinVersion>
<MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WindowsXamlEnableOverview>true</WindowsXamlEnableOverview>
<PackageCertificateKeyFile>LibVLCSharp.UWP.Sample_TemporaryKey.pfx</PackageCertificateKeyFile>
<PackageCertificateThumbprint>2548F43BC6F3B7F19FA3CAA52025A97793AF02B0</PackageCertificateThumbprint>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\ARM\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>ARM</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM'">
<OutputPath>bin\ARM\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>ARM</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\ARM64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>ARM64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM64'">
<OutputPath>bin\ARM64\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>ARM64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup>
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
</PropertyGroup>
<ItemGroup>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
</Compile>
<Compile Include="MainPage.xaml.cs">
<DependentUpon>MainPage.xaml</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<AppxManifest Include="Package.appxmanifest">
<SubType>Designer</SubType>
</AppxManifest>
<None Include="LibVLCSharp.UWP.Sample_TemporaryKey.pfx" />
</ItemGroup>
<ItemGroup>
<Content Include="Properties\Default.rd.xml" />
<Content Include="Assets\LockScreenLogo.scale-200.png" />
<Content Include="Assets\SplashScreen.scale-200.png" />
<Content Include="Assets\Square150x150Logo.scale-200.png" />
<Content Include="Assets\Square44x44Logo.scale-200.png" />
<Content Include="Assets\Square44x44Logo.targetsize-24_altform-unplated.png" />
<Content Include="Assets\StoreLogo.png" />
<Content Include="Assets\Wide310x150Logo.scale-200.png" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>