diff --git a/HoloLensForCV.sln b/HoloLensForCV.sln
old mode 100644
new mode 100755
index d779232..9a36723
--- a/HoloLensForCV.sln
+++ b/HoloLensForCV.sln
@@ -47,100 +47,311 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ArUcoMarkerTracker", "Samples\ArUcoMarkerTracker\ArUcoMarkerTracker.vcxproj", "{8D84A8AE-BD70-4F78-B85A-230A033FB7EC}"
+EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SensorStreamViewer", "Samples\SensorStreamViewer\SensorStreamViewer.vcxproj", "{E71542FD-E5F3-55BC-8EBB-4FFC708277CD}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Tasks", "Tools\Tasks\Tasks.vcxproj", "{B4DD17EC-EEF8-41FC-8BDC-3C8652DB68E1}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|ARM = Debug|ARM
+ Debug|ARM64 = Debug|ARM64
+ Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
+ Release|ARM = Release|ARM
+ Release|ARM64 = Release|ARM64
+ Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {AD347424-7340-47CE-A979-2C7F2DF0EB38}.Debug|ARM.ActiveCfg = Debug|ARM
+ {AD347424-7340-47CE-A979-2C7F2DF0EB38}.Debug|ARM.Build.0 = Debug|ARM
+ {AD347424-7340-47CE-A979-2C7F2DF0EB38}.Debug|ARM64.ActiveCfg = Debug|Win32
+ {AD347424-7340-47CE-A979-2C7F2DF0EB38}.Debug|x64.ActiveCfg = Debug|x64
+ {AD347424-7340-47CE-A979-2C7F2DF0EB38}.Debug|x64.Build.0 = Debug|x64
{AD347424-7340-47CE-A979-2C7F2DF0EB38}.Debug|x86.ActiveCfg = Debug|Win32
{AD347424-7340-47CE-A979-2C7F2DF0EB38}.Debug|x86.Build.0 = Debug|Win32
+ {AD347424-7340-47CE-A979-2C7F2DF0EB38}.Release|ARM.ActiveCfg = Release|ARM
+ {AD347424-7340-47CE-A979-2C7F2DF0EB38}.Release|ARM.Build.0 = Release|ARM
+ {AD347424-7340-47CE-A979-2C7F2DF0EB38}.Release|ARM64.ActiveCfg = Release|Win32
+ {AD347424-7340-47CE-A979-2C7F2DF0EB38}.Release|x64.ActiveCfg = Release|x64
+ {AD347424-7340-47CE-A979-2C7F2DF0EB38}.Release|x64.Build.0 = Release|x64
{AD347424-7340-47CE-A979-2C7F2DF0EB38}.Release|x86.ActiveCfg = Release|Win32
{AD347424-7340-47CE-A979-2C7F2DF0EB38}.Release|x86.Build.0 = Release|Win32
+ {39CD08AE-9700-49CF-8616-18C20644416F}.Debug|ARM.ActiveCfg = Debug|ARM
+ {39CD08AE-9700-49CF-8616-18C20644416F}.Debug|ARM.Build.0 = Debug|ARM
+ {39CD08AE-9700-49CF-8616-18C20644416F}.Debug|ARM64.ActiveCfg = Debug|Win32
+ {39CD08AE-9700-49CF-8616-18C20644416F}.Debug|x64.ActiveCfg = Debug|x64
+ {39CD08AE-9700-49CF-8616-18C20644416F}.Debug|x64.Build.0 = Debug|x64
{39CD08AE-9700-49CF-8616-18C20644416F}.Debug|x86.ActiveCfg = Debug|Win32
{39CD08AE-9700-49CF-8616-18C20644416F}.Debug|x86.Build.0 = Debug|Win32
+ {39CD08AE-9700-49CF-8616-18C20644416F}.Release|ARM.ActiveCfg = Release|ARM
+ {39CD08AE-9700-49CF-8616-18C20644416F}.Release|ARM.Build.0 = Release|ARM
+ {39CD08AE-9700-49CF-8616-18C20644416F}.Release|ARM64.ActiveCfg = Release|Win32
+ {39CD08AE-9700-49CF-8616-18C20644416F}.Release|x64.ActiveCfg = Release|x64
+ {39CD08AE-9700-49CF-8616-18C20644416F}.Release|x64.Build.0 = Release|x64
{39CD08AE-9700-49CF-8616-18C20644416F}.Release|x86.ActiveCfg = Release|Win32
{39CD08AE-9700-49CF-8616-18C20644416F}.Release|x86.Build.0 = Release|Win32
+ {208C932D-A71E-4C67-A444-0697E9A4226E}.Debug|ARM.ActiveCfg = Debug|ARM
+ {208C932D-A71E-4C67-A444-0697E9A4226E}.Debug|ARM.Build.0 = Debug|ARM
+ {208C932D-A71E-4C67-A444-0697E9A4226E}.Debug|ARM64.ActiveCfg = Debug|Win32
+ {208C932D-A71E-4C67-A444-0697E9A4226E}.Debug|x64.ActiveCfg = Debug|x64
+ {208C932D-A71E-4C67-A444-0697E9A4226E}.Debug|x64.Build.0 = Debug|x64
{208C932D-A71E-4C67-A444-0697E9A4226E}.Debug|x86.ActiveCfg = Debug|Win32
{208C932D-A71E-4C67-A444-0697E9A4226E}.Debug|x86.Build.0 = Debug|Win32
+ {208C932D-A71E-4C67-A444-0697E9A4226E}.Release|ARM.ActiveCfg = Release|ARM
+ {208C932D-A71E-4C67-A444-0697E9A4226E}.Release|ARM.Build.0 = Release|ARM
+ {208C932D-A71E-4C67-A444-0697E9A4226E}.Release|ARM64.ActiveCfg = Release|Win32
+ {208C932D-A71E-4C67-A444-0697E9A4226E}.Release|x64.ActiveCfg = Release|x64
+ {208C932D-A71E-4C67-A444-0697E9A4226E}.Release|x64.Build.0 = Release|x64
{208C932D-A71E-4C67-A444-0697E9A4226E}.Release|x86.ActiveCfg = Release|Win32
{208C932D-A71E-4C67-A444-0697E9A4226E}.Release|x86.Build.0 = Release|Win32
+ {940A6D80-0775-4272-84C9-1585C4757071}.Debug|ARM.ActiveCfg = Debug|ARM
+ {940A6D80-0775-4272-84C9-1585C4757071}.Debug|ARM.Build.0 = Debug|ARM
+ {940A6D80-0775-4272-84C9-1585C4757071}.Debug|ARM64.ActiveCfg = Debug|Win32
+ {940A6D80-0775-4272-84C9-1585C4757071}.Debug|x64.ActiveCfg = Debug|x64
+ {940A6D80-0775-4272-84C9-1585C4757071}.Debug|x64.Build.0 = Debug|x64
{940A6D80-0775-4272-84C9-1585C4757071}.Debug|x86.ActiveCfg = Debug|Win32
{940A6D80-0775-4272-84C9-1585C4757071}.Debug|x86.Build.0 = Debug|Win32
+ {940A6D80-0775-4272-84C9-1585C4757071}.Release|ARM.ActiveCfg = Release|ARM
+ {940A6D80-0775-4272-84C9-1585C4757071}.Release|ARM.Build.0 = Release|ARM
+ {940A6D80-0775-4272-84C9-1585C4757071}.Release|ARM64.ActiveCfg = Release|Win32
+ {940A6D80-0775-4272-84C9-1585C4757071}.Release|x64.ActiveCfg = Release|x64
+ {940A6D80-0775-4272-84C9-1585C4757071}.Release|x64.Build.0 = Release|x64
{940A6D80-0775-4272-84C9-1585C4757071}.Release|x86.ActiveCfg = Release|Win32
{940A6D80-0775-4272-84C9-1585C4757071}.Release|x86.Build.0 = Release|Win32
+ {CF168211-03A8-419E-840B-3E6BF6688FD9}.Debug|ARM.ActiveCfg = Debug|Win32
+ {CF168211-03A8-419E-840B-3E6BF6688FD9}.Debug|ARM64.ActiveCfg = Debug|Win32
+ {CF168211-03A8-419E-840B-3E6BF6688FD9}.Debug|x64.ActiveCfg = Debug|Win32
{CF168211-03A8-419E-840B-3E6BF6688FD9}.Debug|x86.ActiveCfg = Debug|Win32
{CF168211-03A8-419E-840B-3E6BF6688FD9}.Debug|x86.Build.0 = Debug|Win32
{CF168211-03A8-419E-840B-3E6BF6688FD9}.Debug|x86.Deploy.0 = Debug|Win32
+ {CF168211-03A8-419E-840B-3E6BF6688FD9}.Release|ARM.ActiveCfg = Release|Win32
+ {CF168211-03A8-419E-840B-3E6BF6688FD9}.Release|ARM64.ActiveCfg = Release|Win32
+ {CF168211-03A8-419E-840B-3E6BF6688FD9}.Release|x64.ActiveCfg = Release|Win32
{CF168211-03A8-419E-840B-3E6BF6688FD9}.Release|x86.ActiveCfg = Release|Win32
{CF168211-03A8-419E-840B-3E6BF6688FD9}.Release|x86.Build.0 = Release|Win32
{CF168211-03A8-419E-840B-3E6BF6688FD9}.Release|x86.Deploy.0 = Release|Win32
+ {477E0656-4A58-44B8-AACF-909E925FF21F}.Debug|ARM.ActiveCfg = Debug|Win32
+ {477E0656-4A58-44B8-AACF-909E925FF21F}.Debug|ARM64.ActiveCfg = Debug|Win32
+ {477E0656-4A58-44B8-AACF-909E925FF21F}.Debug|x64.ActiveCfg = Debug|Win32
{477E0656-4A58-44B8-AACF-909E925FF21F}.Debug|x86.ActiveCfg = Debug|Win32
{477E0656-4A58-44B8-AACF-909E925FF21F}.Debug|x86.Build.0 = Debug|Win32
{477E0656-4A58-44B8-AACF-909E925FF21F}.Debug|x86.Deploy.0 = Debug|Win32
+ {477E0656-4A58-44B8-AACF-909E925FF21F}.Release|ARM.ActiveCfg = Release|Win32
+ {477E0656-4A58-44B8-AACF-909E925FF21F}.Release|ARM64.ActiveCfg = Release|Win32
+ {477E0656-4A58-44B8-AACF-909E925FF21F}.Release|x64.ActiveCfg = Release|Win32
{477E0656-4A58-44B8-AACF-909E925FF21F}.Release|x86.ActiveCfg = Release|Win32
{477E0656-4A58-44B8-AACF-909E925FF21F}.Release|x86.Build.0 = Release|Win32
{477E0656-4A58-44B8-AACF-909E925FF21F}.Release|x86.Deploy.0 = Release|Win32
+ {DB17360F-8412-418A-8919-250441BCC43F}.Debug|ARM.ActiveCfg = Debug|Win32
+ {DB17360F-8412-418A-8919-250441BCC43F}.Debug|ARM64.ActiveCfg = Debug|Win32
+ {DB17360F-8412-418A-8919-250441BCC43F}.Debug|x64.ActiveCfg = Debug|Win32
{DB17360F-8412-418A-8919-250441BCC43F}.Debug|x86.ActiveCfg = Debug|Win32
{DB17360F-8412-418A-8919-250441BCC43F}.Debug|x86.Build.0 = Debug|Win32
{DB17360F-8412-418A-8919-250441BCC43F}.Debug|x86.Deploy.0 = Debug|Win32
+ {DB17360F-8412-418A-8919-250441BCC43F}.Release|ARM.ActiveCfg = Release|Win32
+ {DB17360F-8412-418A-8919-250441BCC43F}.Release|ARM64.ActiveCfg = Release|Win32
+ {DB17360F-8412-418A-8919-250441BCC43F}.Release|x64.ActiveCfg = Release|Win32
{DB17360F-8412-418A-8919-250441BCC43F}.Release|x86.ActiveCfg = Release|Win32
{DB17360F-8412-418A-8919-250441BCC43F}.Release|x86.Build.0 = Release|Win32
{DB17360F-8412-418A-8919-250441BCC43F}.Release|x86.Deploy.0 = Release|Win32
+ {A08C66C8-88B3-45F4-8643-27939BC248ED}.Debug|ARM.ActiveCfg = Debug|Win32
+ {A08C66C8-88B3-45F4-8643-27939BC248ED}.Debug|ARM64.ActiveCfg = Debug|Win32
+ {A08C66C8-88B3-45F4-8643-27939BC248ED}.Debug|x64.ActiveCfg = Debug|Win32
{A08C66C8-88B3-45F4-8643-27939BC248ED}.Debug|x86.ActiveCfg = Debug|Win32
{A08C66C8-88B3-45F4-8643-27939BC248ED}.Debug|x86.Build.0 = Debug|Win32
{A08C66C8-88B3-45F4-8643-27939BC248ED}.Debug|x86.Deploy.0 = Debug|Win32
+ {A08C66C8-88B3-45F4-8643-27939BC248ED}.Release|ARM.ActiveCfg = Release|Win32
+ {A08C66C8-88B3-45F4-8643-27939BC248ED}.Release|ARM64.ActiveCfg = Release|Win32
+ {A08C66C8-88B3-45F4-8643-27939BC248ED}.Release|x64.ActiveCfg = Release|Win32
{A08C66C8-88B3-45F4-8643-27939BC248ED}.Release|x86.ActiveCfg = Release|Win32
{A08C66C8-88B3-45F4-8643-27939BC248ED}.Release|x86.Build.0 = Release|Win32
{A08C66C8-88B3-45F4-8643-27939BC248ED}.Release|x86.Deploy.0 = Release|Win32
+ {898B7ED1-3194-463A-8B9C-D4A2460909EE}.Debug|ARM.ActiveCfg = Debug|ARM
+ {898B7ED1-3194-463A-8B9C-D4A2460909EE}.Debug|ARM.Build.0 = Debug|ARM
+ {898B7ED1-3194-463A-8B9C-D4A2460909EE}.Debug|ARM.Deploy.0 = Debug|ARM
+ {898B7ED1-3194-463A-8B9C-D4A2460909EE}.Debug|ARM64.ActiveCfg = Debug|x86
+ {898B7ED1-3194-463A-8B9C-D4A2460909EE}.Debug|x64.ActiveCfg = Debug|x64
+ {898B7ED1-3194-463A-8B9C-D4A2460909EE}.Debug|x64.Build.0 = Debug|x64
+ {898B7ED1-3194-463A-8B9C-D4A2460909EE}.Debug|x64.Deploy.0 = Debug|x64
{898B7ED1-3194-463A-8B9C-D4A2460909EE}.Debug|x86.ActiveCfg = Debug|x86
{898B7ED1-3194-463A-8B9C-D4A2460909EE}.Debug|x86.Build.0 = Debug|x86
{898B7ED1-3194-463A-8B9C-D4A2460909EE}.Debug|x86.Deploy.0 = Debug|x86
+ {898B7ED1-3194-463A-8B9C-D4A2460909EE}.Release|ARM.ActiveCfg = Release|ARM
+ {898B7ED1-3194-463A-8B9C-D4A2460909EE}.Release|ARM.Build.0 = Release|ARM
+ {898B7ED1-3194-463A-8B9C-D4A2460909EE}.Release|ARM.Deploy.0 = Release|ARM
+ {898B7ED1-3194-463A-8B9C-D4A2460909EE}.Release|ARM64.ActiveCfg = Release|x86
+ {898B7ED1-3194-463A-8B9C-D4A2460909EE}.Release|x64.ActiveCfg = Release|x64
+ {898B7ED1-3194-463A-8B9C-D4A2460909EE}.Release|x64.Build.0 = Release|x64
+ {898B7ED1-3194-463A-8B9C-D4A2460909EE}.Release|x64.Deploy.0 = Release|x64
{898B7ED1-3194-463A-8B9C-D4A2460909EE}.Release|x86.ActiveCfg = Release|x86
{898B7ED1-3194-463A-8B9C-D4A2460909EE}.Release|x86.Build.0 = Release|x86
{898B7ED1-3194-463A-8B9C-D4A2460909EE}.Release|x86.Deploy.0 = Release|x86
+ {B6EB593C-8396-4152-BE49-5C5AFCD74603}.Debug|ARM.ActiveCfg = Debug|ARM
+ {B6EB593C-8396-4152-BE49-5C5AFCD74603}.Debug|ARM.Build.0 = Debug|ARM
+ {B6EB593C-8396-4152-BE49-5C5AFCD74603}.Debug|ARM.Deploy.0 = Debug|ARM
+ {B6EB593C-8396-4152-BE49-5C5AFCD74603}.Debug|ARM64.ActiveCfg = Debug|x86
+ {B6EB593C-8396-4152-BE49-5C5AFCD74603}.Debug|x64.ActiveCfg = Debug|x64
+ {B6EB593C-8396-4152-BE49-5C5AFCD74603}.Debug|x64.Build.0 = Debug|x64
+ {B6EB593C-8396-4152-BE49-5C5AFCD74603}.Debug|x64.Deploy.0 = Debug|x64
{B6EB593C-8396-4152-BE49-5C5AFCD74603}.Debug|x86.ActiveCfg = Debug|x86
{B6EB593C-8396-4152-BE49-5C5AFCD74603}.Debug|x86.Build.0 = Debug|x86
{B6EB593C-8396-4152-BE49-5C5AFCD74603}.Debug|x86.Deploy.0 = Debug|x86
+ {B6EB593C-8396-4152-BE49-5C5AFCD74603}.Release|ARM.ActiveCfg = Release|ARM
+ {B6EB593C-8396-4152-BE49-5C5AFCD74603}.Release|ARM.Build.0 = Release|ARM
+ {B6EB593C-8396-4152-BE49-5C5AFCD74603}.Release|ARM.Deploy.0 = Release|ARM
+ {B6EB593C-8396-4152-BE49-5C5AFCD74603}.Release|ARM64.ActiveCfg = Release|x86
+ {B6EB593C-8396-4152-BE49-5C5AFCD74603}.Release|x64.ActiveCfg = Release|x64
+ {B6EB593C-8396-4152-BE49-5C5AFCD74603}.Release|x64.Build.0 = Release|x64
+ {B6EB593C-8396-4152-BE49-5C5AFCD74603}.Release|x64.Deploy.0 = Release|x64
{B6EB593C-8396-4152-BE49-5C5AFCD74603}.Release|x86.ActiveCfg = Release|x86
{B6EB593C-8396-4152-BE49-5C5AFCD74603}.Release|x86.Build.0 = Release|x86
{B6EB593C-8396-4152-BE49-5C5AFCD74603}.Release|x86.Deploy.0 = Release|x86
+ {75FBEFAA-5523-47E5-B8EC-6CBCCD9A26DC}.Debug|ARM.ActiveCfg = Debug|ARM
+ {75FBEFAA-5523-47E5-B8EC-6CBCCD9A26DC}.Debug|ARM.Build.0 = Debug|ARM
+ {75FBEFAA-5523-47E5-B8EC-6CBCCD9A26DC}.Debug|ARM.Deploy.0 = Debug|ARM
+ {75FBEFAA-5523-47E5-B8EC-6CBCCD9A26DC}.Debug|ARM64.ActiveCfg = Debug|Win32
+ {75FBEFAA-5523-47E5-B8EC-6CBCCD9A26DC}.Debug|x64.ActiveCfg = Debug|x64
+ {75FBEFAA-5523-47E5-B8EC-6CBCCD9A26DC}.Debug|x64.Build.0 = Debug|x64
+ {75FBEFAA-5523-47E5-B8EC-6CBCCD9A26DC}.Debug|x64.Deploy.0 = Debug|x64
{75FBEFAA-5523-47E5-B8EC-6CBCCD9A26DC}.Debug|x86.ActiveCfg = Debug|Win32
{75FBEFAA-5523-47E5-B8EC-6CBCCD9A26DC}.Debug|x86.Build.0 = Debug|Win32
{75FBEFAA-5523-47E5-B8EC-6CBCCD9A26DC}.Debug|x86.Deploy.0 = Debug|Win32
+ {75FBEFAA-5523-47E5-B8EC-6CBCCD9A26DC}.Release|ARM.ActiveCfg = Release|ARM
+ {75FBEFAA-5523-47E5-B8EC-6CBCCD9A26DC}.Release|ARM.Build.0 = Release|ARM
+ {75FBEFAA-5523-47E5-B8EC-6CBCCD9A26DC}.Release|ARM.Deploy.0 = Release|ARM
+ {75FBEFAA-5523-47E5-B8EC-6CBCCD9A26DC}.Release|ARM64.ActiveCfg = Release|Win32
+ {75FBEFAA-5523-47E5-B8EC-6CBCCD9A26DC}.Release|x64.ActiveCfg = Release|x64
+ {75FBEFAA-5523-47E5-B8EC-6CBCCD9A26DC}.Release|x64.Build.0 = Release|x64
+ {75FBEFAA-5523-47E5-B8EC-6CBCCD9A26DC}.Release|x64.Deploy.0 = Release|x64
{75FBEFAA-5523-47E5-B8EC-6CBCCD9A26DC}.Release|x86.ActiveCfg = Release|Win32
{75FBEFAA-5523-47E5-B8EC-6CBCCD9A26DC}.Release|x86.Build.0 = Release|Win32
{75FBEFAA-5523-47E5-B8EC-6CBCCD9A26DC}.Release|x86.Deploy.0 = Release|Win32
+ {A1F9E48F-49E3-4F8C-AC48-2EFDBED4B873}.Debug|ARM.ActiveCfg = Debug|ARM
+ {A1F9E48F-49E3-4F8C-AC48-2EFDBED4B873}.Debug|ARM.Build.0 = Debug|ARM
+ {A1F9E48F-49E3-4F8C-AC48-2EFDBED4B873}.Debug|ARM64.ActiveCfg = Debug|Win32
+ {A1F9E48F-49E3-4F8C-AC48-2EFDBED4B873}.Debug|x64.ActiveCfg = Debug|x64
+ {A1F9E48F-49E3-4F8C-AC48-2EFDBED4B873}.Debug|x64.Build.0 = Debug|x64
{A1F9E48F-49E3-4F8C-AC48-2EFDBED4B873}.Debug|x86.ActiveCfg = Debug|Win32
{A1F9E48F-49E3-4F8C-AC48-2EFDBED4B873}.Debug|x86.Build.0 = Debug|Win32
+ {A1F9E48F-49E3-4F8C-AC48-2EFDBED4B873}.Release|ARM.ActiveCfg = Release|ARM
+ {A1F9E48F-49E3-4F8C-AC48-2EFDBED4B873}.Release|ARM.Build.0 = Release|ARM
+ {A1F9E48F-49E3-4F8C-AC48-2EFDBED4B873}.Release|ARM64.ActiveCfg = Release|Win32
+ {A1F9E48F-49E3-4F8C-AC48-2EFDBED4B873}.Release|x64.ActiveCfg = Release|x64
+ {A1F9E48F-49E3-4F8C-AC48-2EFDBED4B873}.Release|x64.Build.0 = Release|x64
{A1F9E48F-49E3-4F8C-AC48-2EFDBED4B873}.Release|x86.ActiveCfg = Release|Win32
{A1F9E48F-49E3-4F8C-AC48-2EFDBED4B873}.Release|x86.Build.0 = Release|Win32
+ {08CB6A04-0ACC-4C20-81CE-10417D888D1C}.Debug|ARM.ActiveCfg = Debug|ARM
+ {08CB6A04-0ACC-4C20-81CE-10417D888D1C}.Debug|ARM.Build.0 = Debug|ARM
+ {08CB6A04-0ACC-4C20-81CE-10417D888D1C}.Debug|ARM64.ActiveCfg = Debug|Win32
+ {08CB6A04-0ACC-4C20-81CE-10417D888D1C}.Debug|x64.ActiveCfg = Debug|x64
+ {08CB6A04-0ACC-4C20-81CE-10417D888D1C}.Debug|x64.Build.0 = Debug|x64
{08CB6A04-0ACC-4C20-81CE-10417D888D1C}.Debug|x86.ActiveCfg = Debug|Win32
{08CB6A04-0ACC-4C20-81CE-10417D888D1C}.Debug|x86.Build.0 = Debug|Win32
+ {08CB6A04-0ACC-4C20-81CE-10417D888D1C}.Release|ARM.ActiveCfg = Release|ARM
+ {08CB6A04-0ACC-4C20-81CE-10417D888D1C}.Release|ARM.Build.0 = Release|ARM
+ {08CB6A04-0ACC-4C20-81CE-10417D888D1C}.Release|ARM64.ActiveCfg = Release|Win32
+ {08CB6A04-0ACC-4C20-81CE-10417D888D1C}.Release|x64.ActiveCfg = Release|x64
+ {08CB6A04-0ACC-4C20-81CE-10417D888D1C}.Release|x64.Build.0 = Release|x64
{08CB6A04-0ACC-4C20-81CE-10417D888D1C}.Release|x86.ActiveCfg = Release|Win32
{08CB6A04-0ACC-4C20-81CE-10417D888D1C}.Release|x86.Build.0 = Release|Win32
+ {6E542043-C5D1-4850-B43E-E9295B640C2B}.Debug|ARM.ActiveCfg = Debug|ARM
+ {6E542043-C5D1-4850-B43E-E9295B640C2B}.Debug|ARM.Build.0 = Debug|ARM
+ {6E542043-C5D1-4850-B43E-E9295B640C2B}.Debug|ARM64.ActiveCfg = Debug|Win32
+ {6E542043-C5D1-4850-B43E-E9295B640C2B}.Debug|x64.ActiveCfg = Debug|x64
+ {6E542043-C5D1-4850-B43E-E9295B640C2B}.Debug|x64.Build.0 = Debug|x64
{6E542043-C5D1-4850-B43E-E9295B640C2B}.Debug|x86.ActiveCfg = Debug|Win32
{6E542043-C5D1-4850-B43E-E9295B640C2B}.Debug|x86.Build.0 = Debug|Win32
+ {6E542043-C5D1-4850-B43E-E9295B640C2B}.Release|ARM.ActiveCfg = Release|ARM
+ {6E542043-C5D1-4850-B43E-E9295B640C2B}.Release|ARM.Build.0 = Release|ARM
+ {6E542043-C5D1-4850-B43E-E9295B640C2B}.Release|ARM64.ActiveCfg = Release|Win32
+ {6E542043-C5D1-4850-B43E-E9295B640C2B}.Release|x64.ActiveCfg = Release|x64
+ {6E542043-C5D1-4850-B43E-E9295B640C2B}.Release|x64.Build.0 = Release|x64
{6E542043-C5D1-4850-B43E-E9295B640C2B}.Release|x86.ActiveCfg = Release|Win32
{6E542043-C5D1-4850-B43E-E9295B640C2B}.Release|x86.Build.0 = Release|Win32
+ {AA2E727F-AF3D-4A9B-A24A-E4424E179B7E}.Debug|ARM.ActiveCfg = Debug|ARM
+ {AA2E727F-AF3D-4A9B-A24A-E4424E179B7E}.Debug|ARM.Build.0 = Debug|ARM
+ {AA2E727F-AF3D-4A9B-A24A-E4424E179B7E}.Debug|ARM.Deploy.0 = Debug|ARM
+ {AA2E727F-AF3D-4A9B-A24A-E4424E179B7E}.Debug|ARM64.ActiveCfg = Debug|Win32
+ {AA2E727F-AF3D-4A9B-A24A-E4424E179B7E}.Debug|x64.ActiveCfg = Debug|x64
+ {AA2E727F-AF3D-4A9B-A24A-E4424E179B7E}.Debug|x64.Build.0 = Debug|x64
+ {AA2E727F-AF3D-4A9B-A24A-E4424E179B7E}.Debug|x64.Deploy.0 = Debug|x64
{AA2E727F-AF3D-4A9B-A24A-E4424E179B7E}.Debug|x86.ActiveCfg = Debug|Win32
{AA2E727F-AF3D-4A9B-A24A-E4424E179B7E}.Debug|x86.Build.0 = Debug|Win32
{AA2E727F-AF3D-4A9B-A24A-E4424E179B7E}.Debug|x86.Deploy.0 = Debug|Win32
+ {AA2E727F-AF3D-4A9B-A24A-E4424E179B7E}.Release|ARM.ActiveCfg = Release|ARM
+ {AA2E727F-AF3D-4A9B-A24A-E4424E179B7E}.Release|ARM.Build.0 = Release|ARM
+ {AA2E727F-AF3D-4A9B-A24A-E4424E179B7E}.Release|ARM.Deploy.0 = Release|ARM
+ {AA2E727F-AF3D-4A9B-A24A-E4424E179B7E}.Release|ARM64.ActiveCfg = Release|Win32
+ {AA2E727F-AF3D-4A9B-A24A-E4424E179B7E}.Release|x64.ActiveCfg = Release|x64
+ {AA2E727F-AF3D-4A9B-A24A-E4424E179B7E}.Release|x64.Build.0 = Release|x64
+ {AA2E727F-AF3D-4A9B-A24A-E4424E179B7E}.Release|x64.Deploy.0 = Release|x64
{AA2E727F-AF3D-4A9B-A24A-E4424E179B7E}.Release|x86.ActiveCfg = Release|Win32
{AA2E727F-AF3D-4A9B-A24A-E4424E179B7E}.Release|x86.Build.0 = Release|Win32
{AA2E727F-AF3D-4A9B-A24A-E4424E179B7E}.Release|x86.Deploy.0 = Release|Win32
+ {421BB462-74F2-4831-9AB7-06B77E0A98B4}.Debug|ARM.ActiveCfg = Debug|ARM
+ {421BB462-74F2-4831-9AB7-06B77E0A98B4}.Debug|ARM.Build.0 = Debug|ARM
+ {421BB462-74F2-4831-9AB7-06B77E0A98B4}.Debug|ARM64.ActiveCfg = Debug|Win32
+ {421BB462-74F2-4831-9AB7-06B77E0A98B4}.Debug|x64.ActiveCfg = Debug|x64
+ {421BB462-74F2-4831-9AB7-06B77E0A98B4}.Debug|x64.Build.0 = Debug|x64
{421BB462-74F2-4831-9AB7-06B77E0A98B4}.Debug|x86.ActiveCfg = Debug|Win32
{421BB462-74F2-4831-9AB7-06B77E0A98B4}.Debug|x86.Build.0 = Debug|Win32
+ {421BB462-74F2-4831-9AB7-06B77E0A98B4}.Release|ARM.ActiveCfg = Release|ARM
+ {421BB462-74F2-4831-9AB7-06B77E0A98B4}.Release|ARM.Build.0 = Release|ARM
+ {421BB462-74F2-4831-9AB7-06B77E0A98B4}.Release|ARM64.ActiveCfg = Release|Win32
+ {421BB462-74F2-4831-9AB7-06B77E0A98B4}.Release|x64.ActiveCfg = Release|x64
+ {421BB462-74F2-4831-9AB7-06B77E0A98B4}.Release|x64.Build.0 = Release|x64
{421BB462-74F2-4831-9AB7-06B77E0A98B4}.Release|x86.ActiveCfg = Release|Win32
{421BB462-74F2-4831-9AB7-06B77E0A98B4}.Release|x86.Build.0 = Release|Win32
+ {8D84A8AE-BD70-4F78-B85A-230A033FB7EC}.Debug|ARM.ActiveCfg = Debug|Win32
+ {8D84A8AE-BD70-4F78-B85A-230A033FB7EC}.Debug|ARM64.ActiveCfg = Debug|Win32
+ {8D84A8AE-BD70-4F78-B85A-230A033FB7EC}.Debug|x64.ActiveCfg = Debug|Win32
+ {8D84A8AE-BD70-4F78-B85A-230A033FB7EC}.Debug|x86.ActiveCfg = Debug|Win32
+ {8D84A8AE-BD70-4F78-B85A-230A033FB7EC}.Debug|x86.Build.0 = Debug|Win32
+ {8D84A8AE-BD70-4F78-B85A-230A033FB7EC}.Debug|x86.Deploy.0 = Debug|Win32
+ {8D84A8AE-BD70-4F78-B85A-230A033FB7EC}.Release|ARM.ActiveCfg = Release|Win32
+ {8D84A8AE-BD70-4F78-B85A-230A033FB7EC}.Release|ARM64.ActiveCfg = Release|Win32
+ {8D84A8AE-BD70-4F78-B85A-230A033FB7EC}.Release|x64.ActiveCfg = Release|Win32
+ {8D84A8AE-BD70-4F78-B85A-230A033FB7EC}.Release|x86.ActiveCfg = Release|Win32
+ {8D84A8AE-BD70-4F78-B85A-230A033FB7EC}.Release|x86.Build.0 = Release|Win32
+ {8D84A8AE-BD70-4F78-B85A-230A033FB7EC}.Release|x86.Deploy.0 = Release|Win32
+ {E71542FD-E5F3-55BC-8EBB-4FFC708277CD}.Debug|ARM.ActiveCfg = Debug|ARM
+ {E71542FD-E5F3-55BC-8EBB-4FFC708277CD}.Debug|ARM.Build.0 = Debug|ARM
+ {E71542FD-E5F3-55BC-8EBB-4FFC708277CD}.Debug|ARM.Deploy.0 = Debug|ARM
+ {E71542FD-E5F3-55BC-8EBB-4FFC708277CD}.Debug|ARM64.ActiveCfg = Debug|Win32
+ {E71542FD-E5F3-55BC-8EBB-4FFC708277CD}.Debug|x64.ActiveCfg = Debug|x64
+ {E71542FD-E5F3-55BC-8EBB-4FFC708277CD}.Debug|x64.Build.0 = Debug|x64
+ {E71542FD-E5F3-55BC-8EBB-4FFC708277CD}.Debug|x64.Deploy.0 = Debug|x64
{E71542FD-E5F3-55BC-8EBB-4FFC708277CD}.Debug|x86.ActiveCfg = Debug|Win32
{E71542FD-E5F3-55BC-8EBB-4FFC708277CD}.Debug|x86.Build.0 = Debug|Win32
{E71542FD-E5F3-55BC-8EBB-4FFC708277CD}.Debug|x86.Deploy.0 = Debug|Win32
+ {E71542FD-E5F3-55BC-8EBB-4FFC708277CD}.Release|ARM.ActiveCfg = Release|ARM
+ {E71542FD-E5F3-55BC-8EBB-4FFC708277CD}.Release|ARM.Build.0 = Release|ARM
+ {E71542FD-E5F3-55BC-8EBB-4FFC708277CD}.Release|ARM.Deploy.0 = Release|ARM
+ {E71542FD-E5F3-55BC-8EBB-4FFC708277CD}.Release|ARM64.ActiveCfg = Release|Win32
+ {E71542FD-E5F3-55BC-8EBB-4FFC708277CD}.Release|x64.ActiveCfg = Release|x64
+ {E71542FD-E5F3-55BC-8EBB-4FFC708277CD}.Release|x64.Build.0 = Release|x64
+ {E71542FD-E5F3-55BC-8EBB-4FFC708277CD}.Release|x64.Deploy.0 = Release|x64
{E71542FD-E5F3-55BC-8EBB-4FFC708277CD}.Release|x86.ActiveCfg = Release|Win32
{E71542FD-E5F3-55BC-8EBB-4FFC708277CD}.Release|x86.Build.0 = Release|Win32
{E71542FD-E5F3-55BC-8EBB-4FFC708277CD}.Release|x86.Deploy.0 = Release|Win32
+ {B4DD17EC-EEF8-41FC-8BDC-3C8652DB68E1}.Debug|ARM.ActiveCfg = Debug|ARM
+ {B4DD17EC-EEF8-41FC-8BDC-3C8652DB68E1}.Debug|ARM.Build.0 = Debug|ARM
+ {B4DD17EC-EEF8-41FC-8BDC-3C8652DB68E1}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {B4DD17EC-EEF8-41FC-8BDC-3C8652DB68E1}.Debug|ARM64.Build.0 = Debug|ARM64
+ {B4DD17EC-EEF8-41FC-8BDC-3C8652DB68E1}.Debug|x64.ActiveCfg = Debug|x64
+ {B4DD17EC-EEF8-41FC-8BDC-3C8652DB68E1}.Debug|x64.Build.0 = Debug|x64
+ {B4DD17EC-EEF8-41FC-8BDC-3C8652DB68E1}.Debug|x86.ActiveCfg = Debug|Win32
+ {B4DD17EC-EEF8-41FC-8BDC-3C8652DB68E1}.Debug|x86.Build.0 = Debug|Win32
+ {B4DD17EC-EEF8-41FC-8BDC-3C8652DB68E1}.Release|ARM.ActiveCfg = Release|ARM
+ {B4DD17EC-EEF8-41FC-8BDC-3C8652DB68E1}.Release|ARM.Build.0 = Release|ARM
+ {B4DD17EC-EEF8-41FC-8BDC-3C8652DB68E1}.Release|ARM64.ActiveCfg = Release|ARM64
+ {B4DD17EC-EEF8-41FC-8BDC-3C8652DB68E1}.Release|ARM64.Build.0 = Release|ARM64
+ {B4DD17EC-EEF8-41FC-8BDC-3C8652DB68E1}.Release|x64.ActiveCfg = Release|x64
+ {B4DD17EC-EEF8-41FC-8BDC-3C8652DB68E1}.Release|x64.Build.0 = Release|x64
+ {B4DD17EC-EEF8-41FC-8BDC-3C8652DB68E1}.Release|x86.ActiveCfg = Release|Win32
+ {B4DD17EC-EEF8-41FC-8BDC-3C8652DB68E1}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -164,5 +375,9 @@ Global
{421BB462-74F2-4831-9AB7-06B77E0A98B4} = {F04365BC-D53C-42CF-AD23-32813A00816E}
{8D84A8AE-BD70-4F78-B85A-230A033FB7EC} = {BF93CF08-8CA4-42FD-85C5-1848345189D9}
{E71542FD-E5F3-55BC-8EBB-4FFC708277CD} = {BF93CF08-8CA4-42FD-85C5-1848345189D9}
+ {B4DD17EC-EEF8-41FC-8BDC-3C8652DB68E1} = {0A073483-1C56-4616-9683-2E10CAFC7349}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {5947F9C6-E55A-4A0E-B53E-9BD597C61614}
EndGlobalSection
EndGlobal
diff --git a/Shared/Audio/Audio.props b/Shared/Audio/Audio.props
old mode 100644
new mode 100755
diff --git a/Shared/Audio/Audio.vcxproj b/Shared/Audio/Audio.vcxproj
old mode 100644
new mode 100755
diff --git a/Shared/Audio/Audio.vcxproj.filters b/Shared/Audio/Audio.vcxproj.filters
old mode 100644
new mode 100755
diff --git a/Shared/Audio/AudioFileReader.cpp b/Shared/Audio/AudioFileReader.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Audio/AudioStreamReader.cpp b/Shared/Audio/AudioStreamReader.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Audio/BasicListeningEarcon.wav b/Shared/Audio/BasicListeningEarcon.wav
old mode 100644
new mode 100755
diff --git a/Shared/Audio/BasicResultsEarcon.wav b/Shared/Audio/BasicResultsEarcon.wav
old mode 100644
new mode 100755
diff --git a/Shared/Audio/Include/Audio/All.h b/Shared/Audio/Include/Audio/All.h
old mode 100644
new mode 100755
diff --git a/Shared/Audio/Include/Audio/AudioFileReader.h b/Shared/Audio/Include/Audio/AudioFileReader.h
old mode 100644
new mode 100755
diff --git a/Shared/Audio/Include/Audio/AudioStreamReader.h b/Shared/Audio/Include/Audio/AudioStreamReader.h
old mode 100644
new mode 100755
diff --git a/Shared/Audio/Include/Audio/OmnidirectionalSound.h b/Shared/Audio/Include/Audio/OmnidirectionalSound.h
old mode 100644
new mode 100755
diff --git a/Shared/Audio/Include/Audio/XAudio2Helpers.h b/Shared/Audio/Include/Audio/XAudio2Helpers.h
old mode 100644
new mode 100755
diff --git a/Shared/Audio/OmnidirectionalSound.cpp b/Shared/Audio/OmnidirectionalSound.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Audio/README.md b/Shared/Audio/README.md
old mode 100644
new mode 100755
diff --git a/Shared/Audio/pch.cpp b/Shared/Audio/pch.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Audio/pch.h b/Shared/Audio/pch.h
old mode 100644
new mode 100755
diff --git a/Shared/Audio/targetver.h b/Shared/Audio/targetver.h
old mode 100644
new mode 100755
diff --git a/Shared/Debugging/Debugging.props b/Shared/Debugging/Debugging.props
old mode 100644
new mode 100755
diff --git a/Shared/Debugging/Debugging.vcxproj b/Shared/Debugging/Debugging.vcxproj
old mode 100644
new mode 100755
diff --git a/Shared/Debugging/Debugging.vcxproj.filters b/Shared/Debugging/Debugging.vcxproj.filters
old mode 100644
new mode 100755
diff --git a/Shared/Debugging/Include/Debugging/All.h b/Shared/Debugging/Include/Debugging/All.h
old mode 100644
new mode 100755
diff --git a/Shared/Debugging/Include/Debugging/CodeContracts.h b/Shared/Debugging/Include/Debugging/CodeContracts.h
old mode 100644
new mode 100755
diff --git a/Shared/Debugging/Include/Debugging/Timer.h b/Shared/Debugging/Include/Debugging/Timer.h
old mode 100644
new mode 100755
diff --git a/Shared/Debugging/Include/Debugging/TimerGuard.h b/Shared/Debugging/Include/Debugging/TimerGuard.h
old mode 100644
new mode 100755
diff --git a/Shared/Debugging/Include/Debugging/Trace.h b/Shared/Debugging/Include/Debugging/Trace.h
old mode 100644
new mode 100755
diff --git a/Shared/Debugging/README.md b/Shared/Debugging/README.md
old mode 100644
new mode 100755
diff --git a/Shared/Debugging/Timer.cpp b/Shared/Debugging/Timer.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Debugging/TimerGuard.cpp b/Shared/Debugging/TimerGuard.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Debugging/Trace.cpp b/Shared/Debugging/Trace.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Debugging/pch.cpp b/Shared/Debugging/pch.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Debugging/pch.h b/Shared/Debugging/pch.h
old mode 100644
new mode 100755
diff --git a/Shared/Debugging/targetver.h b/Shared/Debugging/targetver.h
old mode 100644
new mode 100755
diff --git a/Shared/Graphics/CameraResources.cpp b/Shared/Graphics/CameraResources.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Graphics/DeviceResources.cpp b/Shared/Graphics/DeviceResources.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Graphics/Graphics.props b/Shared/Graphics/Graphics.props
old mode 100644
new mode 100755
diff --git a/Shared/Graphics/Graphics.vcxproj b/Shared/Graphics/Graphics.vcxproj
old mode 100644
new mode 100755
diff --git a/Shared/Graphics/Graphics.vcxproj.filters b/Shared/Graphics/Graphics.vcxproj.filters
old mode 100644
new mode 100755
diff --git a/Shared/Graphics/Include/Graphics/All.h b/Shared/Graphics/Include/Graphics/All.h
old mode 100644
new mode 100755
diff --git a/Shared/Graphics/Include/Graphics/CameraResources.h b/Shared/Graphics/Include/Graphics/CameraResources.h
old mode 100644
new mode 100755
diff --git a/Shared/Graphics/Include/Graphics/DeviceResources.h b/Shared/Graphics/Include/Graphics/DeviceResources.h
old mode 100644
new mode 100755
diff --git a/Shared/Graphics/Include/Graphics/DirectXHelper.h b/Shared/Graphics/Include/Graphics/DirectXHelper.h
old mode 100644
new mode 100755
diff --git a/Shared/Graphics/Include/Graphics/StepTimer.h b/Shared/Graphics/Include/Graphics/StepTimer.h
old mode 100644
new mode 100755
diff --git a/Shared/Graphics/README.md b/Shared/Graphics/README.md
old mode 100644
new mode 100755
diff --git a/Shared/Graphics/packages.config b/Shared/Graphics/packages.config
old mode 100644
new mode 100755
diff --git a/Shared/Graphics/pch.cpp b/Shared/Graphics/pch.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Graphics/pch.h b/Shared/Graphics/pch.h
old mode 100644
new mode 100755
diff --git a/Shared/Graphics/targetver.h b/Shared/Graphics/targetver.h
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/CameraIntrinsics.cpp b/Shared/HoloLensForCV/CameraIntrinsics.cpp
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/CameraIntrinsics.h b/Shared/HoloLensForCV/CameraIntrinsics.h
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/CsvWriter.cpp b/Shared/HoloLensForCV/CsvWriter.cpp
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/CsvWriter.h b/Shared/HoloLensForCV/CsvWriter.h
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/HoloLensForCV.vcxproj b/Shared/HoloLensForCV/HoloLensForCV.vcxproj
old mode 100644
new mode 100755
index 3f86f26..699074a
--- a/Shared/HoloLensForCV/HoloLensForCV.vcxproj
+++ b/Shared/HoloLensForCV/HoloLensForCV.vcxproj
@@ -155,6 +155,7 @@
28204
Level4
true
+ $(SolutionDir)packages\Eigen.3.3.3\build\native\include;%(AdditionalIncludeDirectories)
Console
diff --git a/Shared/HoloLensForCV/HoloLensForCV.vcxproj.filters b/Shared/HoloLensForCV/HoloLensForCV.vcxproj.filters
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/ICameraIntrinsics.h b/Shared/HoloLensForCV/ICameraIntrinsics.h
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/ISensorFrameSink.h b/Shared/HoloLensForCV/ISensorFrameSink.h
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/ISensorFrameSinkGroup.h b/Shared/HoloLensForCV/ISensorFrameSinkGroup.h
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/MediaFrameReaderContext.cpp b/Shared/HoloLensForCV/MediaFrameReaderContext.cpp
old mode 100644
new mode 100755
index b1a34f9..acb1cfb
--- a/Shared/HoloLensForCV/MediaFrameReaderContext.cpp
+++ b/Shared/HoloLensForCV/MediaFrameReaderContext.cpp
@@ -112,13 +112,23 @@ namespace HoloLensForCV
Windows::Graphics::Imaging::SoftwareBitmap^ softwareBitmap =
frame->VideoMediaFrame->SoftwareBitmap;
+ Windows::Media::Devices::Core::CameraIntrinsics^ cameraIntrinsics = frame->VideoMediaFrame->CameraIntrinsics;
+
//
// Finally, wrap all of the above information in a SensorFrame object and pass it
// down to the sensor frame sink. We'll also retain a reference to the latest sensor
// frame on this object for immediate consumption by the app.
//
- SensorFrame^ sensorFrame =
- ref new SensorFrame(_sensorType, timestamp, softwareBitmap);
+ SensorFrame^ sensorFrame =
+ // ref new SensorFrame(_sensorType, timestamp, softwareBitmap);
+ // ref new SensorFrame(_sensorType, timestamp, softwareBitmap, frame);
+ ref new SensorFrame(
+ _sensorType
+ ,timestamp
+ ,softwareBitmap
+ // ,cameraIntrinsics
+ );
+
//
// Extract the frame-to-origin transform, if the MFT exposed it:
@@ -178,6 +188,8 @@ namespace HoloLensForCV
zero;
}
+
+ //frame->Properties->Lookup()
//
// Extract camera view transform, if the MFT exposed it:
//
diff --git a/Shared/HoloLensForCV/MediaFrameReaderContext.h b/Shared/HoloLensForCV/MediaFrameReaderContext.h
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/MediaFrameSourceGroup.cpp b/Shared/HoloLensForCV/MediaFrameSourceGroup.cpp
old mode 100644
new mode 100755
index c36ec10..f39fcc4
--- a/Shared/HoloLensForCV/MediaFrameSourceGroup.cpp
+++ b/Shared/HoloLensForCV/MediaFrameSourceGroup.cpp
@@ -389,6 +389,87 @@ namespace HoloLensForCV
}, Concurrency::task_continuation_context::get_current_winrt_context());
}
+ //CameraIntrinsics^
+
+
+
+ // ADDED : ARJUN
+
+ Windows::Media::Devices::Core::CameraIntrinsics^ MediaFrameSourceGroup::GetCameraIntrinsics(SensorType inputSensorType) { //Async??
+
+ Windows::Media::Capture::Frames::MediaFrameSource^ selectedMediaFrameSource;
+ Windows::Media::Devices::Core::CameraIntrinsics^ output;
+
+ for (Windows::Foundation::Collections::IKeyValuePair^ kvp : _mediaCapture->FrameSources)
+ {
+ Windows::Media::Capture::Frames::MediaFrameSource^ source =
+ kvp->Value;
+
+ SensorType sensorType =
+ GetSensorType(
+ source);
+
+ if (IsEnabled(sensorType) && sensorType == inputSensorType) {
+
+ selectedMediaFrameSource = source;
+
+ break;
+
+ }
+
+ }
+
+
+ /*Platform::String^ requestedSubtype =
+ nullptr;
+
+ auto found =
+ std::find_if(
+ begin(selectedMediaFrameSource->SupportedFormats),
+ end(selectedMediaFrameSource->SupportedFormats),
+ [&](Windows::Media::Capture::Frames::MediaFrameFormat^ format)
+ {
+ requestedSubtype =
+ GetSubtypeForFrameReader(
+ selectedMediaFrameSource->Info->SourceKind,
+ format);
+
+ return requestedSubtype != nullptr;
+
+ });
+
+ output = selectedMediaFrameSource->TryGetCameraIntrinsics(*found);
+ */
+
+ output = selectedMediaFrameSource->TryGetCameraIntrinsics(selectedMediaFrameSource->CurrentFormat);
+ if (output == nullptr) {
+ auto found = std::find_if(begin(selectedMediaFrameSource->SupportedFormats),
+ end(selectedMediaFrameSource->SupportedFormats),
+ [&](Windows::Media::Capture::Frames::MediaFrameFormat^ format)
+ {
+ output = selectedMediaFrameSource->TryGetCameraIntrinsics(format);
+
+ if (output == nullptr) {
+ dbg::trace(
+ L"MediaFrameSourceGroup::GetCameraIntrinsics: format %s-%s @%i/%iHz intrinsics nullptr",
+ format->MajorType->Data(),
+ format->Subtype->Data(),
+ format->FrameRate->Numerator,
+ format->FrameRate->Denominator);
+ }
+ return output != nullptr;
+
+ });
+
+ }
+
+ return output;
+
+ }
+
+
+
+
SensorType MediaFrameSourceGroup::GetSensorType(
Windows::Media::Capture::Frames::MediaFrameSource^ source)
{
@@ -709,4 +790,7 @@ namespace HoloLensForCV
return cleanupTask;
}
+
+
+
}
diff --git a/Shared/HoloLensForCV/MediaFrameSourceGroup.h b/Shared/HoloLensForCV/MediaFrameSourceGroup.h
old mode 100644
new mode 100755
index 34cbffe..def45b2
--- a/Shared/HoloLensForCV/MediaFrameSourceGroup.h
+++ b/Shared/HoloLensForCV/MediaFrameSourceGroup.h
@@ -36,6 +36,9 @@ namespace HoloLensForCV
SensorFrame^ GetLatestSensorFrame(
SensorType sensorType);
+ Windows::Media::Devices::Core::CameraIntrinsics^ GetCameraIntrinsics(SensorType sensorType);
+
+
private:
///
/// Returns true if the sensor was explicitly enabled by the user.
@@ -75,6 +78,8 @@ namespace HoloLensForCV
concurrency::task TryInitializeMediaCaptureAsync(
Windows::Media::Capture::Frames::MediaFrameSourceGroup^ group);
+
+
private:
MediaFrameSourceGroupType _mediaFrameSourceGroupType;
SpatialPerception^ _spatialPerception;
diff --git a/Shared/HoloLensForCV/MediaFrameSourceGroupType.h b/Shared/HoloLensForCV/MediaFrameSourceGroupType.h
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/MultiFrameBuffer.cpp b/Shared/HoloLensForCV/MultiFrameBuffer.cpp
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/MultiFrameBuffer.h b/Shared/HoloLensForCV/MultiFrameBuffer.h
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/README.md b/Shared/HoloLensForCV/README.md
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/SensorFrame.cpp b/Shared/HoloLensForCV/SensorFrame.cpp
old mode 100644
new mode 100755
index 236f11b..7e80ccd
--- a/Shared/HoloLensForCV/SensorFrame.cpp
+++ b/Shared/HoloLensForCV/SensorFrame.cpp
@@ -13,13 +13,189 @@
namespace HoloLensForCV
{
- SensorFrame::SensorFrame(
- _In_ SensorType frameType,
- _In_ Windows::Foundation::DateTime timestamp,
- _In_ Windows::Graphics::Imaging::SoftwareBitmap^ softwareBitmap)
- {
- FrameType = frameType;
- Timestamp = timestamp;
- SoftwareBitmap = softwareBitmap;
- }
+ SensorFrame::SensorFrame(
+ _In_ SensorType frameType,
+ _In_ Windows::Foundation::DateTime timestamp,
+ _In_ Windows::Graphics::Imaging::SoftwareBitmap^ softwareBitmap)
+ {
+ FrameType = frameType;
+ Timestamp = timestamp;
+ SoftwareBitmap = softwareBitmap;
+
+ }
+
+ /*SensorFrame::SensorFrame(
+ _In_ SensorType frameType,
+ _In_ Windows::Foundation::DateTime timestamp,
+ _In_ Windows::Graphics::Imaging::SoftwareBitmap^ softwareBitmap,
+ _In_ Windows::Media::Capture::Frames::MediaFrameReference^ frame)
+ {
+ FrameType = frameType;
+ Timestamp = timestamp;
+ SoftwareBitmap = softwareBitmap;
+
+ CoreCameraIntrinsics = frame->VideoMediaFrame->CameraIntrinsics;
+ if (CoreCameraIntrinsics == nullptr) {
+ dbg::trace(L"SensorFrame:VideoMediaFrame CameraIntrinsics null.");
+ }
+ else {
+ dbg::trace(L"SensorFrame:VideoMediaFrame CameraIntrinsics not null!");
+ }
+
+ }*/
+
+ SensorFrame::SensorFrame(
+ _In_ SensorType frameType,
+ _In_ Windows::Foundation::DateTime timestamp,
+ _In_ Windows::Graphics::Imaging::SoftwareBitmap^ softwareBitmap,
+ _In_ Windows::Media::Devices::Core::CameraIntrinsics^ cameraIntrinsics)
+ {
+
+ FrameType = frameType;
+ Timestamp = timestamp;
+ SoftwareBitmap = softwareBitmap;
+ CoreCameraIntrinsics = cameraIntrinsics;
+ if (CoreCameraIntrinsics == nullptr) {
+ dbg::trace(L"SensorFrame:VideoMediaFrame CameraIntrinsics null.");
+ }
+ else {
+ dbg::trace(L"SensorFrame:VideoMediaFrame CameraIntrinsics not null!");
+ }
+
+
+}
+
+ Platform::Array^
+ /*void*/ SensorFrame::sensorFrameToImageBuffer() {
+
+ Windows::Graphics::Imaging::SoftwareBitmap^ bitmap;
+ Windows::Graphics::Imaging::BitmapBuffer^ bitmapBuffer;
+ Windows::Foundation::IMemoryBufferReference^ bitmapBufferReference;
+
+ int32_t imageWidth = 0;
+ int32_t imageHeight = 0;
+ int32_t pixelStride = 1;
+ int32_t rowStride = 0;
+
+ Platform::Array^ imageBufferAsPlatformArray;
+ int32_t imageBufferSize = 0;
+
+ {
+#if DBG_ENABLE_INFORMATIONAL_LOGGING
+ dbg::TimerGuard timerGuard(
+ L"AppMain::sensorFrameToImageBuffer: buffer preparation",
+ 4.0 /* minimum_time_elapsed_in_milliseconds */);
+#endif /* DBG_ENABLE_INFORMATIONAL_LOGGING */
+ imageWidth = SoftwareBitmap->PixelWidth;
+ imageHeight = SoftwareBitmap->PixelHeight;
+
+ bitmap =
+ SoftwareBitmap;
+
+ imageWidth = bitmap->PixelWidth;
+ imageHeight = bitmap->PixelHeight;
+
+ bitmapBuffer =
+ SoftwareBitmap->LockBuffer(
+ Windows::Graphics::Imaging::BitmapBufferAccessMode::Read);
+
+ bitmapBufferReference =
+ bitmapBuffer->CreateReference();
+
+ uint32_t bitmapBufferDataSize = 0;
+
+ uint8_t* bitmapBufferData =
+ Io::GetTypedPointerToMemoryBuffer(
+ bitmapBufferReference,
+ bitmapBufferDataSize);
+
+ switch (SoftwareBitmap->BitmapPixelFormat)
+ {
+ case Windows::Graphics::Imaging::BitmapPixelFormat::Bgra8:
+ pixelStride = 4;
+ break;
+
+ case Windows::Graphics::Imaging::BitmapPixelFormat::Gray16:
+ pixelStride = 2;
+ break;
+
+ case Windows::Graphics::Imaging::BitmapPixelFormat::Gray8:
+ pixelStride = 1;
+ break;
+
+ default:
+#if DBG_ENABLE_INFORMATIONAL_LOGGING
+ dbg::trace(
+ L"SensorFrame::sensorFrameToImageBuffer: unrecognized bitmap pixel format, assuming 1 byte per pixel");
+#endif /* DBG_ENABLE_INFORMATIONAL_LOGGING */
+
+ break;
+ }
+
+ rowStride =
+ imageWidth * pixelStride;
+
+ imageBufferSize =
+ imageHeight * rowStride;
+
+ ASSERT(
+ imageBufferSize == (int32_t)bitmapBufferDataSize);
+
+ imageBufferAsPlatformArray =
+ ref new Platform::Array(
+ bitmapBufferData,
+ imageBufferSize);
+
+ return imageBufferAsPlatformArray;
+
+ }
+
+ }
+ /*
+ Windows::Foundation::Numerics::float4x4 SensorFrame::GetAbsoluteCameraPose() {
+
+ Windows::Foundation::Numerics::float4x4^ output =
+ ref new Windows::Foundation::Numerics::float4x4(
+ 1, 0, 0, 0,
+ 0, -1, 0, 0,
+ 0, 0, -1, 0,
+ 0, 0, 0, 1);
+
+ Windows::Foundation::Numerics::float4x4 InvFrameToOrigin;
+ Windows::Foundation::Numerics::invert(FrameToOrigin, &InvFrameToOrigin);
+
+ output = output * (CameraViewTransform*InvFrameToOrigin);
+
+ return output;
+
+ }
+
+ Windows::Foundation::Numerics::float4x4 SensorFrame::GetCamToOrigin() {
+
+ Windows::Foundation::Numerics::float4x4 camToRef;
+ Windows::Foundation::Numerics::invert(CameraViewTransform, &camToRef);
+
+ Windows::Foundation::Numerics::float4x4 camToOrigin = camToRef * FrameToOrigin;
+
+
+ Eigen::Vector3f camPinhole(camToOrigin.m41, camToOrigin.m42, camToOrigin.m43);
+
+ Eigen::Matrix3f camToOriginR;
+
+ camToOriginR(0, 0) = camToOrigin.m11;
+ camToOriginR(0, 1) = camToOrigin.m12;
+ camToOriginR(0, 2) = camToOrigin.m13;
+ camToOriginR(1, 0) = camToOrigin.m21;
+ camToOriginR(1, 1) = camToOrigin.m22;
+ camToOriginR(1, 2) = camToOrigin.m23;
+ camToOriginR(2, 0) = camToOrigin.m31;
+ camToOriginR(2, 1) = camToOrigin.m32;
+ camToOriginR(2, 2) = camToOrigin.m33;
+
+
+
+ return camToOrigin;
+
+ }
+ */
}
diff --git a/Shared/HoloLensForCV/SensorFrame.h b/Shared/HoloLensForCV/SensorFrame.h
old mode 100644
new mode 100755
index 09cfd75..ea9396c
--- a/Shared/HoloLensForCV/SensorFrame.h
+++ b/Shared/HoloLensForCV/SensorFrame.h
@@ -13,26 +13,59 @@
namespace HoloLensForCV
{
- //
- // Collects information about a sensor frame -- originated on device, or remotely.
- //
- public ref class SensorFrame sealed
- {
- public:
- SensorFrame(
- _In_ SensorType frameType,
- _In_ Windows::Foundation::DateTime timestamp,
- _In_ Windows::Graphics::Imaging::SoftwareBitmap^ softwareBitmap);
-
- property SensorType FrameType;
- property Windows::Foundation::DateTime Timestamp;
- property Windows::Graphics::Imaging::SoftwareBitmap^ SoftwareBitmap;
-
- property Windows::Media::Devices::Core::CameraIntrinsics^ CoreCameraIntrinsics;
- property CameraIntrinsics^ SensorStreamingCameraIntrinsics;
-
- property Windows::Foundation::Numerics::float4x4 FrameToOrigin;
- property Windows::Foundation::Numerics::float4x4 CameraViewTransform;
- property Windows::Foundation::Numerics::float4x4 CameraProjectionTransform;
- };
+ //
+ // Collects information about a sensor frame -- originated on device, or remotely.
+ //
+ public ref class SensorFrame sealed
+ {
+ public:
+ SensorFrame(
+ _In_ SensorType frameType,
+ _In_ Windows::Foundation::DateTime timestamp,
+ _In_ Windows::Graphics::Imaging::SoftwareBitmap^ softwareBitmap);
+
+ /*SensorFrame(
+ _In_ SensorType frameType,
+ _In_ Windows::Foundation::DateTime timestamp,
+ _In_ Windows::Graphics::Imaging::SoftwareBitmap^ softwareBitmap,
+ _In_ Windows::Media::Capture::Frames::MediaFrameReference^ frame);
+ */
+
+ SensorFrame(
+ _In_ SensorType frameType,
+ _In_ Windows::Foundation::DateTime timestamp,
+ _In_ Windows::Graphics::Imaging::SoftwareBitmap^ softwareBitmap,
+ _In_ Windows::Media::Devices::Core::CameraIntrinsics^ cameraIntrinsics);
+
+ property SensorType FrameType;
+ property Windows::Foundation::DateTime Timestamp;
+ property Windows::Graphics::Imaging::SoftwareBitmap^ SoftwareBitmap;
+
+ property Windows::Media::Devices::Core::CameraIntrinsics^ CoreCameraIntrinsics;
+ property CameraIntrinsics^ SensorStreamingCameraIntrinsics;
+
+ property Windows::Foundation::Numerics::float4x4 FrameToOrigin;
+ property Windows::Foundation::Numerics::float4x4 CameraViewTransform;
+ property Windows::Foundation::Numerics::float4x4 CameraProjectionTransform;
+ //Windows::Foundation::Numerics::float4x4 GetAbsoluteCameraPose();
+ //Windows::Foundation::Numerics::float4x4 GetCamToOrigin();
+
+ //property int32_t imageBufferSize;
+ //uint8_t* SensorFrame::GetBitmapBufferData();
+ //property Platform::Array^ imageBufferAsPlatformArray;
+
+ //void SensorFrame::sensorFrameToImageBuffer();
+ Platform::Array^ SensorFrame::sensorFrameToImageBuffer();
+
+
+ private:
+
+ //property int32_t imageWidth;
+ //property int32_t imageHeight;
+ //property int32_t pixelStride;
+ //property int32_t rowStride;
+ //property uint8_t* bitmapBufferData;
+
+
+ };
}
diff --git a/Shared/HoloLensForCV/SensorFrameReceiver.cpp b/Shared/HoloLensForCV/SensorFrameReceiver.cpp
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/SensorFrameReceiver.h b/Shared/HoloLensForCV/SensorFrameReceiver.h
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/SensorFrameRecorder.cpp b/Shared/HoloLensForCV/SensorFrameRecorder.cpp
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/SensorFrameRecorder.h b/Shared/HoloLensForCV/SensorFrameRecorder.h
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/SensorFrameRecorderSink.cpp b/Shared/HoloLensForCV/SensorFrameRecorderSink.cpp
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/SensorFrameRecorderSink.h b/Shared/HoloLensForCV/SensorFrameRecorderSink.h
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/SensorFrameStreamHeader.cpp b/Shared/HoloLensForCV/SensorFrameStreamHeader.cpp
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/SensorFrameStreamHeader.h b/Shared/HoloLensForCV/SensorFrameStreamHeader.h
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/SensorFrameStreamer.cpp b/Shared/HoloLensForCV/SensorFrameStreamer.cpp
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/SensorFrameStreamer.h b/Shared/HoloLensForCV/SensorFrameStreamer.h
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/SensorFrameStreamingServer.cpp b/Shared/HoloLensForCV/SensorFrameStreamingServer.cpp
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/SensorFrameStreamingServer.h b/Shared/HoloLensForCV/SensorFrameStreamingServer.h
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/SensorType.h b/Shared/HoloLensForCV/SensorType.h
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/SpatialPerception.cpp b/Shared/HoloLensForCV/SpatialPerception.cpp
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/SpatialPerception.h b/Shared/HoloLensForCV/SpatialPerception.h
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/pch.cpp b/Shared/HoloLensForCV/pch.cpp
old mode 100644
new mode 100755
diff --git a/Shared/HoloLensForCV/pch.h b/Shared/HoloLensForCV/pch.h
old mode 100644
new mode 100755
index 73a7a27..2a83498
--- a/Shared/HoloLensForCV/pch.h
+++ b/Shared/HoloLensForCV/pch.h
@@ -69,3 +69,6 @@
#include "MediaFrameSourceGroup.h"
#include "MultiFrameBuffer.h"
+
+#include
+
diff --git a/Shared/Holographic/AppMainBase.cpp b/Shared/Holographic/AppMainBase.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Holographic/AppViewBase.cpp b/Shared/Holographic/AppViewBase.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Holographic/Holographic.props b/Shared/Holographic/Holographic.props
old mode 100644
new mode 100755
diff --git a/Shared/Holographic/Holographic.vcxproj b/Shared/Holographic/Holographic.vcxproj
old mode 100644
new mode 100755
diff --git a/Shared/Holographic/Holographic.vcxproj.filters b/Shared/Holographic/Holographic.vcxproj.filters
old mode 100644
new mode 100755
diff --git a/Shared/Holographic/Include/Holographic/All.h b/Shared/Holographic/Include/Holographic/All.h
old mode 100644
new mode 100755
diff --git a/Shared/Holographic/Include/Holographic/AppMainBase.h b/Shared/Holographic/Include/Holographic/AppMainBase.h
old mode 100644
new mode 100755
diff --git a/Shared/Holographic/Include/Holographic/AppViewBase.h b/Shared/Holographic/Include/Holographic/AppViewBase.h
old mode 100644
new mode 100755
diff --git a/Shared/Holographic/Include/Holographic/IAppMain.h b/Shared/Holographic/Include/Holographic/IAppMain.h
old mode 100644
new mode 100755
diff --git a/Shared/Holographic/Include/Holographic/SpatialInputHandler.h b/Shared/Holographic/Include/Holographic/SpatialInputHandler.h
old mode 100644
new mode 100755
diff --git a/Shared/Holographic/README.md b/Shared/Holographic/README.md
old mode 100644
new mode 100755
diff --git a/Shared/Holographic/SpatialInputHandler.cpp b/Shared/Holographic/SpatialInputHandler.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Holographic/pch.cpp b/Shared/Holographic/pch.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Holographic/pch.h b/Shared/Holographic/pch.h
old mode 100644
new mode 100755
diff --git a/Shared/Holographic/targetver.h b/Shared/Holographic/targetver.h
old mode 100644
new mode 100755
diff --git a/Shared/Io/BufferHelpers.cpp b/Shared/Io/BufferHelpers.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Io/Include/Io/All.h b/Shared/Io/Include/Io/All.h
old mode 100644
new mode 100755
diff --git a/Shared/Io/Include/Io/BufferHelpers.h b/Shared/Io/Include/Io/BufferHelpers.h
old mode 100644
new mode 100755
diff --git a/Shared/Io/Include/Io/IoHelpers.h b/Shared/Io/Include/Io/IoHelpers.h
old mode 100644
new mode 100755
diff --git a/Shared/Io/Include/Io/StorageHandleAccess.h b/Shared/Io/Include/Io/StorageHandleAccess.h
old mode 100644
new mode 100755
diff --git a/Shared/Io/Include/Io/StringHelpers.h b/Shared/Io/Include/Io/StringHelpers.h
old mode 100644
new mode 100755
diff --git a/Shared/Io/Include/Io/Tar.h b/Shared/Io/Include/Io/Tar.h
old mode 100644
new mode 100755
diff --git a/Shared/Io/Include/Io/Time.h b/Shared/Io/Include/Io/Time.h
old mode 100644
new mode 100755
diff --git a/Shared/Io/Include/Io/TimeConverter.h b/Shared/Io/Include/Io/TimeConverter.h
old mode 100644
new mode 100755
diff --git a/Shared/Io/Include/Io/Timer.h b/Shared/Io/Include/Io/Timer.h
old mode 100644
new mode 100755
diff --git a/Shared/Io/Io.props b/Shared/Io/Io.props
old mode 100644
new mode 100755
diff --git a/Shared/Io/Io.vcxproj b/Shared/Io/Io.vcxproj
old mode 100644
new mode 100755
diff --git a/Shared/Io/Io.vcxproj.filters b/Shared/Io/Io.vcxproj.filters
old mode 100644
new mode 100755
diff --git a/Shared/Io/IoHelpers.cpp b/Shared/Io/IoHelpers.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Io/README.md b/Shared/Io/README.md
old mode 100644
new mode 100755
diff --git a/Shared/Io/StringHelpers.cpp b/Shared/Io/StringHelpers.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Io/Tar.cpp b/Shared/Io/Tar.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Io/Time.cpp b/Shared/Io/Time.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Io/TimeConverter.cpp b/Shared/Io/TimeConverter.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Io/Timer.cpp b/Shared/Io/Timer.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Io/pch.cpp b/Shared/Io/pch.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Io/pch.h b/Shared/Io/pch.h
old mode 100644
new mode 100755
diff --git a/Shared/Io/targetver.h b/Shared/Io/targetver.h
old mode 100644
new mode 100755
diff --git a/Shared/OpenCVHelpers/Include/OpenCVHelpers/All.h b/Shared/OpenCVHelpers/Include/OpenCVHelpers/All.h
old mode 100644
new mode 100755
diff --git a/Shared/OpenCVHelpers/Include/OpenCVHelpers/OpenCVHelpers.h b/Shared/OpenCVHelpers/Include/OpenCVHelpers/OpenCVHelpers.h
old mode 100644
new mode 100755
diff --git a/Shared/OpenCVHelpers/Include/OpenCVHelpers/OpenCVTexture2D.h b/Shared/OpenCVHelpers/Include/OpenCVHelpers/OpenCVTexture2D.h
old mode 100644
new mode 100755
diff --git a/Shared/OpenCVHelpers/OpenCVHelpers.cpp b/Shared/OpenCVHelpers/OpenCVHelpers.cpp
old mode 100644
new mode 100755
diff --git a/Shared/OpenCVHelpers/OpenCVHelpers.props b/Shared/OpenCVHelpers/OpenCVHelpers.props
old mode 100644
new mode 100755
diff --git a/Shared/OpenCVHelpers/OpenCVHelpers.vcxproj b/Shared/OpenCVHelpers/OpenCVHelpers.vcxproj
old mode 100644
new mode 100755
diff --git a/Shared/OpenCVHelpers/OpenCVHelpers.vcxproj.filters b/Shared/OpenCVHelpers/OpenCVHelpers.vcxproj.filters
old mode 100644
new mode 100755
diff --git a/Shared/OpenCVHelpers/OpenCVTexture2D.cpp b/Shared/OpenCVHelpers/OpenCVTexture2D.cpp
old mode 100644
new mode 100755
diff --git a/Shared/OpenCVHelpers/README.md b/Shared/OpenCVHelpers/README.md
old mode 100644
new mode 100755
diff --git a/Shared/OpenCVHelpers/packages.config b/Shared/OpenCVHelpers/packages.config
old mode 100644
new mode 100755
diff --git a/Shared/OpenCVHelpers/pch.cpp b/Shared/OpenCVHelpers/pch.cpp
old mode 100644
new mode 100755
diff --git a/Shared/OpenCVHelpers/pch.h b/Shared/OpenCVHelpers/pch.h
old mode 100644
new mode 100755
diff --git a/Shared/OpenCVHelpers/targetver.h b/Shared/OpenCVHelpers/targetver.h
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/Include/Rendering/All.h b/Shared/Rendering/Include/Rendering/All.h
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/Include/Rendering/MarkerRenderer.h b/Shared/Rendering/Include/Rendering/MarkerRenderer.h
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/Include/Rendering/PolylineRenderer.h b/Shared/Rendering/Include/Rendering/PolylineRenderer.h
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/Include/Rendering/SlateMaterial.h b/Shared/Rendering/Include/Rendering/SlateMaterial.h
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/Include/Rendering/SlateRenderer.h b/Shared/Rendering/Include/Rendering/SlateRenderer.h
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/Include/Rendering/SlateShaderStructures.h b/Shared/Rendering/Include/Rendering/SlateShaderStructures.h
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/Include/Rendering/Texture2D.h b/Shared/Rendering/Include/Rendering/Texture2D.h
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/MarkerRenderer.cpp b/Shared/Rendering/MarkerRenderer.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/PolylineRenderer.cpp b/Shared/Rendering/PolylineRenderer.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/README.md b/Shared/Rendering/README.md
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/Rendering.props b/Shared/Rendering/Rendering.props
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/Rendering.vcxproj b/Shared/Rendering/Rendering.vcxproj
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/Rendering.vcxproj.filters b/Shared/Rendering/Rendering.vcxproj.filters
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/SlateMaterial.Default.gs.hlsl b/Shared/Rendering/SlateMaterial.Default.gs.hlsl
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/SlateMaterial.Default.ps.hlsl b/Shared/Rendering/SlateMaterial.Default.ps.hlsl
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/SlateMaterial.Default.vs.hlsl b/Shared/Rendering/SlateMaterial.Default.vs.hlsl
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/SlateMaterial.VPRT.vs.hlsl b/Shared/Rendering/SlateMaterial.VPRT.vs.hlsl
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/SlateMaterial.cpp b/Shared/Rendering/SlateMaterial.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/SlateRenderer.cpp b/Shared/Rendering/SlateRenderer.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/Texture2D.cpp b/Shared/Rendering/Texture2D.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/packages.config b/Shared/Rendering/packages.config
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/pch.cpp b/Shared/Rendering/pch.cpp
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/pch.h b/Shared/Rendering/pch.h
old mode 100644
new mode 100755
diff --git a/Shared/Rendering/targetver.h b/Shared/Rendering/targetver.h
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverPV/App.xaml b/Tools/ReceiverPV/App.xaml
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverPV/App.xaml.cs b/Tools/ReceiverPV/App.xaml.cs
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverPV/Assets/LockScreenLogo.scale-200.png b/Tools/ReceiverPV/Assets/LockScreenLogo.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverPV/Assets/SplashScreen.scale-200.png b/Tools/ReceiverPV/Assets/SplashScreen.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverPV/Assets/Square150x150Logo.scale-200.png b/Tools/ReceiverPV/Assets/Square150x150Logo.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverPV/Assets/Square44x44Logo.scale-200.png b/Tools/ReceiverPV/Assets/Square44x44Logo.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverPV/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/Tools/ReceiverPV/Assets/Square44x44Logo.targetsize-24_altform-unplated.png
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverPV/Assets/StoreLogo.png b/Tools/ReceiverPV/Assets/StoreLogo.png
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverPV/Assets/Wide310x150Logo.scale-200.png b/Tools/ReceiverPV/Assets/Wide310x150Logo.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverPV/MainPage.xaml b/Tools/ReceiverPV/MainPage.xaml
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverPV/MainPage.xaml.cs b/Tools/ReceiverPV/MainPage.xaml.cs
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverPV/Package.appxmanifest b/Tools/ReceiverPV/Package.appxmanifest
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverPV/Properties/AssemblyInfo.cs b/Tools/ReceiverPV/Properties/AssemblyInfo.cs
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverPV/Properties/Default.rd.xml b/Tools/ReceiverPV/Properties/Default.rd.xml
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverPV/README.md b/Tools/ReceiverPV/README.md
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverPV/ReceiverPV.csproj b/Tools/ReceiverPV/ReceiverPV.csproj
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverVLC/App.xaml b/Tools/ReceiverVLC/App.xaml
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverVLC/App.xaml.cs b/Tools/ReceiverVLC/App.xaml.cs
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverVLC/Assets/LockScreenLogo.scale-200.png b/Tools/ReceiverVLC/Assets/LockScreenLogo.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverVLC/Assets/SplashScreen.scale-200.png b/Tools/ReceiverVLC/Assets/SplashScreen.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverVLC/Assets/Square150x150Logo.scale-200.png b/Tools/ReceiverVLC/Assets/Square150x150Logo.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverVLC/Assets/Square44x44Logo.scale-200.png b/Tools/ReceiverVLC/Assets/Square44x44Logo.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverVLC/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/Tools/ReceiverVLC/Assets/Square44x44Logo.targetsize-24_altform-unplated.png
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverVLC/Assets/StoreLogo.png b/Tools/ReceiverVLC/Assets/StoreLogo.png
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverVLC/Assets/Wide310x150Logo.scale-200.png b/Tools/ReceiverVLC/Assets/Wide310x150Logo.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverVLC/MainPage.xaml b/Tools/ReceiverVLC/MainPage.xaml
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverVLC/MainPage.xaml.cs b/Tools/ReceiverVLC/MainPage.xaml.cs
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverVLC/Package.appxmanifest b/Tools/ReceiverVLC/Package.appxmanifest
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverVLC/Properties/AssemblyInfo.cs b/Tools/ReceiverVLC/Properties/AssemblyInfo.cs
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverVLC/Properties/Default.rd.xml b/Tools/ReceiverVLC/Properties/Default.rd.xml
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverVLC/README.md b/Tools/ReceiverVLC/README.md
old mode 100644
new mode 100755
diff --git a/Tools/ReceiverVLC/ReceiverVLC.csproj b/Tools/ReceiverVLC/ReceiverVLC.csproj
old mode 100644
new mode 100755
diff --git a/Tools/Recorder/AppMain.cpp b/Tools/Recorder/AppMain.cpp
old mode 100644
new mode 100755
diff --git a/Tools/Recorder/AppMain.h b/Tools/Recorder/AppMain.h
old mode 100644
new mode 100755
diff --git a/Tools/Recorder/AppView.cpp b/Tools/Recorder/AppView.cpp
old mode 100644
new mode 100755
diff --git a/Tools/Recorder/AppView.h b/Tools/Recorder/AppView.h
old mode 100644
new mode 100755
diff --git a/Tools/Recorder/Assets/LockScreenLogo.scale-200.png b/Tools/Recorder/Assets/LockScreenLogo.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/Recorder/Assets/SplashScreen.scale-200.png b/Tools/Recorder/Assets/SplashScreen.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/Recorder/Assets/Square150x150Logo.scale-200.png b/Tools/Recorder/Assets/Square150x150Logo.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/Recorder/Assets/Square44x44Logo.scale-200.png b/Tools/Recorder/Assets/Square44x44Logo.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/Recorder/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/Tools/Recorder/Assets/Square44x44Logo.targetsize-24_altform-unplated.png
old mode 100644
new mode 100755
diff --git a/Tools/Recorder/Assets/StoreLogo.png b/Tools/Recorder/Assets/StoreLogo.png
old mode 100644
new mode 100755
diff --git a/Tools/Recorder/Assets/Wide310x150Logo.scale-200.png b/Tools/Recorder/Assets/Wide310x150Logo.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/Recorder/Package.appxmanifest b/Tools/Recorder/Package.appxmanifest
old mode 100644
new mode 100755
diff --git a/Tools/Recorder/README.md b/Tools/Recorder/README.md
old mode 100644
new mode 100755
diff --git a/Tools/Recorder/Recorder.vcxproj b/Tools/Recorder/Recorder.vcxproj
old mode 100644
new mode 100755
diff --git a/Tools/Recorder/Recorder.vcxproj.filters b/Tools/Recorder/Recorder.vcxproj.filters
old mode 100644
new mode 100755
diff --git a/Tools/Recorder/packages.config b/Tools/Recorder/packages.config
old mode 100644
new mode 100755
diff --git a/Tools/Recorder/pch.cpp b/Tools/Recorder/pch.cpp
old mode 100644
new mode 100755
diff --git a/Tools/Recorder/pch.h b/Tools/Recorder/pch.h
old mode 100644
new mode 100755
diff --git a/Tools/StreamerPV/AppMain.cpp b/Tools/StreamerPV/AppMain.cpp
old mode 100644
new mode 100755
diff --git a/Tools/StreamerPV/AppMain.h b/Tools/StreamerPV/AppMain.h
old mode 100644
new mode 100755
diff --git a/Tools/StreamerPV/AppView.cpp b/Tools/StreamerPV/AppView.cpp
old mode 100644
new mode 100755
diff --git a/Tools/StreamerPV/AppView.h b/Tools/StreamerPV/AppView.h
old mode 100644
new mode 100755
diff --git a/Tools/StreamerPV/Assets/LockScreenLogo.scale-200.png b/Tools/StreamerPV/Assets/LockScreenLogo.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/StreamerPV/Assets/SplashScreen.scale-200.png b/Tools/StreamerPV/Assets/SplashScreen.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/StreamerPV/Assets/Square150x150Logo.scale-200.png b/Tools/StreamerPV/Assets/Square150x150Logo.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/StreamerPV/Assets/Square44x44Logo.scale-200.png b/Tools/StreamerPV/Assets/Square44x44Logo.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/StreamerPV/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/Tools/StreamerPV/Assets/Square44x44Logo.targetsize-24_altform-unplated.png
old mode 100644
new mode 100755
diff --git a/Tools/StreamerPV/Assets/StoreLogo.png b/Tools/StreamerPV/Assets/StoreLogo.png
old mode 100644
new mode 100755
diff --git a/Tools/StreamerPV/Assets/Wide310x150Logo.scale-200.png b/Tools/StreamerPV/Assets/Wide310x150Logo.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/StreamerPV/Package.appxmanifest b/Tools/StreamerPV/Package.appxmanifest
old mode 100644
new mode 100755
diff --git a/Tools/StreamerPV/README.md b/Tools/StreamerPV/README.md
old mode 100644
new mode 100755
diff --git a/Tools/StreamerPV/StreamerPV.vcxproj b/Tools/StreamerPV/StreamerPV.vcxproj
old mode 100644
new mode 100755
diff --git a/Tools/StreamerPV/StreamerPV.vcxproj.filters b/Tools/StreamerPV/StreamerPV.vcxproj.filters
old mode 100644
new mode 100755
diff --git a/Tools/StreamerPV/packages.config b/Tools/StreamerPV/packages.config
old mode 100644
new mode 100755
diff --git a/Tools/StreamerPV/pch.cpp b/Tools/StreamerPV/pch.cpp
old mode 100644
new mode 100755
diff --git a/Tools/StreamerPV/pch.h b/Tools/StreamerPV/pch.h
old mode 100644
new mode 100755
diff --git a/Tools/StreamerVLC/AppMain.cpp b/Tools/StreamerVLC/AppMain.cpp
old mode 100644
new mode 100755
index f2f4777..80bb53f
--- a/Tools/StreamerVLC/AppMain.cpp
+++ b/Tools/StreamerVLC/AppMain.cpp
@@ -22,76 +22,166 @@ using namespace Windows::Graphics::Holographic;
using namespace Windows::Perception::Spatial;
using namespace Windows::UI::Input::Spatial;
using namespace std::placeholders;
+using namespace Windows::ApplicationModel::Background;
+using namespace Windows::UI::Core;
+using namespace Tasks;
namespace StreamerVLC
{
- // Loads and initializes application assets when the application is loaded.
- AppMain::AppMain(const std::shared_ptr& deviceResources)
- : Holographic::AppMainBase(deviceResources)
- , _selectedHoloLensMediaFrameSourceGroupType(
- HoloLensForCV::MediaFrameSourceGroupType::HoloLensResearchModeSensors)
- , _holoLensMediaFrameSourceGroupStarted(false)
- {
- }
-
- void AppMain::OnHolographicSpaceChanged(
- Windows::Graphics::Holographic::HolographicSpace^ holographicSpace)
- {
- //
- // Initialize the camera preview hologram.
- //
- _slateRenderer =
- std::make_unique(
- _deviceResources);
-
- //
- // Initialize the HoloLens media frame readers
- //
- StartHoloLensMediaFrameSourceGroup();
- }
-
- void AppMain::OnSpatialInput(
- _In_ Windows::UI::Input::Spatial::SpatialInteractionSourceState^ pointerState)
- {
- Windows::Perception::Spatial::SpatialCoordinateSystem^ currentCoordinateSystem =
- _spatialPerception->GetOriginFrameOfReference()->CoordinateSystem;
-
- // When a Pressed gesture is detected, the sample hologram will be repositioned
- // two meters in front of the user.
- _slateRenderer->PositionHologram(
- pointerState->TryGetPointerPose(currentCoordinateSystem));
- }
-
- // Updates the application state once per frame.
- void AppMain::OnUpdate(
- _In_ Windows::Graphics::Holographic::HolographicFrame^ holographicFrame,
- _In_ const Graphics::StepTimer& stepTimer)
- {
- dbg::TimerGuard timerGuard(
- L"AppMain::OnUpdate",
- 30.0 /* minimum_time_elapsed_in_milliseconds */);
+ void AppMain::InitializeBackgroundStreamer() { // Refer to Windows Universal Samples for UWP apps, segment on Background Tasks
+
+ Platform::String^ TaskName = "BackgroundTask";
+
+ //auto task =
+ BackgroundExecutionManager::RequestAccessAsync();
+
+ auto iter = BackgroundTaskRegistration::AllTasks->First();
+ auto hascur = iter->HasCurrent;
+
+ while (hascur) {
+ auto cur = iter->Current->Value;
+ if (cur->Name == TaskName) {
+ taskRegistered = true;
+ dbg::trace(L"Background Task already still registered!");
+ break;
+ }
+
+ hascur = iter->MoveNext();
+ }
+ if (taskRegistered) {
+
+ //
+ // Loop through all ungrouped background tasks and unregister any with the name passed into this function.
+ //
+ for (auto pair : BackgroundTaskRegistration::AllTasks)
+ {
+ auto task = pair->Value;
+ if (task->Name == TaskName)
+ {
+ task->Unregister(true);
+ }
+ }
+
+ dbg::trace(L"Background Task deregistered!");
+ taskRegistered = false;
+
+ }
+
+ else if (!taskRegistered) {
+ auto builder = ref new BackgroundTaskBuilder();
+
+ builder->Name = TaskName;
+ builder->TaskEntryPoint = "Tasks.BackgroundTask";
+
+ ApplicationTrigger^ trigger = ref new ApplicationTrigger();
+ builder->SetTrigger(trigger);
+
+ BackgroundTaskRegistration^ task = builder->Register();
+ dbg::trace(L"Task registered!");
+
+ concurrency::create_task(trigger->RequestAsync()).then([this, trigger](concurrency::task applicationTriggerTask) {
+
+ ApplicationTriggerResult result = applicationTriggerTask.get();
+ auto res = "App Trigger Result = " + result.ToString();
+ dbg::trace(L"Task triggered!");
+ dbg::trace(result.ToString()->Data());
+ });
+
+
+ }
+
+ }
+ /*
+ void AppMain::OnProgress(BackgroundTaskRegistration^ task, BackgroundTaskProgressEventArgs^ args)
+ {
+ // Dispatcher->RunAsync(CoreDispatcherPriority::Normal, ref new DispatchedHandler([this, args]()
+ //{
+ //auto progress = "Progress: " + args->Progress + "%";
+ //BackgroundTaskSample::SampleBackgroundTaskProgress = progress;
+ //UpdateUI();
+ //}));
+ }
+
+ void AppMain::OnCompleted(BackgroundTaskRegistration^ task, BackgroundTaskCompletedEventArgs^ args) {
+
+ }
+ */
+
+ // Loads and initializes application assets when the application is loaded.
+ AppMain::AppMain(const std::shared_ptr& deviceResources)
+ : Holographic::AppMainBase(deviceResources)
+ , _selectedHoloLensMediaFrameSourceGroupType(
+ HoloLensForCV::MediaFrameSourceGroupType::HoloLensResearchModeSensors)
+ , _holoLensMediaFrameSourceGroupStarted(false)
+ {
+
+ taskRegistered = false;
+
+ }
+
+
+ void AppMain::OnHolographicSpaceChanged(
+ Windows::Graphics::Holographic::HolographicSpace^ holographicSpace)
+ {
+ //
+ // Initialize the camera preview hologram.
+ //
+ _slateRenderer =
+ std::make_unique(
+ _deviceResources);
+
+ InitializeBackgroundStreamer();
+
+ // Initialize the HoloLens media frame readers, here, for using SensorStreamingServer
+ //
+ //StartHoloLensMediaFrameSourceGroup();
+
+
+ }
+
+ void AppMain::OnSpatialInput(
+ _In_ Windows::UI::Input::Spatial::SpatialInteractionSourceState^ pointerState)
+ {
+ Windows::Perception::Spatial::SpatialCoordinateSystem^ currentCoordinateSystem =
+ _spatialPerception->GetOriginFrameOfReference()->CoordinateSystem;
+
+ // When a Pressed gesture is detected, the sample hologram will be repositioned
+ // two meters in front of the user.
+ //_slateRenderer->PositionHologram(
+ //pointerState->TryGetPointerPose(currentCoordinateSystem));
+ }
+
+ // Updates the application state once per frame.
+ void AppMain::OnUpdate(
+ _In_ Windows::Graphics::Holographic::HolographicFrame^ holographicFrame,
+ _In_ const Graphics::StepTimer& stepTimer)
+ {
+ dbg::TimerGuard timerGuard(
+ L"AppMain::OnUpdate",
+ 30.0 /* minimum_time_elapsed_in_milliseconds */);
+
HoloLensForCV::SensorType renderSensorType = HoloLensForCV::SensorType::VisibleLightLeftFront;
- //
- // Update scene objects.
- //
- // Put time-based updates here. By default this code will run once per frame,
- // but if you change the StepTimer to use a fixed time step this code will
- // run as many times as needed to get to the current step.
- //
- _slateRenderer->Update(
- stepTimer);
-
- if (!_holoLensMediaFrameSourceGroupStarted)
- {
- return;
- }
-
- HoloLensForCV::SensorFrame^ latestCameraPreviewFrame;
- Windows::Graphics::Imaging::BitmapPixelFormat cameraPreviewExpectedBitmapPixelFormat;
- DXGI_FORMAT cameraPreviewTextureFormat;
- int32_t cameraPreviewPixelStride;
+ //
+ // Update scene objects.
+ //
+ // Put time-based updates here. By default this code will run once per frame,
+ // but if you change the StepTimer to use a fixed time step this code will
+ // run as many times as needed to get to the current step.
+ //
+ _slateRenderer->Update(
+ stepTimer);
+
+ if (!_holoLensMediaFrameSourceGroupStarted)
+ {
+ return;
+ }
+
+ HoloLensForCV::SensorFrame^ latestCameraPreviewFrame;
+ Windows::Graphics::Imaging::BitmapPixelFormat cameraPreviewExpectedBitmapPixelFormat;
+ DXGI_FORMAT cameraPreviewTextureFormat;
+ int32_t cameraPreviewPixelStride;
{
latestCameraPreviewFrame =
@@ -125,116 +215,120 @@ namespace StreamerVLC
}
}
- if (nullptr == latestCameraPreviewFrame)
- {
- return;
- }
+ if (nullptr == latestCameraPreviewFrame)
+ {
+ return;
+ }
- if (_cameraPreviewTimestamp.UniversalTime == latestCameraPreviewFrame->Timestamp.UniversalTime)
- {
- return;
- }
+ if (_cameraPreviewTimestamp.UniversalTime == latestCameraPreviewFrame->Timestamp.UniversalTime)
+ {
+ return;
+ }
- _cameraPreviewTimestamp = latestCameraPreviewFrame->Timestamp;
+ _cameraPreviewTimestamp = latestCameraPreviewFrame->Timestamp;
- if (nullptr == _cameraPreviewTexture)
- {
+ if (nullptr == _cameraPreviewTexture)
+ {
#if 0
- dbg::trace(
- L"latestCameraPreviewFrame->SoftwareBitmap->PixelWidth=0x%08x, latestCameraPreviewFrame->SoftwareBitmap->PixelHeight=0x%08x",
- latestCameraPreviewFrame->SoftwareBitmap->PixelWidth, latestCameraPreviewFrame->SoftwareBitmap->PixelHeight);
+ dbg::trace(
+ L"latestCameraPreviewFrame->SoftwareBitmap->PixelWidth=0x%08x, latestCameraPreviewFrame->SoftwareBitmap->PixelHeight=0x%08x",
+ latestCameraPreviewFrame->SoftwareBitmap->PixelWidth, latestCameraPreviewFrame->SoftwareBitmap->PixelHeight);
#endif
- _cameraPreviewTexture =
- std::make_shared(
- _deviceResources,
- latestCameraPreviewFrame->SoftwareBitmap->PixelWidth,
- latestCameraPreviewFrame->SoftwareBitmap->PixelHeight,
- cameraPreviewTextureFormat);
- }
+ _cameraPreviewTexture =
+ std::make_shared(
+ _deviceResources,
+ latestCameraPreviewFrame->SoftwareBitmap->PixelWidth,
+ latestCameraPreviewFrame->SoftwareBitmap->PixelHeight,
+ cameraPreviewTextureFormat);
+ }
- {
- void* mappedTexture =
- _cameraPreviewTexture->MapCPUTexture(
- D3D11_MAP_WRITE /* mapType */);
+ {
+ void* mappedTexture =
+ _cameraPreviewTexture->MapCPUTexture(
+ D3D11_MAP_WRITE /* mapType */);
- Windows::Graphics::Imaging::SoftwareBitmap^ bitmap =
- latestCameraPreviewFrame->SoftwareBitmap;
+ Windows::Graphics::Imaging::SoftwareBitmap^ bitmap =
+ latestCameraPreviewFrame->SoftwareBitmap;
#if 0
- dbg::trace(
- L"cameraPreviewExpectedBitmapPixelFormat=0x%08x, bitmap->BitmapPixelFormat=0x%08x",
- cameraPreviewExpectedBitmapPixelFormat, bitmap->BitmapPixelFormat);
+ dbg::trace(
+ L"cameraPreviewExpectedBitmapPixelFormat=0x%08x, bitmap->BitmapPixelFormat=0x%08x",
+ cameraPreviewExpectedBitmapPixelFormat, bitmap->BitmapPixelFormat);
#endif
- REQUIRES(cameraPreviewExpectedBitmapPixelFormat == bitmap->BitmapPixelFormat);
+ REQUIRES(cameraPreviewExpectedBitmapPixelFormat == bitmap->BitmapPixelFormat);
- Windows::Graphics::Imaging::BitmapBuffer^ bitmapBuffer =
- bitmap->LockBuffer(
- Windows::Graphics::Imaging::BitmapBufferAccessMode::Read);
+ Windows::Graphics::Imaging::BitmapBuffer^ bitmapBuffer =
+ bitmap->LockBuffer(
+ Windows::Graphics::Imaging::BitmapBufferAccessMode::Read);
- uint32_t pixelBufferDataLength = 0;
+ uint32_t pixelBufferDataLength = 0;
- uint8_t* pixelBufferData =
- Io::GetTypedPointerToMemoryBuffer(
- bitmapBuffer->CreateReference(),
- pixelBufferDataLength);
+ uint8_t* pixelBufferData =
+ Io::GetTypedPointerToMemoryBuffer(
+ bitmapBuffer->CreateReference(),
+ pixelBufferDataLength);
- const int32_t bytesToCopy =
- _cameraPreviewTexture->GetWidth() * _cameraPreviewTexture->GetHeight() * cameraPreviewPixelStride;
+ const int32_t bytesToCopy =
+ _cameraPreviewTexture->GetWidth() * _cameraPreviewTexture->GetHeight() * cameraPreviewPixelStride;
- ASSERT(static_cast(bytesToCopy) == pixelBufferDataLength);
+ ASSERT(static_cast(bytesToCopy) == pixelBufferDataLength);
- ASSERT(0 == memcpy_s(
- mappedTexture,
- bytesToCopy,
- pixelBufferData,
- pixelBufferDataLength));
+ ASSERT(0 == memcpy_s(
+ mappedTexture,
+ bytesToCopy,
+ pixelBufferData,
+ pixelBufferDataLength));
- _cameraPreviewTexture->UnmapCPUTexture();
- }
+ _cameraPreviewTexture->UnmapCPUTexture();
+ }
+
+ _cameraPreviewTexture->CopyCPU2GPU();
- _cameraPreviewTexture->CopyCPU2GPU();
- }
+
+ }
- void AppMain::OnPreRender()
- {
- }
+ void AppMain::OnPreRender()
+ {
+ }
- // Renders the current frame to each holographic camera, according to the
- // current application and spatial positioning state.
- void AppMain::OnRender()
- {
- // Draw the sample hologram.
- _slateRenderer->Render(
- _cameraPreviewTexture);
- }
+ // Renders the current frame to each holographic camera, according to the
+ // current application and spatial positioning state.
+ void AppMain::OnRender()
+ {
+ // Draw the sample hologram.
+ //_slateRenderer->Render(
+ //_cameraPreviewTexture);
+ }
- // Notifies classes that use Direct3D device resources that the device resources
- // need to be released before this method returns.
- void AppMain::OnDeviceLost()
- {
- _slateRenderer->ReleaseDeviceDependentResources();
+ // Notifies classes that use Direct3D device resources that the device resources
+ // need to be released before this method returns.
+ void AppMain::OnDeviceLost()
+ {
+ //_slateRenderer->ReleaseDeviceDependentResources();
- _holoLensMediaFrameSourceGroup = nullptr;
- _holoLensMediaFrameSourceGroupStarted = false;
+ //_holoLensMediaFrameSourceGroup = nullptr;
+ //_holoLensMediaFrameSourceGroupStarted = false;
- _cameraPreviewTexture.reset();
- }
+ //_cameraPreviewTexture.reset();
+ }
- // Notifies classes that use Direct3D device resources that the device resources
- // may now be recreated.
- void AppMain::OnDeviceRestored()
- {
- _slateRenderer->CreateDeviceDependentResources();
+ // Notifies classes that use Direct3D device resources that the device resources
+ // may now be recreated.
+ void AppMain::OnDeviceRestored()
+ {
+ //_slateRenderer->CreateDeviceDependentResources();
- StartHoloLensMediaFrameSourceGroup();
- }
+ //StartHoloLensMediaFrameSourceGroup();
+
+ //InitializeBackgroundStreamer();
+ }
// Called when the application is suspending.
void AppMain::SaveAppState()
{
- if (_holoLensMediaFrameSourceGroup == nullptr)
+ /*if (_holoLensMediaFrameSourceGroup == nullptr)
return;
concurrency::create_task(_holoLensMediaFrameSourceGroup->StopAsync()).then(
@@ -246,63 +340,64 @@ namespace StreamerVLC
delete _sensorFrameStreamer;
_sensorFrameStreamer = nullptr;
+ delete _multiFrameBuffer;
+ _multiFrameBuffer = nullptr;
+
+
}).wait();
+ */
+ //InitializeBackgroundStreamer();
+
}
// Called when the application is resuming.
void AppMain::LoadAppState()
{
- StartHoloLensMediaFrameSourceGroup();
+
+ //InitializeBackgroundStreamer();
+ //StartHoloLensMediaFrameSourceGroup();
+
+ }
+
+ void AppMain::StartHoloLensMediaFrameSourceGroup()
+ {
+ std::vector enabledSensorTypes;
+
+ //
+ // Enabling all of the Research Mode sensors at the same time can be quite expensive
+ // performance-wise. It's best to scope down the list of enabled sensors to just those
+ // that are required for a given task. In this example, we will select the visible
+ // light cameras.
+ //
+
+ enabledSensorTypes.emplace_back(
+ HoloLensForCV::SensorType::VisibleLightLeftFront);
+
+ enabledSensorTypes.emplace_back(
+ HoloLensForCV::SensorType::VisibleLightRightFront);
+
+ _multiFrameBuffer =
+ ref new HoloLensForCV::MultiFrameBuffer();
+
+
+ _holoLensMediaFrameSourceGroup =
+ ref new HoloLensForCV::MediaFrameSourceGroup(
+ _selectedHoloLensMediaFrameSourceGroupType,
+ _spatialPerception,
+ _multiFrameBuffer);
+
+ for (const auto enabledSensorType : enabledSensorTypes)
+ {
+ _holoLensMediaFrameSourceGroup->Enable(
+ enabledSensorType);
+ }
+
+ concurrency::create_task(_holoLensMediaFrameSourceGroup->StartAsync()).then(
+ [&]()
+ {
+ _holoLensMediaFrameSourceGroupStarted = true;
+ });
}
- void AppMain::StartHoloLensMediaFrameSourceGroup()
- {
- std::vector enabledSensorTypes;
-
- //
- // Enabling all of the Research Mode sensors at the same time can be quite expensive
- // performance-wise. It's best to scope down the list of enabled sensors to just those
- // that are required for a given task. In this example, we will select the visible
- // light cameras.
- //
- enabledSensorTypes.emplace_back(
- HoloLensForCV::SensorType::VisibleLightLeftLeft);
-
- enabledSensorTypes.emplace_back(
- HoloLensForCV::SensorType::VisibleLightLeftFront);
-
- enabledSensorTypes.emplace_back(
- HoloLensForCV::SensorType::VisibleLightRightFront);
-
- enabledSensorTypes.emplace_back(
- HoloLensForCV::SensorType::VisibleLightRightRight);
-
- _sensorFrameStreamer =
- ref new HoloLensForCV::SensorFrameStreamer();
-
- for (const auto enabledSensorType : enabledSensorTypes)
- {
- _sensorFrameStreamer->Enable(
- enabledSensorType);
- }
-
- _holoLensMediaFrameSourceGroup =
- ref new HoloLensForCV::MediaFrameSourceGroup(
- _selectedHoloLensMediaFrameSourceGroupType,
- _spatialPerception,
- _sensorFrameStreamer);
-
- for (const auto enabledSensorType : enabledSensorTypes)
- {
- _holoLensMediaFrameSourceGroup->Enable(
- enabledSensorType);
- }
-
- concurrency::create_task(_holoLensMediaFrameSourceGroup->StartAsync()).then(
- [&]()
- {
- _holoLensMediaFrameSourceGroupStarted = true;
- });
- }
}
diff --git a/Tools/StreamerVLC/AppMain.h b/Tools/StreamerVLC/AppMain.h
old mode 100644
new mode 100755
index d37ee07..acf4450
--- a/Tools/StreamerVLC/AppMain.h
+++ b/Tools/StreamerVLC/AppMain.h
@@ -10,55 +10,87 @@
//*********************************************************
#pragma once
+#include
+
+//using namespace Platform;
+using namespace Windows::ApplicationModel::Background;
+using namespace Windows::Storage;
+
namespace StreamerVLC
{
- class AppMain : public Holographic::AppMainBase
- {
- public:
- AppMain(
- const std::shared_ptr& deviceResources);
- // IDeviceNotify
- virtual void OnDeviceLost() override;
+ class AppMain : public Holographic::AppMainBase
+ {
+ public:
+ AppMain(
+ const std::shared_ptr& deviceResources);
- virtual void OnDeviceRestored() override;
+ // IDeviceNotify
+ virtual void OnDeviceLost() override;
- // IAppMain
- virtual void OnHolographicSpaceChanged(
- _In_ Windows::Graphics::Holographic::HolographicSpace^ holographicSpace) override;
+ virtual void OnDeviceRestored() override;
- virtual void OnSpatialInput(
- _In_ Windows::UI::Input::Spatial::SpatialInteractionSourceState^ pointerState) override;
+ // IAppMain
+ virtual void OnHolographicSpaceChanged(
+ _In_ Windows::Graphics::Holographic::HolographicSpace^ holographicSpace) override;
- virtual void OnUpdate(
- _In_ Windows::Graphics::Holographic::HolographicFrame^ holographicFrame,
- _In_ const Graphics::StepTimer& stepTimer) override;
+ virtual void OnSpatialInput(
+ _In_ Windows::UI::Input::Spatial::SpatialInteractionSourceState^ pointerState) override;
- virtual void OnPreRender() override;
+ virtual void OnUpdate(
+ _In_ Windows::Graphics::Holographic::HolographicFrame^ holographicFrame,
+ _In_ const Graphics::StepTimer& stepTimer) override;
- virtual void OnRender() override;
+ virtual void OnPreRender() override;
+
+ virtual void OnRender() override;
virtual void LoadAppState() override;
virtual void SaveAppState() override;
- private:
- // Initializes access to HoloLens sensors.
- void StartHoloLensMediaFrameSourceGroup();
+ Windows::ApplicationModel::Background::ApplicationTrigger^ _appTrigger;
+ /*
+ static void UpdateBackgroundTaskRegistrationStatus(String^ name, bool registered);
+ static String^ ApplicationTriggerTaskProgress;
+ static bool ApplicationTriggerTaskRegistered;
+ static String^ ApplicationTriggerTaskResult;
+
+ void AttachProgressAndCompletedHandlers(IBackgroundTaskRegistration^ task);
+ */
+ private:
+
+ // Initializes access to HoloLens sensors.
+ //void StartHoloLensMediaFrameSourceGroup();
+
+
+ // Selected HoloLens media frame source group
+ void StartHoloLensMediaFrameSourceGroup();
+ HoloLensForCV::MediaFrameSourceGroupType _selectedHoloLensMediaFrameSourceGroupType;
+ HoloLensForCV::MediaFrameSourceGroup^ _holoLensMediaFrameSourceGroup;
+ bool _holoLensMediaFrameSourceGroupStarted;
+
+ // HoloLens media frame server manager
+ HoloLensForCV::SensorFrameStreamer^ _sensorFrameStreamer;
+ HoloLensForCV::MultiFrameBuffer^ _multiFrameBuffer;
- private:
- // Selected HoloLens media frame source group
- HoloLensForCV::MediaFrameSourceGroupType _selectedHoloLensMediaFrameSourceGroupType;
- HoloLensForCV::MediaFrameSourceGroup^ _holoLensMediaFrameSourceGroup;
- bool _holoLensMediaFrameSourceGroupStarted;
+ // Camera preview
+ std::unique_ptr _slateRenderer;
+ Rendering::Texture2DPtr _cameraPreviewTexture;
+ Windows::Foundation::DateTime _cameraPreviewTimestamp;
- // HoloLens media frame server manager
- HoloLensForCV::SensorFrameStreamer^ _sensorFrameStreamer;
+ boolean taskRegistered;
- // Camera preview
- std::unique_ptr _slateRenderer;
- Rendering::Texture2DPtr _cameraPreviewTexture;
- Windows::Foundation::DateTime _cameraPreviewTimestamp;
- };
+ void InitializeBackgroundStreamer();
+
+ //BackgroundTaskRegistration^ RegisterBackgroundTask(String^ taskEntryPoint, String^ name, IBackgroundTrigger^ trigger, IBackgroundCondition^ condition, BackgroundTaskRegistrationGroup^ group);
+ //void AttachProgressAndCompletedHandlers(Windows::ApplicationModel::Background::IBackgroundTaskRegistration^ task);
+ //void RegisterBackgroundTask(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
+ //void UnregisterBackgroundTask(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
+ //void OnProgress(Windows::ApplicationModel::Background::BackgroundTaskRegistration^ task, Windows::ApplicationModel::Background::BackgroundTaskProgressEventArgs^ args);
+ //void OnCompleted(Windows::ApplicationModel::Background::BackgroundTaskRegistration^ task, Windows::ApplicationModel::Background::BackgroundTaskCompletedEventArgs^ args);
+ //void UpdateUI();
+
+ };
}
diff --git a/Tools/StreamerVLC/AppView.cpp b/Tools/StreamerVLC/AppView.cpp
old mode 100644
new mode 100755
diff --git a/Tools/StreamerVLC/AppView.h b/Tools/StreamerVLC/AppView.h
old mode 100644
new mode 100755
diff --git a/Tools/StreamerVLC/Assets/LockScreenLogo.scale-200.png b/Tools/StreamerVLC/Assets/LockScreenLogo.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/StreamerVLC/Assets/SplashScreen.scale-200.png b/Tools/StreamerVLC/Assets/SplashScreen.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/StreamerVLC/Assets/Square150x150Logo.scale-200.png b/Tools/StreamerVLC/Assets/Square150x150Logo.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/StreamerVLC/Assets/Square44x44Logo.scale-200.png b/Tools/StreamerVLC/Assets/Square44x44Logo.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/StreamerVLC/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/Tools/StreamerVLC/Assets/Square44x44Logo.targetsize-24_altform-unplated.png
old mode 100644
new mode 100755
diff --git a/Tools/StreamerVLC/Assets/StoreLogo.png b/Tools/StreamerVLC/Assets/StoreLogo.png
old mode 100644
new mode 100755
diff --git a/Tools/StreamerVLC/Assets/Wide310x150Logo.scale-200.png b/Tools/StreamerVLC/Assets/Wide310x150Logo.scale-200.png
old mode 100644
new mode 100755
diff --git a/Tools/StreamerVLC/Package.appxmanifest b/Tools/StreamerVLC/Package.appxmanifest
old mode 100644
new mode 100755
index 23abe9d..6042b35
--- a/Tools/StreamerVLC/Package.appxmanifest
+++ b/Tools/StreamerVLC/Package.appxmanifest
@@ -1,10 +1,9 @@
-
+
@@ -25,12 +24,24 @@
+
+
+
+
+
+
+
+
+
+
+
-
+
+
-
+
\ No newline at end of file
diff --git a/Tools/StreamerVLC/README.md b/Tools/StreamerVLC/README.md
old mode 100644
new mode 100755
diff --git a/Tools/StreamerVLC/StreamerVLC.vcxproj b/Tools/StreamerVLC/StreamerVLC.vcxproj
old mode 100644
new mode 100755
index 045c35e..6db5417
--- a/Tools/StreamerVLC/StreamerVLC.vcxproj
+++ b/Tools/StreamerVLC/StreamerVLC.vcxproj
@@ -82,7 +82,7 @@
d2d1.lib; d3d11.lib; dxgi.lib; dwrite.lib; windowscodecs.lib; %(AdditionalDependencies);
- %(AdditionalLibraryDirectories); $(VCInstallDir)\lib\store; $(VCInstallDir)\lib
+ %(AdditionalLibraryDirectories);$(VCInstallDir)\lib\store;$(VCInstallDir)\lib
mincore.lib;kernel32.lib;ole32.lib;%(IgnoreSpecificDefaultLibraries)
@@ -143,6 +143,9 @@
{421bb462-74f2-4831-9ab7-06b77e0a98b4}
+
+ {b4dd17ec-eef8-41fc-8bdc-3c8652db68e1}
+
diff --git a/Tools/StreamerVLC/StreamerVLC.vcxproj.filters b/Tools/StreamerVLC/StreamerVLC.vcxproj.filters
old mode 100644
new mode 100755
diff --git a/Tools/StreamerVLC/packages.config b/Tools/StreamerVLC/packages.config
old mode 100644
new mode 100755
diff --git a/Tools/StreamerVLC/pch.cpp b/Tools/StreamerVLC/pch.cpp
old mode 100644
new mode 100755
diff --git a/Tools/StreamerVLC/pch.h b/Tools/StreamerVLC/pch.h
old mode 100644
new mode 100755
diff --git a/Tools/Tasks/BackgroundTask.cpp b/Tools/Tasks/BackgroundTask.cpp
new file mode 100755
index 0000000..8ac167a
--- /dev/null
+++ b/Tools/Tasks/BackgroundTask.cpp
@@ -0,0 +1,1261 @@
+#include "pch.h"
+#include "BackgroundTask.h"
+
+#include
+#include
+#include
+
+using namespace Tasks;
+using namespace dbg;
+using namespace concurrency;
+using namespace Platform;
+using namespace Windows::Foundation;
+using namespace Windows::Foundation::Collections;
+using namespace Windows::Networking::Sockets;
+using namespace Windows::Security::Cryptography::Certificates;
+using namespace Windows::Storage::Streams;
+using namespace Windows::UI::Core;
+using namespace Windows::UI::Xaml;
+using namespace Windows::UI::Xaml::Controls;
+using namespace Windows::UI::Xaml::Navigation;
+using namespace Windows::Web;
+using namespace Windows::Data::Json;
+using namespace Windows::Security::Cryptography;
+using namespace Windows::Globalization::DateTimeFormatting;
+
+
+namespace Tasks {
+static int count = 0;
+static long long s_previousTimestamp = 0;
+static int id;
+static int pubCount;
+static bool connected = false;
+
+static const std::string base64_chars =
+"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+"abcdefghijklmnopqrstuvwxyz"
+"0123456789+/";
+
+static const Platform::String^ base64_charsp =
+"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+"abcdefghijklmnopqrstuvwxyz"
+"0123456789+/";
+
+
+static inline bool is_base64(unsigned char c) {
+ return (isalnum(c) || (c == '+') || (c == '/'));
+}
+
+
+void BackgroundTask::Run(IBackgroundTaskInstance^ taskInstance) {
+
+
+ dbg::trace(L"Background Task::Run called");
+
+ id = 0;
+ pubCount = 0;
+ _selectedHoloLensMediaFrameSourceGroupType = HoloLensForCV::MediaFrameSourceGroupType::HoloLensResearchModeSensors;
+ _holoLensMediaFrameSourceGroupStarted = false;
+ keepRunning = true;
+ auto cost = BackgroundWorkCost::CurrentBackgroundWorkCost;
+ auto settings = ApplicationData::Current->LocalSettings;
+ settings->Values->Insert("BackgroundWorkCost", cost.ToString());
+ pairingInProgress = false;
+ taskInstance->Canceled += ref new BackgroundTaskCanceledEventHandler(this, &BackgroundTask::OnCanceled);
+
+
+ TaskDeferral = taskInstance->GetDeferral();
+ TaskInstance = taskInstance;
+
+ Connect();
+
+ inProcess = false;
+
+ while (keepRunning) {
+
+ if (!_holoLensMediaFrameSourceGroupStarted) {
+ if (!inProcess) {
+
+ StartHoloLensMediaFrameSourceGroup();
+
+ }
+ }
+
+ else if (_holoLensMediaFrameSourceGroupStarted && !pairingInProgress) {
+
+ concurrency::create_task(BackgroundTask::RunAsync()).then([&]() {
+
+ pairingInProgress = false;
+ count++;
+
+ });
+ }
+ }
+
+ //TO-DO, send an output indicating that the bg task is closing
+
+ dbg::trace(L"Background Task Completed.");
+
+ TaskDeferral->Complete();
+
+}
+
+
+void BackgroundTask::StartHoloLensMediaFrameSourceGroup()
+{
+ std::vector enabledSensorTypes;
+ inProcess = true;
+ //
+ // Enabling all of the Research Mode sensors at the same time can be quite expensive
+ // performance-wise. It's best to scope down the list of enabled sensors to just those
+ // that are required for a given task.
+
+ //In this example, selected: the visible light front cameras.
+
+
+ enabledSensorTypes.emplace_back(
+ HoloLensForCV::SensorType::VisibleLightLeftFront);
+
+ enabledSensorTypes.emplace_back(
+ HoloLensForCV::SensorType::VisibleLightRightFront);
+
+ _multiFrameBuffer =
+ ref new HoloLensForCV::MultiFrameBuffer();
+
+ _spatialPerception = ref new HoloLensForCV::SpatialPerception();
+
+ _holoLensMediaFrameSourceGroup =
+ ref new HoloLensForCV::MediaFrameSourceGroup(
+ _selectedHoloLensMediaFrameSourceGroupType,
+ _spatialPerception,
+ _multiFrameBuffer);
+
+ for (const auto enabledSensorType : enabledSensorTypes)
+ {
+ _holoLensMediaFrameSourceGroup->Enable(
+ enabledSensorType);
+ }
+ dbg::trace(L"calling startasync for mediaframesourcegroup");
+ concurrency::create_task(_holoLensMediaFrameSourceGroup->StartAsync()).then(
+ [&]()
+ {
+ dbg::trace(L"media frame source group started.");
+ inProcess = false;
+ _holoLensMediaFrameSourceGroupStarted = true;
+
+
+ leftCameraIntrinsics = _holoLensMediaFrameSourceGroup->GetCameraIntrinsics(HoloLensForCV::SensorType::VisibleLightLeftFront);
+ rightCameraIntrinsics = _holoLensMediaFrameSourceGroup->GetCameraIntrinsics(HoloLensForCV::SensorType::VisibleLightRightFront);
+
+ if (leftCameraIntrinsics == nullptr) {
+
+ dbg::trace(L"Camera Intrinsics nullptr."); //Not calibrated
+ }
+ });
+}
+
+Windows::Foundation::IAsyncAction^ BackgroundTask::RunAsync() {
+
+ return concurrency::create_async(
+ [this]()
+ {
+
+ return StreamAsync();
+ });
+
+}
+
+
+concurrency::task BackgroundTask::StreamAsync() {
+
+ //dbg::trace(L"Background Task::StreamAsync called");
+
+ Concurrency::task streamTask =
+ Concurrency::task_from_result();
+
+ pairingInProgress = true;
+ const float c_timestampTolerance = 0.001f;
+
+ auto commonTime = _multiFrameBuffer->GetTimestampForSensorPair(
+ HoloLensForCV::SensorType::VisibleLightLeftFront,
+ HoloLensForCV::SensorType::VisibleLightRightFront,
+ c_timestampTolerance);
+
+ if (_multiFrameBuffer->GetFrameForTime(HoloLensForCV::SensorType::VisibleLightLeftFront,
+ commonTime,
+ c_timestampTolerance) == nullptr || _multiFrameBuffer->GetFrameForTime(HoloLensForCV::SensorType::VisibleLightRightFront,
+ commonTime,
+ c_timestampTolerance) == nullptr ) {
+ dbg::trace(L"a frame nullptr!");
+ return streamTask;
+ }
+ else {
+ HoloLensForCV::SensorFrame^ leftFrame;
+ HoloLensForCV::SensorFrame^ rightFrame;
+ try {
+ leftFrame = _multiFrameBuffer->GetFrameForTime(
+ HoloLensForCV::SensorType::VisibleLightLeftFront,
+ commonTime,
+ c_timestampTolerance);
+
+ rightFrame = _multiFrameBuffer->GetFrameForTime(
+ HoloLensForCV::SensorType::VisibleLightRightFront,
+ commonTime,
+ c_timestampTolerance);
+
+ if (leftFrame == nullptr || rightFrame == nullptr) {
+ return streamTask;
+ }
+ /*} catch (Exception^ f) {
+
+ dbg::trace(L"StreamAsync: Exception!");
+ delete leftFrame;
+ delete rightFrame;
+
+ return streamTask;
+
+ }*/
+
+ auto timeDiff100ns = leftFrame->Timestamp.UniversalTime - rightFrame->Timestamp.UniversalTime;
+
+ if (std::abs(timeDiff100ns * 1e-7f) > 2e-3f)
+ {
+ dbg::trace(L"StreamAsync: times are different by %f seconds", std::abs(timeDiff100ns * 1e-7f));
+
+ }
+
+
+ if (commonTime.UniversalTime == s_previousTimestamp)
+ {
+ //dbg::trace(L"StreamAsync: timestamp did not change");
+ return streamTask;
+ }
+
+ s_previousTimestamp = commonTime.UniversalTime;
+ //code to retrieve Array^ needs to be cleaned
+ auto outPair = std::make_pair(leftFrame, rightFrame);
+ std::pair leftData = sensorFrameToImageBufferPair(outPair.first);
+ std::pair rightData = sensorFrameToImageBufferPair(outPair.second);
+ Platform::Array^ imageBufferAsPlatformArrayLeft;
+ Platform::Array^ imageBufferAsPlatformArrayRight;
+
+ imageBufferAsPlatformArrayLeft =
+ ref new Platform::Array(
+ leftData.first,
+ leftData.second);
+ imageBufferAsPlatformArrayRight =
+ ref new Platform::Array(
+ rightData.first,
+ rightData.second);
+
+
+ dbg::trace(
+ L"BackgroundTask::StreamAsync: %i platform arrays created at %i, size %i",
+ count,
+ outPair.first->Timestamp,
+ imageBufferAsPlatformArrayLeft->Value->Length);
+
+ int i = 300000;
+ dbg::trace(
+ L"BackgroundTask::StreamAsync: data index %i value %i ",
+ i,
+ imageBufferAsPlatformArrayLeft->Value[i]);
+
+
+ Windows::Foundation::Numerics::float4x4 leftTransform = leftFrame->CameraViewTransform;
+ Windows::Foundation::Numerics::float4x4 rightTransform = rightFrame->CameraViewTransform;
+ dbg::trace(L"Left Camera View Transform %i %i %i %i, %i %i %i %i, %i %i %i %i, %i %i %i %i ",
+ leftTransform.m11, leftTransform.m12, leftTransform.m13, leftTransform.m14, leftTransform.m21, leftTransform.m22, leftTransform.m23, leftTransform.m24,
+ leftTransform.m31, leftTransform.m32, leftTransform.m33, leftTransform.m34, leftTransform.m41, leftTransform.m42, leftTransform.m43, leftTransform.m44
+ );
+ dbg::trace(L"Right Camera View Transform %i %i %i %i, %i %i %i %i, %i %i %i %i, %i %i %i %i ",
+ rightTransform.m11, rightTransform.m12, rightTransform.m13, rightTransform.m14, rightTransform.m21, rightTransform.m22, rightTransform.m23, rightTransform.m24,
+ rightTransform.m31, rightTransform.m32, rightTransform.m33, rightTransform.m34, rightTransform.m41, rightTransform.m42, rightTransform.m43, rightTransform.m44
+ );
+
+ auto leftFrameToOrigin = leftFrame->FrameToOrigin;
+ auto rightFrameToOrigin = rightFrame->FrameToOrigin;
+ dbg::trace(L"Left Camera Frame To Origin %i %i %i %i, %i %i %i %i, %i %i %i %i, %i %i %i %i ",
+ leftFrameToOrigin.m11, leftFrameToOrigin.m12, leftFrameToOrigin.m13, leftFrameToOrigin.m14, leftFrameToOrigin.m21, leftFrameToOrigin.m22, leftFrameToOrigin.m23, leftFrameToOrigin.m24,
+ leftFrameToOrigin.m31, leftFrameToOrigin.m32, leftFrameToOrigin.m33, leftFrameToOrigin.m34, leftFrameToOrigin.m41, leftFrameToOrigin.m42, leftFrameToOrigin.m43, leftFrameToOrigin.m44
+ );
+
+ dbg::trace(L"Right Camera Frame To Origin %i %i %i %i, %i %i %i %i, %i %i %i %i, %i %i %i %i ",
+ rightFrameToOrigin.m11, rightFrameToOrigin.m12, rightFrameToOrigin.m13, rightFrameToOrigin.m14, rightFrameToOrigin.m21, rightFrameToOrigin.m22, rightFrameToOrigin.m23, rightFrameToOrigin.m24,
+ rightFrameToOrigin.m31, rightFrameToOrigin.m32, rightFrameToOrigin.m33, rightFrameToOrigin.m34, rightFrameToOrigin.m41, rightFrameToOrigin.m42, rightFrameToOrigin.m43, rightFrameToOrigin.m44
+ );
+
+
+ auto leftPose = GetAbsoluteCameraPose(leftFrame);
+ auto rightPose = GetAbsoluteCameraPose(rightFrame);
+
+ dbg::trace(L"Left Pose %i %i %i %i, %i %i %i %i, %i %i %i %i, %i %i %i %i ",
+ leftPose.m11, leftPose.m12, leftPose.m13, leftPose.m14, leftPose.m21, leftPose.m22, leftPose.m23, leftPose.m24,
+ leftPose.m31, leftPose.m32, leftPose.m33, leftPose.m34, leftPose.m41, leftPose.m42, leftPose.m43, leftPose.m44
+ );
+ dbg::trace(L"Right Pose %i %i %i %i, %i %i %i %i, %i %i %i %i, %i %i %i %i ",
+ rightPose.m11, rightPose.m12, rightPose.m13, rightPose.m14, rightPose.m21, rightPose.m22, rightPose.m23, rightPose.m24,
+ rightPose.m31, rightPose.m32, rightPose.m33, rightPose.m34, rightPose.m41, rightPose.m42, rightPose.m43, rightPose.m44
+ );
+
+ auto leftCamToWorld = GetCamToWorld(leftPose);
+ auto rightCamToWorld = GetCamToWorld(rightPose);
+ Windows::Foundation::Numerics::invert(GetCamToWorld(leftPose), &leftCamToWorld);
+
+ dbg::trace(L"Left CamToWorld %i %i %i %i, %i %i %i %i, %i %i %i %i, %i %i %i %i ",
+ leftCamToWorld.m11, leftCamToWorld.m12, leftCamToWorld.m13, leftCamToWorld.m14, leftCamToWorld.m21, leftCamToWorld.m22, leftCamToWorld.m23, leftCamToWorld.m24,
+ leftCamToWorld.m31, leftCamToWorld.m32, leftCamToWorld.m33, leftCamToWorld.m34, leftCamToWorld.m41, leftCamToWorld.m42, leftCamToWorld.m43, leftCamToWorld.m44
+ );
+ dbg::trace(L"Right CamToWorld %i %i %i %i, %i %i %i %i, %i %i %i %i, %i %i %i %i ",
+ rightCamToWorld.m11, rightCamToWorld.m12, rightCamToWorld.m13, rightCamToWorld.m14, rightCamToWorld.m21, rightCamToWorld.m22, rightCamToWorld.m23, rightCamToWorld.m24,
+ rightCamToWorld.m31, rightCamToWorld.m32, rightCamToWorld.m33, rightCamToWorld.m34, rightCamToWorld.m41, rightCamToWorld.m42, rightCamToWorld.m43, rightCamToWorld.m44
+ );
+
+ /*auto leftCamToOrigin = GetCamToOrigin(leftFrame);
+ auto rightCamToOrigin = GetCamToOrigin(rightFrame);
+
+
+
+ dbg::trace(L"Left CamToOrigin %s %i %i %i, %i %i %i %i, %i %i %i %i, %i %i %i %i ",
+ leftCamToOrigin.m11, leftCamToOrigin.m12, leftCamToOrigin.m13, leftCamToOrigin.m14, leftCamToOrigin.m21, leftCamToOrigin.m22, leftCamToOrigin.m23, leftCamToOrigin.m24,
+ leftCamToOrigin.m31, leftCamToOrigin.m32, leftCamToOrigin.m33, leftCamToOrigin.m34, leftCamToOrigin.m41, leftCamToOrigin.m42, leftCamToOrigin.m43, leftCamToOrigin.m44
+ );
+ dbg::trace(L"Right CamToOrigin %i %i %i %i, %i %i %i %i, %i %i %i %i, %i %i %i %i ",
+ rightCamToOrigin.m11, rightCamToOrigin.m12, rightCamToOrigin.m13, rightCamToOrigin.m14, rightCamToOrigin.m21, rightCamToOrigin.m22, rightCamToOrigin.m23, rightCamToOrigin.m24,
+ rightCamToOrigin.m31, rightCamToOrigin.m32, rightCamToOrigin.m33, rightCamToOrigin.m34, rightCamToOrigin.m41, rightCamToOrigin.m42, rightCamToOrigin.m43, rightCamToOrigin.m44
+ );
+ */
+ if (connected) {
+
+ Publish("/hololens", commonTime, leftFrame, imageBufferAsPlatformArrayLeft, rightFrame, imageBufferAsPlatformArrayRight);
+ PublishHello("/listener", "Hello from the HoloLens.");
+ pubCount++;
+
+ }
+ }
+ catch (Exception^ e) {
+
+ dbg::trace(L"StreamAsync: Exception.");
+ return streamTask;
+ }
+
+ //NULL VALUES RECEIVED. Cameras need to be calibrated, and then calibration values, ie, core camera intrinsics, sent back to the HoloLens (How?)
+ //This includes: Camera Matrix K with parameters fx, fy, cx, cy. 2 degrees of radial distortion and a tangential distortion.
+
+
+ /*auto leftRadialDistortion = leftFrame->CoreCameraIntrinsics->RadialDistortion;
+ auto leftTangentialDistortian = leftFrame->CoreCameraIntrinsics->TangentialDistortion;
+
+ dbg::trace(L"radial distortian: %i %i %i tangential distortian: %i %i, focal length: %i %i, principal point: %i %i, image height: %i, width: %i",
+ leftRadialDistortion.x, leftRadialDistortion.y, leftRadialDistortion.z,
+ leftTangentialDistortian.x, leftTangentialDistortian.y,
+ leftFrame->CoreCameraIntrinsics->FocalLength.x, leftFrame->CoreCameraIntrinsics->FocalLength.y,
+ leftFrame->CoreCameraIntrinsics->PrincipalPoint.x, leftFrame->CoreCameraIntrinsics->PrincipalPoint.y,
+ leftFrame->CoreCameraIntrinsics->ImageHeight, leftFrame->CoreCameraIntrinsics->ImageWidth);
+ */
+
+ /*
+ auto leftUndistProjTransform = leftFrame->CoreCameraIntrinsics->UndistortedProjectionTransform;
+ dbg::trace(L"Left Camera Undistorted Projection Transform %i %i %i %i, %i %i %i %i, %i %i %i %i, %i %i %i %i ",
+ leftUndistProjTransform.m11, leftUndistProjTransform.m12, leftUndistProjTransform.m13, leftUndistProjTransform.m14, leftUndistProjTransform.m21, leftUndistProjTransform.m22, leftUndistProjTransform.m23, leftUndistProjTransform.m24,
+ leftUndistProjTransform.m31, leftUndistProjTransform.m32, leftUndistProjTransform.m33, leftUndistProjTransform.m34, leftUndistProjTransform.m41, leftUndistProjTransform.m42, leftUndistProjTransform.m43, leftUndistProjTransform.m44
+ );
+
+
+
+ //DEBUGGING LOOP FOR ARRAY
+ auto printer = false;
+ int i = 307200 - 5;
+ int j = i + 5;
+ while (!printer) {
+
+ dbg::trace(
+ L"BackgroundTask::StreamAsync: data index %i value %i ",
+ i,
+ imageBufferAsPlatformArrayLeft->Value[i]);
+ i = i + 1;
+ if (i >= j) {
+ printer = true;
+ }
+ }
+ //END DEBUGGING LOOP FOR ARRAY
+
+ /*
+ Platform::Array^ imageBufferLeft = sensorFrameToImageBuffer(leftFrame);
+ //int x = imageBufferLeft->Length - 150;
+
+ if (leftFrame != nullptr && rightFrame != nullptr) {
+ dbg::trace(L" %i timestamp, array of length %i, value %i at index %i ",
+ count,
+ leftFrame->Timestamp.UniversalTime,
+ imageBufferLeft->Length,
+ imageBufferLeft->Value[imageBufferLeft->Length - 50],
+ imageBufferLeft->Length - 50 );
+ }
+ else {
+ dbg::trace(L"Waiting for frames to not be null");
+ }
+ */
+ return streamTask;
+
+
+ }
+}
+
+Windows::Foundation::Numerics::float4x4 BackgroundTask::GetAbsoluteCameraPose(HoloLensForCV::SensorFrame^ frame) {
+
+ Windows::Foundation::Numerics::float4x4 interm;
+
+ memset( &interm , 0, sizeof(interm));
+
+ interm.m11 = 1; interm.m22 = 1; interm.m33 = 1; interm.m44 = 1;
+ Windows::Foundation::Numerics::float4x4 InvFrameToOrigin;
+ Windows::Foundation::Numerics::invert(frame->FrameToOrigin, &InvFrameToOrigin);
+
+ auto pose = interm * frame->CameraViewTransform*InvFrameToOrigin;
+ return pose;
+
+}
+
+Windows::Foundation::Numerics::float4x4 BackgroundTask::GetCamToWorld(Windows::Foundation::Numerics::float4x4 pose) {
+
+ Windows::Foundation::Numerics::float4x4 output;
+ Windows::Foundation::Numerics::invert(pose, &output);
+ return output;
+}
+
+Windows::Foundation::Numerics::float4x4 BackgroundTask::GetCamToOrigin(HoloLensForCV::SensorFrame^ frame) {
+
+ Windows::Foundation::Numerics::float4x4 camToRef;
+ Windows::Foundation::Numerics::float4x4 camToOrigin;
+ if (!Windows::Foundation::Numerics::invert(frame->CameraViewTransform, &camToRef)) {
+
+ dbg::trace(L"Could not invert!");
+ memset(&camToOrigin, 0, sizeof(camToOrigin));
+
+ }
+ else {
+
+ camToOrigin = camToRef * frame->FrameToOrigin;
+ //CAMERA EXTRINSICS
+ Eigen::Vector3f camPinhole(camToOrigin.m41, camToOrigin.m42, camToOrigin.m43);
+ Eigen::Matrix3f camToOriginR;
+
+ camToOriginR(0, 0) = camToOrigin.m11;
+ camToOriginR(0, 1) = camToOrigin.m12;
+ camToOriginR(0, 2) = camToOrigin.m13;
+ camToOriginR(1, 0) = camToOrigin.m21;
+ camToOriginR(1, 1) = camToOrigin.m22;
+ camToOriginR(1, 2) = camToOrigin.m23;
+ camToOriginR(2, 0) = camToOrigin.m31;
+ camToOriginR(2, 1) = camToOrigin.m32;
+ camToOriginR(2, 2) = camToOrigin.m33;
+ //4x4 camToOrigin transform not affine. Projection warping(?, I'm not solid on the math behind this one) parameters observed in fourth row.
+
+ }
+ return camToOrigin;
+
+}
+
+
+std::pair BackgroundTask::sensorFrameToImageBufferPair(HoloLensForCV::SensorFrame^ sensorFrame) {
+
+ Windows::Graphics::Imaging::SoftwareBitmap^ bitmap;
+ Windows::Graphics::Imaging::BitmapBuffer^ bitmapBuffer;
+ Windows::Foundation::IMemoryBufferReference^ bitmapBufferReference;
+
+ int32_t imageWidth = 0;
+ int32_t imageHeight = 0;
+ int32_t pixelStride = 1;
+ int32_t rowStride = 0;
+
+ Platform::Array^ imageBufferAsPlatformArray;
+ int32_t imageBufferSize = 0;
+
+ {
+#if DBG_ENABLE_INFORMATIONAL_LOGGING
+ dbg::TimerGuard timerGuard(
+ L"AppMain::sensorFrameToImageBuffer: buffer preparation",
+ 4.0 /* minimum_time_elapsed_in_milliseconds */);
+#endif /* DBG_ENABLE_INFORMATIONAL_LOGGING */
+
+ bitmap =
+ sensorFrame->SoftwareBitmap;
+
+ imageWidth = bitmap->PixelWidth;
+ imageHeight = bitmap->PixelHeight;
+
+ bitmapBuffer =
+ bitmap->LockBuffer(
+ Windows::Graphics::Imaging::BitmapBufferAccessMode::Read);
+
+ bitmapBufferReference =
+ bitmapBuffer->CreateReference();
+
+ uint32_t bitmapBufferDataSize = 0;
+
+ uint8_t* bitmapBufferData =
+ Io::GetTypedPointerToMemoryBuffer(
+ bitmapBufferReference,
+ bitmapBufferDataSize);
+
+ switch (bitmap->BitmapPixelFormat)
+ {
+ case Windows::Graphics::Imaging::BitmapPixelFormat::Bgra8:
+ pixelStride = 4;
+ break;
+
+ case Windows::Graphics::Imaging::BitmapPixelFormat::Gray16:
+ pixelStride = 2;
+ break;
+
+ case Windows::Graphics::Imaging::BitmapPixelFormat::Gray8:
+ pixelStride = 1;
+ break;
+
+ default:
+#if DBG_ENABLE_INFORMATIONAL_LOGGING
+ dbg::trace(
+ L"AppMain::sensorFrameToImageBuffer: unrecognized bitmap pixel format, assuming 1 byte per pixel");
+#endif /* DBG_ENABLE_INFORMATIONAL_LOGGING */
+
+ break;
+ }
+
+ rowStride =
+ imageWidth * pixelStride;
+
+ imageBufferSize =
+ imageHeight * rowStride;
+
+ ASSERT(
+ imageBufferSize == (int32_t)bitmapBufferDataSize);
+
+
+ std::pair outPair = std::make_pair(bitmapBufferData, imageBufferSize);
+
+ /*imageBufferAsPlatformArray =
+ ref new Platform::Array(
+ bitmapBufferData,
+ imageBufferSize);*/
+ return outPair;
+ }
+}
+
+//This does not work; I don't know why. Probably some pointers related thing I'm not able to comprehend
+//Hence a slightly messier route used, which involved std::pair objects.
+
+Platform::Array^ BackgroundTask::sensorFrameToImageBuffer(HoloLensForCV::SensorFrame^ sensorFrame) {
+
+ Windows::Graphics::Imaging::SoftwareBitmap^ bitmap;
+ Windows::Graphics::Imaging::BitmapBuffer^ bitmapBuffer;
+ Windows::Foundation::IMemoryBufferReference^ bitmapBufferReference;
+
+ int32_t imageWidth = 0;
+ int32_t imageHeight = 0;
+ int32_t pixelStride = 1;
+ int32_t rowStride = 0;
+
+ Platform::Array^ imageBufferAsPlatformArray;
+ int32_t imageBufferSize = 0;
+
+ {
+#if DBG_ENABLE_INFORMATIONAL_LOGGING
+ dbg::TimerGuard timerGuard(
+ L"AppMain::sensorFrameToImageBuffer: buffer preparation",
+ 4.0 /* minimum_time_elapsed_in_milliseconds */);
+#endif /* DBG_ENABLE_INFORMATIONAL_LOGGING */
+
+ bitmap =
+ sensorFrame->SoftwareBitmap;
+
+ imageWidth = bitmap->PixelWidth;
+ imageHeight = bitmap->PixelHeight;
+
+ bitmapBuffer =
+ bitmap->LockBuffer(
+ Windows::Graphics::Imaging::BitmapBufferAccessMode::Read);
+
+ bitmapBufferReference =
+ bitmapBuffer->CreateReference();
+
+ uint32_t bitmapBufferDataSize = 0;
+
+ uint8_t* bitmapBufferData =
+ Io::GetTypedPointerToMemoryBuffer(
+ bitmapBufferReference,
+ bitmapBufferDataSize);
+
+ switch (bitmap->BitmapPixelFormat)
+ {
+ case Windows::Graphics::Imaging::BitmapPixelFormat::Bgra8:
+ pixelStride = 4;
+ break;
+
+ case Windows::Graphics::Imaging::BitmapPixelFormat::Gray16:
+ pixelStride = 2;
+ break;
+
+ case Windows::Graphics::Imaging::BitmapPixelFormat::Gray8:
+ pixelStride = 1;
+ break;
+
+ default:
+#if DBG_ENABLE_INFORMATIONAL_LOGGING
+ dbg::trace(
+ L"AppMain::sensorFrameToImageBuffer: unrecognized bitmap pixel format, assuming 1 byte per pixel");
+#endif /* DBG_ENABLE_INFORMATIONAL_LOGGING */
+
+ break;
+ }
+
+ rowStride =
+ imageWidth * pixelStride;
+
+ imageBufferSize =
+ imageHeight * rowStride;
+
+ ASSERT(
+ imageBufferSize == (int32_t)bitmapBufferDataSize);
+
+ imageBufferAsPlatformArray =
+ ref new Platform::Array(
+ bitmapBufferData,
+ imageBufferSize);
+
+ return imageBufferAsPlatformArray;
+ }
+}
+
+void BackgroundTask::OnCanceled(IBackgroundTaskInstance^ taskInstance, BackgroundTaskCancellationReason reason) {
+ CancelRequested = true;
+ CancelReason = reason;
+}
+
+ void BackgroundTask::SetBusy(bool value) {
+ busy = value;
+ }
+
+ void BackgroundTask::Connect() {
+ SetBusy(true);
+ ConnectAsync().then([this]() {
+
+ SetBusy(false);
+ connected = true;
+
+ Advertise("/listener", "std_msgs/String");
+ Advertise("/hololens", "project/HoloLensStereo");
+ PublishHello("/listener", "Hello from the HoloLens.");
+
+ });
+ }
+
+
+ task BackgroundTask::ConnectAsync() {
+ Uri^ server = ref new Uri(
+ "ws://141.3.81.144:9090/"
+ );
+ if (!server)
+ {
+ dbg::trace(L"Uri false");
+ return task_from_result();
+ }
+
+ messageWebSocket = ref new MessageWebSocket();
+ messageWebSocket->Control->MessageType = SocketMessageType::Utf8;
+
+ /* won't be receiving messages. refer to the Websockets section in Windows universal samples for UWP apps. Very comprehensive.
+ //Could be useful for modelling communication with CV analyser as ROS services instead of ROS messages. This should be possible.
+
+ messageWebSocket->MessageReceived +=
+ ref new TypedEventHandler<
+ MessageWebSocket^,
+ MessageWebSocketMessageReceivedEventArgs^>(this, &MessageReceived);
+ messageWebSocket->Closed += ref new TypedEventHandler(this, &OnClosed);
+ */
+
+ return create_task(messageWebSocket->ConnectAsync(server))
+ .then([this](task previousTask)
+ {
+ try
+ {
+ // Reraise any exception that occurred in the task.
+ previousTask.get();
+ dbg::trace(L"web socket connected.");
+ }
+ catch (Exception^ ex)
+ {
+ // Error happened during connect operation.
+ delete messageWebSocket;
+ messageWebSocket = nullptr;
+ dbg::trace(L"ConnectAsync: Error during connection operation.");
+ return;
+ }
+
+ // /* REMOVE
+ // The default DataWriter encoding is Utf8.
+ dbg::trace(L"ConnectAsync: Connected.");
+ messageWriter = ref new DataWriter(messageWebSocket->OutputStream);
+ dbg::trace(L"ConnectAsync: DataWriter initialized.");
+ });
+
+
+ }
+
+
+ void BackgroundTask::Send(Platform::String^ message) {
+ SetBusy(true);
+
+ SendAsync(message).then([this]() {
+ SetBusy(false);
+ });
+
+ }
+
+ task BackgroundTask::SendAsync(Platform::String^ message) {
+
+ auto a = messageWriter->WriteString(message);
+ dbg::trace(L"SendAsync: %i string length, in bytes. ", a);
+ return concurrency::create_task(messageWriter->StoreAsync()).then(
+ [this](task previousTask) {
+ previousTask.get();
+
+ dbg::trace(L"Send Complete");
+ });
+ }
+
+ void BackgroundTask::Send(Platform::Array^ message) {
+
+ SetBusy(true);
+ SendAsync(message).then([this]() {
+ SetBusy(false);
+ });
+
+ }
+
+ task BackgroundTask::SendAsync(Platform::Array^ message) {
+
+ messageWriter->WriteBytes(message->Value);
+ //dbg::trace(L"SendAsync: %i array length, in bytes. ", message);
+ return concurrency::create_task(messageWriter->StoreAsync()).then(
+ [this](task previousTask) {
+ previousTask.get();
+
+ dbg::trace(L"Send Complete");
+ });
+
+ }
+
+ void BackgroundTask::Send(DateTime timestamp) {
+
+ SetBusy(true);
+ SendAsync(timestamp).then([this]() {
+ SetBusy(false);
+ });
+ }
+
+ task BackgroundTask::SendAsync(DateTime timestamp) {
+ messageWriter->WriteDateTime(timestamp);
+
+ return concurrency::create_task(messageWriter->StoreAsync()).then(
+ [this](task previousTask) {
+
+ previousTask.get();
+ dbg::trace(L"Send Complete");
+
+ });
+
+ }
+
+
+ void BackgroundTask::Advertise(Platform::String^ topic, Platform::String^ messageType) {
+
+
+ JsonObject^ jsonObject = ref new JsonObject();
+ jsonObject->Insert("op", JsonValue::CreateStringValue("advertise"));
+ jsonObject->Insert("topic", JsonValue::CreateStringValue(topic));
+ jsonObject->Insert("type", JsonValue::CreateStringValue(messageType));
+
+ String^ output = jsonObject->Stringify();
+
+ dbg::trace(L"Advertise: %s",
+ output->Data()
+ );
+ Send(output);
+ }
+
+ void BackgroundTask::Publish(Platform::String^ topic, Windows::Foundation::DateTime commonTimestamp, HoloLensForCV::SensorFrame^ leftFrame, Platform::Array^ leftData, HoloLensForCV::SensorFrame^ rightFrame, Platform::Array^ rightData) {
+
+ JsonObject^ jsonObject = ref new JsonObject();
+
+
+ dbg::trace(L"bitmap pixel format %i", leftFrame->SoftwareBitmap->BitmapPixelFormat);
+
+ //op and topic
+ jsonObject->Insert("op", JsonValue::CreateStringValue("publish"));
+ jsonObject->Insert("topic", JsonValue::CreateStringValue(topic));
+
+ JsonObject^ msg = ref new JsonObject();
+ msg->Insert("greeting", JsonValue::CreateStringValue("Hello project."));
+ msg->Insert("height" ,JsonValue::CreateNumberValue(leftFrame->SensorStreamingCameraIntrinsics->ImageHeight));
+ msg->Insert("width", JsonValue::CreateNumberValue(leftFrame->SensorStreamingCameraIntrinsics->ImageWidth));
+
+ //Image buffer data as base64 encoded string.
+ Platform::String^ leftString = StringFromstd(base64_encode(leftData->Data, leftData->Length));
+
+ //CryptographicBuffer::EncodeToBase64String(CryptographicBuffer::CreateFromByteArray(leftData)); UWP JSON encrypting. Can be useful if data being received by another UWP app.
+ Platform::String^ rightString = StringFromstd(base64_encode(rightData->Data, rightData->Length));
+ //CryptographicBuffer::EncodeToBase64String(CryptographicBuffer::CreateFromByteArray(rightData));
+
+ msg->Insert("left64", JsonValue::CreateStringValue(leftString));
+ msg->Insert("right64", JsonValue::CreateStringValue(rightString));
+
+ auto leftCamToOrigin = GetCamToOrigin(leftFrame);
+ auto rightCamToOrigin = GetCamToOrigin(rightFrame);
+
+ Eigen::Vector3f leftcamPinhole(leftCamToOrigin.m41, leftCamToOrigin.m42, leftCamToOrigin.m43);
+ Eigen::Vector3f rightcamPinhole(rightCamToOrigin.m41, rightCamToOrigin.m42, rightCamToOrigin.m43);
+
+ Eigen::Matrix3f leftCamToOriginR;
+ Eigen::Matrix3f rightCamToOriginR;
+
+
+ leftCamToOriginR(0, 0) = leftCamToOrigin.m11;
+ leftCamToOriginR(0, 1) = leftCamToOrigin.m12;
+ leftCamToOriginR(0, 2) = leftCamToOrigin.m13;
+ leftCamToOriginR(1, 0) = leftCamToOrigin.m21;
+ leftCamToOriginR(1, 1) = leftCamToOrigin.m22;
+ leftCamToOriginR(1, 2) = leftCamToOrigin.m23;
+ leftCamToOriginR(2, 0) = leftCamToOrigin.m31;
+ leftCamToOriginR(2, 1) = leftCamToOrigin.m32;
+ leftCamToOriginR(2, 2) = leftCamToOrigin.m33;
+ rightCamToOriginR(0, 0) = rightCamToOrigin.m11;
+ rightCamToOriginR(0, 1) = rightCamToOrigin.m12;
+ rightCamToOriginR(0, 2) = rightCamToOrigin.m13;
+ rightCamToOriginR(1, 0) = rightCamToOrigin.m21;
+ rightCamToOriginR(1, 1) = rightCamToOrigin.m22;
+ rightCamToOriginR(1, 2) = rightCamToOrigin.m23;
+ rightCamToOriginR(2, 0) = rightCamToOrigin.m31;
+ rightCamToOriginR(2, 1) = rightCamToOrigin.m32;
+ rightCamToOriginR(2, 2) = rightCamToOrigin.m33;
+
+ Eigen::Quaternionf leftRotQuat(leftCamToOriginR);
+ leftRotQuat.normalize();
+ Eigen::Quaternionf rightRotQuat(rightCamToOriginR);
+ rightRotQuat.normalize();
+
+
+ JsonObject^ leftTransform = ref new JsonObject();
+ JsonObject^ leftTranslation = ref new JsonObject();
+ leftTranslation->Insert("x", JsonValue::CreateNumberValue(leftcamPinhole(0) ));
+ leftTranslation->Insert("y", JsonValue::CreateNumberValue(leftcamPinhole(1)));
+ leftTranslation->Insert("z", JsonValue::CreateNumberValue(leftcamPinhole(2)));
+ leftTransform->Insert("translation", JsonValue::Parse( leftTranslation->Stringify() ));
+ JsonObject^ leftRotation = ref new JsonObject();
+ leftRotation->Insert("x", JsonValue::CreateNumberValue(leftRotQuat.x()));
+ leftRotation->Insert("y", JsonValue::CreateNumberValue(leftRotQuat.y()));
+ leftRotation->Insert("z", JsonValue::CreateNumberValue(leftRotQuat.z()));
+ leftRotation->Insert("w", JsonValue::CreateNumberValue(leftRotQuat.w()));
+ leftTransform->Insert("rotation", JsonValue::Parse(leftRotation->Stringify()));
+ msg->Insert("leftCamToWorld", JsonValue::Parse(leftTransform->Stringify()));
+
+ JsonObject^ rightTransform = ref new JsonObject();
+ JsonObject^ rightTranslation = ref new JsonObject();
+ rightTranslation->Insert("x", JsonValue::CreateNumberValue(rightcamPinhole(0)));
+ rightTranslation->Insert("y", JsonValue::CreateNumberValue(rightcamPinhole(1)));
+ rightTranslation->Insert("z", JsonValue::CreateNumberValue(rightcamPinhole(2)));
+ rightTransform->Insert("translation", JsonValue::Parse(rightTranslation->Stringify()));
+ JsonObject^ rightRotation = ref new JsonObject();
+ rightRotation->Insert("x", JsonValue::CreateNumberValue(rightRotQuat.x()));
+ rightRotation->Insert("y", JsonValue::CreateNumberValue(rightRotQuat.y()));
+ rightRotation->Insert("z", JsonValue::CreateNumberValue(rightRotQuat.z()));
+ rightRotation->Insert("w", JsonValue::CreateNumberValue(rightRotQuat.w()));
+ rightTransform->Insert("rotation", JsonValue::Parse(rightRotation->Stringify()));
+ msg->Insert("rightCamToWorld", JsonValue::Parse(rightTransform->Stringify()));
+
+ //Final Json publish
+ jsonObject->Insert("msg", JsonValue::Parse( msg->Stringify() ));
+ Send(jsonObject->Stringify());
+
+ }
+
+
+ void BackgroundTask::PublishHello(Platform::String^ topic, Platform::String^ message) {
+
+ JsonObject^ jsonObject = ref new JsonObject();
+ jsonObject->Insert("op", JsonValue::CreateStringValue("publish"));
+ jsonObject->Insert("topic", JsonValue::CreateStringValue(topic));
+
+ JsonObject^ dataX = ref new JsonObject();
+ dataX->Insert("data", JsonValue::CreateStringValue(message));
+
+
+ jsonObject->Insert("msg", JsonValue::Parse(dataX->Stringify()));
+ dbg::trace(L"Publish Test Pair # %i", pubCount);
+
+ Send(jsonObject->Stringify());
+
+ }
+
+ /*
+ void BackgroundTask::Publish(Platform::String^ topic, Platform::String^ message) {
+ //std::string call = "\"op\":\"publish\", \"topic\":\"" + topic + "\", \"msg\":" + message + "\"";
+ //call = "{" + call + "}";
+
+ JsonObject^ jsonObject = ref new JsonObject();
+ jsonObject->Insert("op", JsonValue::CreateStringValue("publish"));
+ jsonObject->Insert("topic", JsonValue::CreateStringValue(topic));
+
+ Platform::String^ msg = "{data:'" + message + "'}";
+
+ bool dataAsString;
+
+ dataAsString = false;
+
+ Platform::String^ data;
+
+ if (!dataAsString) {
+
+ //JsonObject^ dataX = ref new JsonObject();
+ //dataX->Insert("data", JsonValue::CreateStringValue(message));
+
+ dbg::trace(L"Publish: Data %s , %s", message->Data(),
+ msg->Data()
+ //data->Stringify()->Data()
+ );
+
+ jsonObject->Insert("msg", JsonValue::CreateStringValue(
+ msg
+ // dataX->Stringify()
+ ));
+
+ //data = dataX->Stringify();
+ data = msg;
+
+ }
+ else if (dataAsString) {
+
+ data = "{\"data\":\"" + message + "\"}";
+ jsonObject->Insert("msg", JsonValue::CreateStringValue(data->ToString()));
+
+ }
+
+ auto output = jsonObject->Stringify(); // Connected. Publish: Expected a JSON object of type std_msgs/string but received a
+ // (with data as string) {"op":"publish","topic":"/listener","msg":"{\"data\":\"Hello from the HoloLens\"}"} || {"op":"publish","topic":"/listener","msg":"[\"data\":\"Hello from the HoloLens\"]"}
+ // (with data as jsonobject) {"op":"publish","topic":"/listener","msg":"{\"data\":\"Hello from the HoloLens\"}"}
+
+ auto outputx = "{\r\n" +
+ "\'op\':\'publish\',\r\n" +
+ "\'topic\':\'/listener\',\r\n" +
+ "\'msg\':\'" + data + "\',\r\n" +
+ "}"; ////Connected. Nothing Echoed. Nothing Received. {} 'op' error || [] No Error Message.
+ auto outputy = "{\r\n" +
+ "\"op\":\"publish\",\r\n" +
+ "\"topic\": \"/listener\",\r\n" +
+ "\"msg\":\"" + data + "\",\r\n" +
+ "}";//Connected. Nothing Echoed. Nothing Received. {} 'op' error || [] No Error Message. Did not disconnect the client?
+ auto outputz = "{" +
+ "\"op\":\"publish\"," +
+ "\"topic\":\"/listener\"," +
+ "\"msg\":\"" + data + "\"" +
+ "}";//Connected. Nothing Echoed. Nothing Received. {} 'op' error || [] No Error Message.
+ auto outputzz = "{" +
+ "\'op\':\'publish\'," +
+ "\'topic\':\'/listener\'," +
+ "\'msg\':\'" + data + "\'" +
+ "}"; //Connected. Nothing Echoed. Nothing Received. No Error Message.
+
+ auto outputzzz = "{op:'publish',topic:'/listener',msg:" + msg + "}";
+
+ //stringify {"op":"publish","topic":"/listener","msg":"{ \"data \" : \" Hello from the HoloLens \" } "}
+ //tostring {"op":"publish","topic":"/listener","msg":"{ \"data \" : \" Hello from the HoloLens \" } "}
+
+ dbg::trace(L"Publish: output stringify %s, x %s, y %s , z %s, zz %s zzz %s", output->Data(), outputx->Data(), outputy->Data() , outputz->Data(), outputzz->Data(), outputzzz->Data());
+ //dbg::trace(L"Publish: output tostring %s", jsonObject->ToString());
+ Send(outputzzz);
+
+
+ /*
+ JsonObject^ jsonObject = ref new JsonObject();
+ auto parsed = JsonObject::TryParse(call, &jsonObject);
+ dbg::trace(L"Publish: TryParse(call, &jsonObject) %s", parsed.ToString());
+ if (parsed) {
+
+ }
+ */
+ //dbg::trace(L"Publish: %s", );
+ //Send(call);
+ //}
+
+
+
+ void BackgroundTask::PublishArray(Platform::String^ topic, Platform::Array^ inputArray) {
+ JsonObject^ jsonObject = ref new JsonObject();
+ JsonObject^ data = ref new JsonObject();
+ auto outputArray = inputArray->Value;
+ String^ msg = ref new String();
+
+ unsigned int i = 0;
+ while (i < sizeof(outputArray)) {
+ if (i != 0 && i != ( sizeof(outputArray)-1 )) {
+ msg += ", ";
+ }
+ msg += outputArray[i];
+ i++;
+ }
+
+ msg = "[ " + msg + " ]";
+ data->Insert("data", JsonValue::Parse(msg) );
+
+ jsonObject->Insert("op", JsonValue::CreateStringValue("publish"));
+ jsonObject->Insert("topic", JsonValue::CreateStringValue(topic));
+ jsonObject->Insert("msg",
+
+ JsonValue::CreateStringValue( data->Stringify() ) // ? ? ? ? ? ? ? ?
+ );
+
+ auto output = jsonObject->Stringify();
+
+ dbg::trace(L"sending array");
+ Send(output);
+
+
+ }
+
+
+ /*
+ void BackgroundTask::MessageReceived(MessageWebSocket^ sender, MessageWebSocketMessageReceivedEventArgs^ args)
+ {
+ // Dispatch the event to the UI thread so we can update UI.
+ //Dispatcher->RunAsync(CoreDispatcherPriority::Normal, ref new DispatchedHandler([this, args]()
+ //{
+ dbg::trace(L"Message Received; Type: %s", args->MessageType.ToString());
+ DataReader^ reader = args->GetDataReader();
+ reader->UnicodeEncoding = UnicodeEncoding::Utf8;
+ try
+ {
+
+ ///* REMOVE
+
+ String^ read = reader->ReadString(reader->UnconsumedBufferLength);
+ //AppendOutputLine(read);
+ }
+ catch (Exception^ ex)
+ {
+ // AppendOutputLine(BuildWebSocketError(ex));
+ //AppendOutputLine(ex->Message);
+ dbg::trace(L"MessageReceived: Error.");
+ }
+ ///* REMOVE
+ delete reader;
+ //}));
+ }
+ */
+
+ void BackgroundTask::OnDisconnect() {
+
+ SetBusy(true);
+ CloseSocket();
+ SetBusy(false);
+
+ }
+
+ void BackgroundTask::OnClosed(IWebSocket^ sender, WebSocketClosedEventArgs^ args)
+ {
+ if (messageWebSocket == sender)
+ {
+ CloseSocket();
+ }
+ }
+
+ void BackgroundTask::CloseSocket() {
+ if (messageWriter != nullptr) {
+ messageWriter->DetachStream();
+ delete messageWriter;
+ messageWriter = nullptr;
+
+ }
+
+ if (messageWebSocket != nullptr) {
+ messageWebSocket->Close(1000, "Closed.");
+ messageWebSocket = nullptr;
+ }
+ }
+
+ std::string BackgroundTask::base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
+ std::string ret;
+ int i = 0;
+ int j = 0;
+ unsigned char char_array_3[3];
+ unsigned char char_array_4[4];
+
+ while (in_len--) {
+ char_array_3[i++] = *(bytes_to_encode++);
+ if (i == 3) {
+ char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
+ char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
+ char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
+ char_array_4[3] = char_array_3[2] & 0x3f;
+
+ for (i = 0; (i < 4); i++)
+ ret += base64_chars[char_array_4[i]];
+ i = 0;
+ }
+ }
+
+ if (i)
+ {
+ for (j = i; j < 3; j++)
+ char_array_3[j] = '\0';
+
+ char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
+ char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
+ char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
+
+ for (j = 0; (j < i + 1); j++)
+ ret += base64_chars[char_array_4[j]];
+
+ while ((i++ < 3))
+ ret += '=';
+
+ }
+
+ return ret;
+
+ }
+
+ std::string BackgroundTask::base64_decode(std::string const& encoded_string) {
+ size_t in_len = encoded_string.size();
+ int i = 0;
+ int j = 0;
+ int in_ = 0;
+ unsigned char char_array_4[4], char_array_3[3];
+ std::string ret;
+
+ while (in_len-- && (encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
+ char_array_4[i++] = encoded_string[in_]; in_++;
+ if (i == 4) {
+ for (i = 0; i < 4; i++)
+ char_array_4[i] = base64_chars.find(char_array_4[i]) & 0xff;
+
+ char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
+ char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
+ char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
+
+ for (i = 0; (i < 3); i++)
+ ret += char_array_3[i];
+ i = 0;
+ }
+ }
+
+ if (i) {
+ for (j = 0; j < i; j++)
+ char_array_4[j] = base64_chars.find(char_array_4[j]) & 0xff;
+
+ char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
+ char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
+
+ for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
+ }
+
+ return ret;
+ }
+
+ String^ BackgroundTask::StringFromstd(std::string input)
+ {
+ std::wstring wid_str = std::wstring(input.begin(), input.end());
+ const wchar_t* w_char = wid_str.c_str();
+ Platform::String^ p_string = ref new Platform::String(w_char);
+ return p_string;
+
+ }
+ String^ BackgroundTask::StringFromAscIIChars(char* chars)
+ {
+ size_t newsize = strlen(chars) + 1;
+ wchar_t * wcstring = new wchar_t[newsize];
+ size_t convertedChars = 0;
+ mbstowcs_s(&convertedChars, wcstring, newsize, chars, _TRUNCATE);
+ String^ str = ref new Platform::String(wcstring);
+ delete[] wcstring;
+ return str;
+ }/*
+ Platform::String^ BackgroundTask::base64_encodep(unsigned char const* bytes_to_encode, unsigned int in_len) {
+ Platform::String^ ret;
+ int i = 0;
+ int j = 0;
+ unsigned char char_array_3[3];
+ unsigned char char_array_4[4];
+
+ while (in_len--) {
+ char_array_3[i++] = *(bytes_to_encode++);
+ if (i == 3) {
+ char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
+ char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
+ char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
+ char_array_4[3] = char_array_3[2] & 0x3f;
+
+ for (i = 0; (i < 4); i++)
+ ret += &base64_charsp->Data.[char_array_4[i]];
+
+ i = 0;
+ }
+ }
+
+ if (i)
+ {
+ for (j = i; j < 3; j++)
+ char_array_3[j] = '\0';
+
+ char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
+ char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
+ char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
+
+ for (j = 0; (j < i + 1); j++)
+ ret += &base64_charsp->Data[char_array_4[j]];
+
+ while ((i++ < 3))
+ ret += '=';
+
+ }
+
+ return ret;
+
+ }
+
+ Platform::String^ BackgroundTask::base64_decodep(std::string const& encoded_string) { // not needed here
+ size_t in_len = encoded_string.size();
+ int i = 0;
+ int j = 0;
+ int in_ = 0;
+ unsigned char char_array_4[4], char_array_3[3];
+ Platform::String^ ret;
+
+ while (in_len-- && (encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
+ char_array_4[i++] = encoded_string[in_]; in_++;
+ if (i == 4) {
+ for (i = 0; i < 4; i++)
+ char_array_4[i] = base64_chars.find(char_array_4[i]) & 0xff;
+
+ char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
+ char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
+ char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
+
+ for (i = 0; (i < 3); i++)
+ ret += char_array_3[i];
+ i = 0;
+ }
+ }
+
+ if (i) {
+ for (j = 0; j < i; j++)
+ char_array_4[j] = base64_charsp->Data.find(char_array_4[j]) & 0xff;
+
+ char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
+ char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
+
+ for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
+ }
+
+ return ret;
+ }*/
+}
\ No newline at end of file
diff --git a/Tools/Tasks/BackgroundTask.h b/Tools/Tasks/BackgroundTask.h
new file mode 100755
index 0000000..6b1de2e
--- /dev/null
+++ b/Tools/Tasks/BackgroundTask.h
@@ -0,0 +1,114 @@
+#pragma once
+
+#include "pch.h"
+
+using namespace Windows::ApplicationModel::Background;
+using namespace Windows::Storage;
+using namespace Windows::System::Threading;
+using namespace Windows::Foundation;
+
+namespace Tasks
+{
+ [Windows::Foundation::Metadata::WebHostHidden]
+ public ref class BackgroundTask sealed : public IBackgroundTask
+ {
+ public:
+
+ virtual void Run(IBackgroundTaskInstance^ taskInstance);
+ void OnCanceled(IBackgroundTaskInstance^ taskInstance, BackgroundTaskCancellationReason reason);
+ //void OnCompleted(BackgroundTaskRegistration^ task, BackgroundTaskCompletedEventArgs^ args);
+
+ private:
+
+ Platform::Agile TaskDeferral = nullptr;
+ bool keepRunning;
+
+ void StartHoloLensMediaFrameSourceGroup();
+ HoloLensForCV::MediaFrameSourceGroupType _selectedHoloLensMediaFrameSourceGroupType;
+ HoloLensForCV::MediaFrameSourceGroup^ _holoLensMediaFrameSourceGroup;
+ bool _holoLensMediaFrameSourceGroupStarted;
+ HoloLensForCV::SpatialPerception^ _spatialPerception;
+ HoloLensForCV::MultiFrameBuffer^ _multiFrameBuffer;
+
+ Windows::Foundation::IAsyncAction^ RunAsync();
+ concurrency::task StreamAsync();
+ boolean pairingInProgress;
+
+ Windows::ApplicationModel::Background::BackgroundTaskCancellationReason CancelReason = Windows::ApplicationModel::Background::BackgroundTaskCancellationReason::Abort;
+ volatile bool CancelRequested = false;
+
+ Windows::System::Threading::ThreadPoolTimer^ PeriodicTimer = nullptr;
+ unsigned int Progress = 0;
+ Windows::ApplicationModel::Background::IBackgroundTaskInstance^ TaskInstance = nullptr;
+
+
+ Windows::Media::Devices::Core::CameraIntrinsics^ leftCameraIntrinsics;
+ Windows::Media::Devices::Core::CameraIntrinsics^ rightCameraIntrinsics;
+ boolean inProcess;
+ Platform::Array^ sensorFrameToImageBuffer(HoloLensForCV::SensorFrame^ sensorFrame);
+ std::pair BackgroundTask::sensorFrameToImageBufferPair(HoloLensForCV::SensorFrame^ sensorFrame);
+
+ struct HoloLensCameraCalibration
+ {
+ std::wstring SensorName;
+
+ float FocalLengthX;
+ float FocalLengthY;
+
+ float PrincipalPointX;
+ float PrincipalPointY;
+
+ float RadialDistortionX;
+ float RadialDistortionY;
+ float RadialDistortionZ;
+
+ float TangentialDistortionX;
+ float TangentialDistortionY;
+ };
+
+ Windows::Foundation::Numerics::float4x4 GetCamToOrigin(HoloLensForCV::SensorFrame^ frame);
+ Windows::Foundation::Numerics::float4x4 GetAbsoluteCameraPose(HoloLensForCV::SensorFrame^ frame);
+ Windows::Foundation::Numerics::float4x4 GetCamToWorld(Windows::Foundation::Numerics::float4x4 pose);
+
+ //ROS handling
+
+ void Advertise(Platform::String^ topic, Platform::String^ messageType);
+ void PublishHello(Platform::String^ topic, Platform::String^ message);
+ void PublishArray(Platform::String^ topic, Platform::Array^ inputArray);
+
+ void Publish(Platform::String^ topic, Windows::Foundation::DateTime commonTimestamp,
+ HoloLensForCV::SensorFrame^ leftFrame, Platform::Array^ leftData, HoloLensForCV::SensorFrame^ rightFrame, Platform::Array^ rightData);
+
+ //Encoding from C++ base64.hpp Github repo {Insert Link}
+ std::string base64_encode(unsigned char const*, unsigned int len);
+ std::string base64_decode(std::string const& s);
+ //Platform::String^ base64_encodep(unsigned char const* bytes_to_encode, unsigned int in_len);
+ //Platform::String^ base64_decodep(std::string const& encoded_string);
+ Platform::String^ StringFromAscIIChars(char* chars);
+ Platform::String^ StringFromstd(std::string input);
+
+
+ //Websocket handling
+ bool busy;
+ void SetBusy(bool value);
+
+ void Connect();
+ Concurrency::task ConnectAsync();
+
+ void Send(Platform::String^ message); void Send(Platform::Array^ message); void Send(DateTime timestamp); //Publish
+ Concurrency::task SendAsync(Platform::String^ message); Concurrency::task SendAsync(Platform::Array^ message); Concurrency::task SendAsync(DateTime timestamp);
+
+ void OnDisconnect();
+
+ Windows::Networking::Sockets::MessageWebSocket^ messageWebSocket;
+ Windows::Storage::Streams::DataWriter^ messageWriter;
+ //void OnServerCustomValidationRequested(
+ //Windows::Networking::Sockets::MessageWebSocket^ sender,
+ //Windows::Networking::Sockets::WebSocketServerCustomValidationRequestedEventArgs^ args);
+
+ //void MessageReceived(Windows::Networking::Sockets::MessageWebSocket^ sender, Windows::Networking::Sockets::MessageWebSocketMessageReceivedEventArgs^ args);
+ void OnClosed(Windows::Networking::Sockets::IWebSocket^ sender, Windows::Networking::Sockets::WebSocketClosedEventArgs^ args);
+ void CloseSocket();
+
+ };
+}
diff --git a/Tools/Tasks/Tasks.vcxproj b/Tools/Tasks/Tasks.vcxproj
new file mode 100755
index 0000000..3118bb0
--- /dev/null
+++ b/Tools/Tasks/Tasks.vcxproj
@@ -0,0 +1,304 @@
+
+
+
+
+ Debug
+ ARM
+
+
+ Debug
+ ARM64
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ ARM
+
+
+ Release
+ ARM64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ {b4dd17ec-eef8-41fc-8bdc-3c8652db68e1}
+ WindowsRuntimeComponent
+ Tasks
+ en-US
+ 14.0
+ true
+ Windows Store
+ 10.0.17134.0
+ 10.0.10240.0
+ 10.0
+
+
+
+ DynamicLibrary
+ true
+ v141
+
+
+ DynamicLibrary
+ true
+ v141
+
+
+ DynamicLibrary
+ true
+ v141
+
+
+ DynamicLibrary
+ true
+ v141
+
+
+ DynamicLibrary
+ false
+ true
+ v141
+
+
+ DynamicLibrary
+ false
+ true
+ v141
+
+
+ DynamicLibrary
+ false
+ true
+ v141
+
+
+ DynamicLibrary
+ false
+ true
+ v141
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+
+ Use
+ _WINRT_DLL;%(PreprocessorDefinitions)
+ pch.h
+ $(IntDir)pch.pch
+ $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)
+ /bigobj %(AdditionalOptions)
+ 28204
+
+
+ Console
+ false
+
+
+
+
+ Use
+ _WINRT_DLL;NDEBUG;%(PreprocessorDefinitions)
+ pch.h
+ $(IntDir)pch.pch
+ $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)
+ /bigobj %(AdditionalOptions)
+ 28204
+ $(SolutionDir)Shared/Debugging/Include;$(SolutionDir)Shared/Io/Include;$(SolutionDir)Shared/Rendering/Include;$(SolutionDir)Shared/Holographic/Include;$(SolutionDir)Shared/Graphics/Include;$(SolutionDir)packages\Eigen.3.3.3\build\native\include;$(SolutionDir)\..\..\Libraries\cpp-base64\;%(AdditionalIncludeDirectories)
+
+
+ Console
+ false
+
+
+
+
+ Use
+ _WINRT_DLL;%(PreprocessorDefinitions)
+ pch.h
+ $(IntDir)pch.pch
+ $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)
+ /bigobj %(AdditionalOptions)
+ 28204
+
+
+ Console
+ false
+
+
+
+
+ Use
+ _WINRT_DLL;NDEBUG;%(PreprocessorDefinitions)
+ pch.h
+ $(IntDir)pch.pch
+ $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)
+ /bigobj %(AdditionalOptions)
+ 28204
+
+
+ Console
+ false
+
+
+
+
+ Use
+ _WINRT_DLL;%(PreprocessorDefinitions)
+ pch.h
+ $(IntDir)pch.pch
+ $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)
+ /bigobj %(AdditionalOptions)
+ 28204
+
+
+ Console
+ false
+
+
+
+
+ Use
+ _WINRT_DLL;NDEBUG;%(PreprocessorDefinitions)
+ pch.h
+ $(IntDir)pch.pch
+ $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)
+ /bigobj %(AdditionalOptions)
+ 28204
+
+
+ Console
+ false
+
+
+
+
+ Use
+ _WINRT_DLL;%(PreprocessorDefinitions)
+ pch.h
+ $(IntDir)pch.pch
+ $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)
+ /bigobj %(AdditionalOptions)
+ 28204
+
+
+ Console
+ false
+
+
+
+
+ Use
+ _WINRT_DLL;NDEBUG;%(PreprocessorDefinitions)
+ pch.h
+ $(IntDir)pch.pch
+ $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)
+ /bigobj %(AdditionalOptions)
+ 28204
+
+
+ Console
+ false
+
+
+
+
+
+
+
+
+ Create
+ Create
+ Create
+ Create
+ Create
+ Create
+ Create
+ Create
+
+
+
+
+
+ {ad347424-7340-47ce-a979-2c7f2df0eb38}
+
+
+ {208c932d-a71e-4c67-a444-0697e9a4226e}
+
+
+ {6e542043-c5d1-4850-b43e-e9295b640c2b}
+
+
+ {940a6d80-0775-4272-84c9-1585c4757071}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Tools/Tasks/Tasks.vcxproj.filters b/Tools/Tasks/Tasks.vcxproj.filters
new file mode 100755
index 0000000..70e3ba0
--- /dev/null
+++ b/Tools/Tasks/Tasks.vcxproj.filters
@@ -0,0 +1,17 @@
+
+
+
+
+ 5331142e-9a64-41b1-8329-5b4b67b80be6
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tga;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Tools/Tasks/pch.cpp b/Tools/Tasks/pch.cpp
new file mode 100755
index 0000000..bcb5590
--- /dev/null
+++ b/Tools/Tasks/pch.cpp
@@ -0,0 +1 @@
+#include "pch.h"
diff --git a/Tools/Tasks/pch.h b/Tools/Tasks/pch.h
new file mode 100755
index 0000000..a673b83
--- /dev/null
+++ b/Tools/Tasks/pch.h
@@ -0,0 +1,33 @@
+#pragma once
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include