Commit d0184a0b authored by François Grisez's avatar François Grisez

Merge branch 'master' into dev_video_toolbox

parents 2eb67440 685beb16
......@@ -21,14 +21,14 @@
############################################################################
cmake_minimum_required(VERSION 3.0)
project(MEDIASTREAMER2 C CXX)
project(mediastreamer2 VERSION 2.12.1 LANGUAGES C CXX)
set(MEDIASTREAMER_MAJOR_VERSION "2")
set(MEDIASTREAMER_MINOR_VERSION "12")
set(MEDIASTREAMER_MICRO_VERSION "1")
set(MEDIASTREAMER_VERSION "${MEDIASTREAMER_MAJOR_VERSION}.${MEDIASTREAMER_MINOR_VERSION}.${MEDIASTREAMER_MICRO_VERSION}")
set(MEDIASTREAMER_SO_VERSION "6")
set(MEDIASTREAMER_MAJOR_VERSION ${PROJECT_VERSION_MAJOR})
set(MEDIASTREAMER_MINOR_VERSION ${PROJECT_VERSION_MINOR})
set(MEDIASTREAMER_MICRO_VERSION ${PROJECT_VERSION_PATCH})
set(MEDIASTREAMER_VERSION ${PROJECT_VERSION})
set(MEDIASTREAMER_SO_VERSION "7") # incremented on January, the 20th 2016. DO NOT INCREMENT BEFORE MEDIASTREAMER 2.13
string(REGEX MATCH "^(arm*|aarch64)" FIXED_POINT_PROCESSOR "${CMAKE_SYSTEM_PROCESSOR}")
if(FIXED_POINT_PROCESSOR)
......@@ -57,7 +57,8 @@ endif()
include(CMakeDependentOption)
option(ENABLE_STATIC "Build static library (default is shared library)." NO)
option(ENABLE_SHARED "Build shared library." YES)
option(ENABLE_STATIC "Build static library." YES)
option(ENABLE_DEBUG_LOGS "Enable the display of traces showing the execution of the library." NO)
option(ENABLE_DOC "Enable documentation generation with Doxygen." YES)
option(ENABLE_FIXED_POINT "Turn on fixed point computations." ${ENABLE_FIXED_POINT_DEFAULT_VALUE})
......@@ -68,7 +69,6 @@ option(ENABLE_RELATIVE_PREFIX "Find resources relatively to the installation dir
option(ENABLE_TOOLS "Turn on or off compilation of tools." YES)
option(ENABLE_UNIT_TESTS "Enable compilation of unit tests." YES)
cmake_dependent_option(ENABLE_DTLS "Build with DTLS support." YES "ENABLE_SRTP" NO)
option(ENABLE_SRTP "Build with the SRTP transport support." YES)
cmake_dependent_option(ENABLE_ZRTP "Build with ZRTP support." YES "ENABLE_SRTP" NO)
......@@ -121,9 +121,15 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
include(CheckIncludeFile)
include(CheckLibraryExists)
include(CMakePushCheckState)
include(GNUInstallDirs)
set(MSVC_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include/MSVC")
if(MSVC)
if(NOT CMAKE_INSTALL_RPATH AND CMAKE_INSTALL_PREFIX)
set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_FULL_LIBDIR})
message(STATUS "Setting install rpath to ${CMAKE_INSTALL_RPATH}")
endif()
if(MSVC AND MSVC_VERSION LESS 1800)
set(MSVC_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include/MSVC")
list(APPEND CMAKE_REQUIRED_INCLUDES "${MSVC_INCLUDE_DIR}")
endif()
......@@ -151,7 +157,8 @@ if(LINPHONE_BUILDER_GROUP_EXTERNAL_SOURCE_PATH_BUILDERS)
else()
find_package(ORTP REQUIRED)
endif()
find_package(PolarSSL)
if(ENABLE_PCAP)
find_package(PCAP QUIET)
endif()
......@@ -176,7 +183,6 @@ if(ENABLE_SRTP)
if(NOT SRTP_FOUND)
message(WARNING "Could not find SRTP library, Mediastreamer2 will be compiled without SRTP support.")
set(ENABLE_SRTP OFF CACHE BOOL "Build with the SRTP transport support." FORCE)
set(ENABLE_DTLS OFF CACHE BOOL "Build mediastreamer2 with DTLS support." FORCE)
endif()
endif()
if(ENABLE_ZRTP)
......@@ -190,12 +196,6 @@ if(ENABLE_ZRTP)
set(ENABLE_ZRTP OFF CACHE BOOL "Build mediastreamer2 with ZRTP support." FORCE)
endif()
endif()
if(ENABLE_DTLS AND ENABLE_SRTP) # DTLS requires SRTP
if(NOT POLARSSL_FOUND OR NOT HAVE_SSL_GET_DTLS_SRTP_PROTECTION_PROFILE)
message(WARNING "Could not find polarssl library with DTLS support, mediastreamer2 will be compiled without DTLS support.")
set(ENABLE_DTLS OFF CACHE BOOL "Build mediastreamer2 with DTLS support." FORCE)
endif()
endif()
if(ENABLE_GSM)
find_package(GSM)
if(NOT GSM_FOUND)
......@@ -308,6 +308,11 @@ if(ENABLE_SOUND AND NOT(WIN32 OR ENABLE_ALSA OR ENABLE_ARTSC OR ENABLE_MACSND OR
message(FATAL_ERROR "Could not find a support sound driver API. Use -DENABLE_SOUND=NO if you don't care about having sound.")
endif()
if(LINPHONE_BUILDER_GROUP_EXTERNAL_SOURCE_PATH_BUILDERS)
include("${EP_bctoolbox_CONFIG_DIR}/BcToolboxConfig.cmake")
else()
find_package(BcToolbox REQUIRED)
endif()
include_directories(
include
......@@ -317,6 +322,7 @@ include_directories(
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_BINARY_DIR}/src
${ORTP_INCLUDE_DIRS}
${BCTOOLBOX_INCLUDE_DIRS}
)
if(BZRTP_FOUND)
......@@ -325,9 +331,6 @@ endif()
if(SRTP_FOUND)
include_directories(${SRTP_INCLUDE_DIRS})
endif()
if(POLARSSL_FOUND)
include_directories(${POLARSSL_INCLUDE_DIRS})
endif()
if(GSM_FOUND)
include_directories(${GSM_INCLUDE_DIRS})
endif()
......@@ -385,7 +388,7 @@ endif()
if(PCAP_FOUND)
include_directories(${PCAP_INCLUDE_DIRS})
endif()
if(MSVC)
if(MSVC_INCLUDE_DIR)
include_directories(${MSVC_INCLUDE_DIR})
endif()
......@@ -409,9 +412,6 @@ endif()
if(BZRTP_FOUND)
set(HAVE_ZRTP 1)
endif()
if(ENABLE_DTLS)
set(HAVE_DTLS 1)
endif()
if(ENABLE_ALSA)
set(__ALSA_ENABLED__ 1)
endif()
......@@ -443,11 +443,16 @@ if(MATROSKA2_FOUND)
set(HAVE_MATROSKA 1)
endif()
if(ENABLE_RELATIVE_PREFIX)
set(PACKAGE_PLUGINS_DIR "./lib/mediastreamer/plugins")
set(PACKAGE_DATA_DIR "./share")
if(CMAKE_SYSTEM_NAME STREQUAL "WindowsPhone" OR CMAKE_SYSTEM_NAME STREQUAL "WindowsStore")
set(PACKAGE_PLUGINS_DIR ".")
set(PACKAGE_DATA_DIR ".")
else()
set(PACKAGE_PLUGINS_DIR "./${CMAKE_INSTALL_LIBDIR}/mediastreamer/plugins")
set(PACKAGE_DATA_DIR "./${CMAKE_INSTALL_DATADIR}")
endif()
else()
set(PACKAGE_PLUGINS_DIR "${CMAKE_INSTALL_PREFIX}/lib/mediastreamer/plugins")
set(PACKAGE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/share")
set(PACKAGE_PLUGINS_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/mediastreamer/plugins")
set(PACKAGE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}")
endif()
set(LINK_FLAGS )
if(APPLE)
......@@ -539,13 +544,13 @@ configure_file(cmake/Mediastreamer2Config.cmake.in
@ONLY
)
set(ConfigPackageLocation lib/cmake/Mediastreamer2)
set(CONFIG_PACKAGE_LOCATION "${CMAKE_INSTALL_DATADIR}/Mediastreamer2/cmake")
install(EXPORT ${EXPORT_TARGETS_NAME}Targets
FILE Mediastreamer2Targets.cmake
DESTINATION ${ConfigPackageLocation}
DESTINATION ${CONFIG_PACKAGE_LOCATION}
)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/Mediastreamer2Config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/Mediastreamer2ConfigVersion.cmake"
DESTINATION ${ConfigPackageLocation}
DESTINATION ${CONFIG_PACKAGE_LOCATION}
)
......@@ -30,6 +30,7 @@ Compilation and installation
- oRTP
- libspeex and libspeexdsp
- vim
- bctoolbox
* Optional dependencies (for video to be enabled, see --enable-video):
- libavcodec
- libswscale
......
......@@ -37,6 +37,7 @@ MEDIASTREAMER2_INCLUDES := \
$(LOCAL_PATH)/../include \
$(LOCAL_PATH)/../../oRTP \
$(LOCAL_PATH)/../../oRTP/include \
$(LOCAL_PATH)/../../../bctoolbox/include \
$(LOCAL_PATH)/../../../externals/speex/include \
$(LOCAL_PATH)/../../../externals/build/speex \
$(LOCAL_PATH)/../../../externals/gsm/inc \
......@@ -119,7 +120,7 @@ LOCAL_SRC_FILES = \
otherfilters/rfc4103_sink.c \
voip/rfc4103_textstream.c
LOCAL_STATIC_LIBRARIES :=
LOCAL_STATIC_LIBRARIES := libbctoolbox
LOCAL_CFLAGS += -D_XOPEN_SOURCE=600
......@@ -198,10 +199,10 @@ LOCAL_CFLAGS += \
-DNDEBUG
LOCAL_C_INCLUDES += \
$(LOCAL_PATH)/../../../externals/libmatroska \
$(LOCAL_PATH)/../../../externals/libmatroska/corec \
$(LOCAL_PATH)/../../../externals/libmatroska/libebml2 \
$(LOCAL_PATH)/../../../externals/libmatroska/libmatroska2
$(LOCAL_PATH)/../../../externals/libmatroska-c \
$(LOCAL_PATH)/../../../externals/libmatroska-c/corec \
$(LOCAL_PATH)/../../../externals/libmatroska-c/libebml2 \
$(LOCAL_PATH)/../../../externals/libmatroska-c/libmatroska2
LOCAL_SRC_FILES += \
utils/mkv_reader.c \
......
......@@ -11,6 +11,7 @@
<model:UnitTestCaseStateToSymbolConverter x:Key="UnitTestCaseStateToSymbol"/>
<model:UnitTestCaseStateToSymbolColorConverter x:Key="UnitTestCaseStateToSymbolColor"/>
<model:OutputTraceLevelToColorConverter x:Key="OutputTraceLevelToColor"/>
<model:MultiplyConverter x:Key="Multiply"/>
</ResourceDictionary>
</Application.Resources>
</Application>
......@@ -248,4 +248,29 @@ namespace ms2_tester.DataModel
throw new NotImplementedException();
}
}
public sealed class MultiplyConverter : IValueConverter
{
object IValueConverter.Convert(object value, Type targetType, object parameter, string language)
{
if (!value.GetType().Equals(typeof(Double)))
{
throw new ArgumentException("Only Double is supported");
}
if (targetType.Equals(typeof(Double)))
{
Double result = (Double)value * (Double)Convert.ToDouble(parameter);
return result;
}
else
{
throw new ArgumentException(string.Format("Unsupported format {0}", targetType.FullName));
}
}
object IValueConverter.ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
}
using MS2TesterTasks;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.ApplicationModel.AppService;
using Windows.Foundation.Collections;
namespace ms2_tester.Helpers
{
class AppServiceHelper
{
~AppServiceHelper()
{
if (_appConnection != null)
{
_appConnection.Dispose();
_appConnection = null;
}
}
public async Task<ValueSet> SendMessageAsync(ValueSet message)
{
ValueSet returnValue = null;
AppServiceConnection appConnection = await GetAppConnectionAsync();
if (appConnection != null)
{
AppServiceResponse response = await appConnection.SendMessageAsync(message);
if (response.Status == AppServiceResponseStatus.Success)
{
if (response.Message.Keys.Contains(BackgroundOperation.Result))
{
returnValue = response.Message;
}
}
}
return returnValue;
}
public async void SendMessage(ValueSet message)
{
AppServiceConnection appConnection = await GetAppConnectionAsync();
if (appConnection != null)
{
await appConnection.SendMessageAsync(message);
}
}
private async Task<AppServiceConnection> GetAppConnectionAsync()
{
AppServiceConnection appConnection = _appConnection;
if (appConnection == null)
{
appConnection = new AppServiceConnection();
appConnection.ServiceClosed += AppConnection_ServiceClosed;
appConnection.AppServiceName = BackgroundOperation.AppServiceName;
appConnection.PackageFamilyName = Windows.ApplicationModel.Package.Current.Id.FamilyName;
AppServiceConnectionStatus status = await appConnection.OpenAsync();
if (status == AppServiceConnectionStatus.Success)
{
_appConnection = appConnection;
}
}
return appConnection;
}
private void AppConnection_ServiceClosed(AppServiceConnection sender, AppServiceClosedEventArgs args)
{
_appConnection = null;
}
private AppServiceConnection _appConnection = null;
}
}
using MS2TesterTasks;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.Foundation.Collections;
namespace ms2_tester.Helpers
{
class MS2TesterHelper
{
public static bool RunInBackground { get; set; }
public static async Task<OperationResult> InitVideo()
{
if (RunInBackground)
{
AppServiceHelper appServiceHelper = new AppServiceHelper();
ValueSet message = new ValueSet();
message[BackgroundOperation.NewBackgroundRequest] = (int)BackgroundRequest.InitVideo;
ValueSet response = await appServiceHelper.SendMessageAsync(message);
if (response != null)
{
return ((OperationResult)(response[BackgroundOperation.Result]));
}
return OperationResult.Failed;
}
else
{
ms2_tester_runtime_component.MS2Tester.Instance.initVideo();
return OperationResult.Succeeded;
}
}
public static async Task<OperationResult> UninitVideo()
{
if (RunInBackground)
{
AppServiceHelper appServiceHelper = new AppServiceHelper();
ValueSet message = new ValueSet();
message[BackgroundOperation.NewBackgroundRequest] = (int)BackgroundRequest.UninitVideo;
ValueSet response = await appServiceHelper.SendMessageAsync(message);
if (response != null)
{
return ((OperationResult)(response[BackgroundOperation.Result]));
}
return OperationResult.Failed;
}
else
{
ms2_tester_runtime_component.MS2Tester.Instance.uninitVideo();
return OperationResult.Succeeded;
}
}
public static async Task<List<String>> GetVideoDevices()
{
if (RunInBackground)
{
AppServiceHelper appServiceHelper = new AppServiceHelper();
ValueSet message = new ValueSet();
message[BackgroundOperation.NewBackgroundRequest] = (int)BackgroundRequest.GetVideoDevices;
ValueSet response = await appServiceHelper.SendMessageAsync(message);
if ((response != null) && ((OperationResult)(response[BackgroundOperation.Result]) == OperationResult.Succeeded))
{
return ((IEnumerable<String>)response[BackgroundOperation.ReturnValue]).ToList<String>();
}
return null;
}
else
{
return ms2_tester_runtime_component.MS2Tester.Instance.VideoDevices.ToList();
}
}
public static async Task<OperationResult> StartVideoStream(String videoSwapChainPanelName, String previewSwapChainPanelName, String camera, String codec, String videoSize, UInt32 frameRate, UInt32 bitRate)
{
if (RunInBackground)
{
AppServiceHelper appServiceHelper = new AppServiceHelper();
ValueSet message = new ValueSet();
message[StartVideoStreamArguments.VideoSwapChainPanelName.ToString()] = videoSwapChainPanelName;
message[StartVideoStreamArguments.PreviewSwapChainPanelName.ToString()] = previewSwapChainPanelName;
message[StartVideoStreamArguments.Camera.ToString()] = camera;
message[StartVideoStreamArguments.Codec.ToString()] = codec;
message[StartVideoStreamArguments.VideoSize.ToString()] = videoSize;
message[StartVideoStreamArguments.FrameRate.ToString()] = frameRate;
message[StartVideoStreamArguments.BitRate.ToString()] = bitRate;
message[BackgroundOperation.NewBackgroundRequest] = (int)BackgroundRequest.StartVideoStream;
ValueSet response = await appServiceHelper.SendMessageAsync(message);
if (response != null)
{
return ((OperationResult)(response[BackgroundOperation.Result]));
}
return OperationResult.Failed;
}
else
{
ms2_tester_runtime_component.MS2Tester.Instance.startVideoStream(videoSwapChainPanelName, previewSwapChainPanelName, camera, codec, videoSize, frameRate, bitRate);
return OperationResult.Succeeded;
}
}
public static async Task<OperationResult> StopVideoStream()
{
if (RunInBackground)
{
AppServiceHelper appServiceHelper = new AppServiceHelper();
ValueSet message = new ValueSet();
message[BackgroundOperation.NewBackgroundRequest] = (int)BackgroundRequest.StopVideoStream;
ValueSet response = await appServiceHelper.SendMessageAsync(message);
if (response != null)
{
return ((OperationResult)(response[BackgroundOperation.Result]));
}
return OperationResult.Failed;
}
else
{
ms2_tester_runtime_component.MS2Tester.Instance.stopVideoStream();
return OperationResult.Succeeded;
}
}
public static async Task<OperationResult> ChangeCamera(String camera)
{
if (RunInBackground)
{
AppServiceHelper appServiceHelper = new AppServiceHelper();
ValueSet message = new ValueSet();
message[ChangeCameraArguments.Camera.ToString()] = camera;
message[BackgroundOperation.NewBackgroundRequest] = (int)BackgroundRequest.ChangeCamera;
ValueSet response = await appServiceHelper.SendMessageAsync(message);
if (response != null)
{
return ((OperationResult)(response[BackgroundOperation.Result]));
}
return OperationResult.Failed;
}
else
{
ms2_tester_runtime_component.MS2Tester.Instance.changeCamera(camera);
return OperationResult.Succeeded;
}
}
public static async Task<int> GetOrientation()
{
if (RunInBackground)
{
AppServiceHelper appServiceHelper = new AppServiceHelper();
ValueSet message = new ValueSet();
message[BackgroundOperation.NewBackgroundRequest] = (int)BackgroundRequest.GetOrientation;
ValueSet response = await appServiceHelper.SendMessageAsync(message);
if ((response != null) && ((OperationResult)(response[BackgroundOperation.Result]) == OperationResult.Succeeded))
{
return Convert.ToInt32(response[BackgroundOperation.ReturnValue]);
}
return 0;
}
else
{
return ms2_tester_runtime_component.MS2Tester.Instance.getOrientation();
}
}
public static async Task<OperationResult> SetOrientation(int degrees)
{
if (RunInBackground)
{
AppServiceHelper appServiceHelper = new AppServiceHelper();
ValueSet message = new ValueSet();
message[SetOrientationArguments.Degrees.ToString()] = degrees;
message[BackgroundOperation.NewBackgroundRequest] = (int)BackgroundRequest.SetOrientation;
ValueSet response = await appServiceHelper.SendMessageAsync(message);
if (response != null)
{
return ((OperationResult)(response[BackgroundOperation.Result]));
}
return OperationResult.Failed;
}
else
{
ms2_tester_runtime_component.MS2Tester.Instance.setOrientation(degrees);
return OperationResult.Succeeded;
}
}
}
}
//*********************************************************
//
// Copyright (c) Microsoft. All rights reserved.
// This code is licensed under the MIT License (MIT).
// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
//
//*********************************************************
#include <wrl\module.h>
#include <roapi.h>
#include <Windows.ApplicationModel.Core.h>
using namespace ABI::Windows::ApplicationModel::Core;
using namespace Microsoft::WRL;
class ExeServerGetActivationFactory : public RuntimeClass<
ABI::Windows::Foundation::IGetActivationFactory,
FtmBase>
{
public:
IFACEMETHODIMP GetActivationFactory(_In_ HSTRING activatableClassId, _COM_Outptr_ IInspectable **factory)
{
*factory = nullptr;
ComPtr<IActivationFactory> activationFactory;
auto &module = Microsoft::WRL::Module<Microsoft::WRL::InProc>::GetModule();
HRESULT hr = module.GetActivationFactory(activatableClassId, &activationFactory);
if (SUCCEEDED(hr))
{
*factory = activationFactory.Detach();
}
return hr;
}
};
int CALLBACK WinMain(_In_ HINSTANCE, _In_ HINSTANCE, _In_ LPSTR, _In_ int)
{
HRESULT hr = Windows::Foundation::Initialize(RO_INIT_MULTITHREADED);
if (SUCCEEDED(hr))
{
// Scoping for smart pointers
{
ComPtr<ICoreApplication> spApplicationFactory;
hr = Windows::Foundation::GetActivationFactory(Wrappers::HStringReference(RuntimeClass_Windows_ApplicationModel_Core_CoreApplication).Get(), &spApplicationFactory);
if (SUCCEEDED(hr))
{
ComPtr<ABI::Windows::Foundation::IGetActivationFactory> spGetActivationFactory = Make<ExeServerGetActivationFactory>();
spApplicationFactory->RunWithActivationFactories(spGetActivationFactory.Get());
}
}
Windows::Foundation::Uninitialize();
}
}
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM">
<Configuration>Debug</Configuration>
<Platform>ARM</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM">
<Configuration>Release</Configuration>
<Platform>ARM</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
<ClCompile Include="MS2TesterHost.cpp" />
</ItemGroup>
<ItemGroup>
<AppxManifest Include="..\Package.appxmanifest">
<SubType>Designer</SubType>
</AppxManifest>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\..\..\mswinrtvid\windows10\libmswinrtvid\libmswinrtvid.vcxproj">
<Project>{2d0e44c4-e51d-4911-b876-345d1e5e5209}</Project>
</ProjectReference>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{8a1a89b3-f2db-4428-a571-f0dff2e1eec1}</ProjectGuid>
<Keyword>WindowsRuntimeComponent</Keyword>
<ProjectName>MS2TesterHost</ProjectName>
<RootNamespace>MS2TesterHost</RootNamespace>
<DefaultLanguage>en-US</DefaultLanguage>
<MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>
<AppContainerApplication>true</AppContainerApplication>
<ApplicationType>Windows Store</ApplicationType>
<WindowsTargetPlatformVersion>10.0.10240.0</WindowsTargetPlatformVersion>
<WindowsTargetPlatformMinVersion>10.0.10240.0</WindowsTargetPlatformMinVersion>
<ApplicationTypeRevision>10.0</ApplicationTypeRevision>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>